快捷搜索: 王者荣耀 脱发

基于.NET的NPuzzle问题的路径可视化

N_Puzzle_Visual

基于.NET的N-Puzzle问题的路径可视化

一、工具

Winform应用程序(.NET Framework 4.7.2) 语言: C# IDE:VS2022

二、界面设计

1. 控件:

界面由1个winform窗体、16个像素为100*100的显示用button控件、3个功能用button控件构成。

1-16个显示用button控件,分别表示1-16个将牌(编号0~15)。其中0号将牌表示空将牌,设置为不可见。

3个功能用button控件:button_reload、button_start、file_chose。

三、事件与方法

1. winform窗体加载

当打开应用程序时,触发事件 窗体加载(N_Puzzle_Visual_Form_Load)。

首先创建按钮控件数组,分别绑定界面设计中的16个显示用button控件;随后依次获取1~16个显示用button的位置坐标,存放到 二维数组Block_default 中,以便接下来使用坐标进行移动。

2. file_chose_Click

点击按钮(选择路径文件),触发事件 file_chose_Click。

系统弹出文件选择框,用户选择路径文件(.txt),系统读取文件信息,调用 Load_block() 加载乱序将牌的初始排列并展示。

方法 Load_block :

依次取得乱序将牌的排列顺序,按照 二维数组Block_default 中固定的初始坐标,依次将将牌进行重绘,第1个将牌的坐标为 二维数组Block_default 中的第1个坐标,第2个将牌的坐标为 Block_default 中的第2个坐标,以此类推。

加载后的效果如下:

3. button_start_Click

点击按钮(Start),触发事件 button_start_Click。

系统将开始进行路径的可视化。系统依次读入每一步中将要移动的将牌,然后执行 Move_block 。每一步移动完成后暂停10ms。

方法 void Move_block(int block) :

假定所有读入的路径都是正确的。

①基本思想:

由于在将牌的一步移动中,将牌只会改变 x坐标 的值或者改变 y坐标 的值,而且每一步移动的将牌,必须与空将牌相邻,所以每一次移动,只需改变将牌的 x坐标 或 y坐标 直到与空将牌的坐标相同即可。

②实现:(每移动一个将牌)

首先先记录 移动前的将牌(block) 的坐标,以便移动 空将牌(white) 进行补位。

接下来,将 要移动的将牌(block) 与 空将牌(white) 的坐标进行比较,

若 x坐标 不同,y坐标 相同,则 以 1pixie/1ms 的速度改变 要移动的将牌(block) 的坐标,并即时进行重绘,移动的方向为逐渐靠近 空将牌(white) 的 x坐标 ,直至 要移动的将牌(block) 与 空将牌(white) 的坐标值相等;

若 y坐标 不同,x坐标 相同,同理改变 y坐标 进行绘制。

最后,当 要移动的将牌(block) 移动完成后,将 空将牌(white) 直接移动到 (block) 移动之前的位置,完成互换移动。

4. button_reload_Click

单击 Reload 按钮,触发事件 button_reload_Click。

该事件会重启窗体并重置路径的选择,注意,在每次移动完后应先进行reload再进行下一次可视化。

四、路径文件格式:

第一行为初始排序:0 为空Puzzle,每个数字以空格分开,共16个数字(1-16),不可重复。

2 12 5 6 1 3 11 4 9 10 0 7 13 14 15 8

剩余行为路径,每行为将要移动的Puzzle的编号。

11
5
12
3
5
12
6
4
7
8
15
11
12
6
3
2
1
5
6
7
8
12
11
15
经验分享 程序员 微信小程序 职场和发展