⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 towerview.cs

📁 暑假学习文件希望可以借鉴!文件在修改中!
💻 CS
📖 第 1 页 / 共 2 页
字号:
///TowerView
///汉诺塔演示
///程序实现两个功能:一种自动演示,另一种由用户自行拖放物块
///程序的图片资源由Photoshop CS2 自行制作

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TowerView
{
    public partial class TowerView : Form
    {
        private int blknbr;                                     //物块数

        private bool sltdMovMod;                                //用户选择的物块移动模式
        private byte sltdStkLocMod = 0;                         //用户选择的堆栈位置模式

        private int movCnt;                                     //物快移动时的跟踪计数器
        private Point srcPnt;                                   //用于纪录物块拖拽的原位置

        private static Image[] blkImg = new Image[12];          //接收物块图片
        private static Image[] stkLocModImg = new Image[6];     //代表三栈位置模式的图片
        private static byte[,] stkLocMod = new byte[6, 3];      //三栈在6种位置模式中的信息

        private int[] srcStkRng;                                //移动物块原来所在的栈的序列
        private int[] dstStkRng;                                //移动物块将要到达的栈的序列
        private int[] blkIDRng;                                 //正在移动的物块标号
        private int[] stkTop = new int[3];                      //三个栈的栈顶指针

        private PictureBox[,] twrCtnPbx;                        //二维数组:接收容器中的PictureBox

        private AboutTowerView child;                           //About窗体

        //构造器
        public TowerView()
        {
            InitializeComponent();
        }

        private void TowerView_Load(object sender, EventArgs e)
        {
            child = new AboutTowerView();

            InitializeImage();
            InitializePanel();
            InitializeArgs();
            InitializeLayOut();

            blkComboBox.SelectedIndex = 2;
        }

        //初始化函数
        private static void InitializeImage()
        {
            blkImg[0] = global::TowerView.Properties.Resources._0;
            blkImg[1] = global::TowerView.Properties.Resources._1;
            blkImg[2] = global::TowerView.Properties.Resources._2;
            blkImg[3] = global::TowerView.Properties.Resources._3;
            blkImg[4] = global::TowerView.Properties.Resources._4;
            blkImg[5] = global::TowerView.Properties.Resources._5;
            blkImg[6] = global::TowerView.Properties.Resources._6;
            blkImg[7] = global::TowerView.Properties.Resources._7;
            blkImg[8] = global::TowerView.Properties.Resources._8;
            blkImg[9] = global::TowerView.Properties.Resources._9;
            blkImg[10] = global::TowerView.Properties.Resources._10;
            blkImg[11] = global::TowerView.Properties.Resources._11;

            stkLocModImg[0] = global::TowerView.Properties.Resources._1to2;
            stkLocModImg[1] = global::TowerView.Properties.Resources._1to3;
            stkLocModImg[2] = global::TowerView.Properties.Resources._2to1;
            stkLocModImg[3] = global::TowerView.Properties.Resources._2to3;
            stkLocModImg[4] = global::TowerView.Properties.Resources._3to1;
            stkLocModImg[5] = global::TowerView.Properties.Resources._3to2;

        }

        private static void InitializeArgs()
        {
            stkLocMod[0, 0] = 0;
            stkLocMod[0, 1] = 1;
            stkLocMod[0, 2] = 2;

            stkLocMod[1, 0] = 0;
            stkLocMod[1, 1] = 2;
            stkLocMod[1, 2] = 1;

            stkLocMod[2, 0] = 1;
            stkLocMod[2, 1] = 0;
            stkLocMod[2, 2] = 2;

            stkLocMod[3, 0] = 1;
            stkLocMod[3, 1] = 2;
            stkLocMod[3, 2] = 0;

            stkLocMod[4, 0] = 2;
            stkLocMod[4, 1] = 0;
            stkLocMod[4, 2] = 1;

            stkLocMod[5, 0] = 2;
            stkLocMod[5, 1] = 1;
            stkLocMod[5, 2] = 0;
        }

        private void InitializePanel()
        {
            //初始化pictureBox控件数组
            twrCtnPbx = new PictureBox[12, 3];

            //按行倒序添加
            for (int i = 11; i >= 0; i--)
            {
                for (int j = 0; j < 3; j++)
                {
                    twrCtnPbx[i, j] = new PictureBox();
                    twrPlt.Controls.Add(this.twrCtnPbx[i, j]);

                    twrCtnPbx[i, j].Image = null;
                    twrCtnPbx[i, j].Size = new System.Drawing.Size(200, 30);
                    twrCtnPbx[i, j].SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
                    twrCtnPbx[i, j].Margin = new Padding(0, 0, 0, 0);
                    twrCtnPbx[i, j].BackColor = Color.Transparent;
                    twrCtnPbx[i, j].MouseDown += new MouseEventHandler(Pbx_MouseDown);
                    twrCtnPbx[i, j].DragDrop += new DragEventHandler(Pbx_DragDrop);
                    twrCtnPbx[i, j].DragEnter += new DragEventHandler(Pbx_DragEnter);
                }
            }
        }

        private void InitializeMoveBlock()
        {
            stkTop[stkLocMod[sltdStkLocMod, 0]] = blknbr - 1;
            stkTop[stkLocMod[sltdStkLocMod, 1]] = -1;
            stkTop[stkLocMod[sltdStkLocMod, 2]] = -1;

            movCnt = 0;

            for (int i = 0; i < blknbr; i++)
                for (int j = 0; j < 3; j++)
                {
                    twrCtnPbx[i, j].Image = (j == stkLocMod[sltdStkLocMod, 0] ? blkImg[i] : null);
                    twrCtnPbx[i, j].AllowDrop = sltdMovMod;
                }

            MoveMode.Text = sltdMovMod ? "Please Drag The Blocks!" : "Move Automatically...";
        }

        private void InitializeLayOut()
        {
            MoveTime.Text = "Move Time:     ";
            MoveMode.Text = "";

            SetBlockFigureControl(false);
            SetProcessControl(false, false, false, false);
            SetSpeedControl(false);
            status.Enabled = false;
            timer1.Enabled = false;

            foreach (PictureBox pbx in twrCtnPbx)
                pbx.Image = null;
        }

        private void InitializeBlockOrder(int number, int source, int destination, int bufStkfer,
                                            ref int counter)
        {
            if (number == 1)
            {
                blkIDRng[counter] = GetBlockID(counter + 1) - 1;
                dstStkRng[counter] = destination;
                srcStkRng[counter] = source;

                counter++;

                return;
            }

            InitializeBlockOrder(number - 1, source, bufStkfer, destination, ref counter);
            InitializeBlockOrder(1, source, destination, bufStkfer, ref counter);
            InitializeBlockOrder(number - 1, bufStkfer, destination, source, ref counter);
        }

        private int GetBlockID(int counter)
        {
            int columnImageID;
            for (columnImageID = 1; counter % 2 == 0; columnImageID++, counter >>= 1) ;
            return columnImageID;
        }

        //设置灰显
        private void SetBlockFigureControl(bool flag)
        {
            blkLabel.Enabled = flag;
            blkComboBox.Enabled = flag;
            Excute.Enabled = flag;
            SltSrcDst.Enabled = flag;
        }

        private void SetProcessControl(bool flag1, bool flag2,bool flag3, bool flag4)
        {
            Start.Enabled = flag1;
            Pause.Enabled = flag2;
            Stop.Enabled = flag3;
            Clear.Enabled = flag4;
        }

        private void SetSpeedControl(bool flag)
        {
            speedLabel.Enabled = flag;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -