📄 towerview.cs
字号:
///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 + -