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。
![image-20221018183740696](https://i-blog.csdnimg.cn/blog_migrate/414ba69c69b08a7f262bb9ebdcc376de.png)
三、事件与方法
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个坐标,以此类推。
加载后的效果如下:
![image-20221018193810847](https://i-blog.csdnimg.cn/blog_migrate/bff466bab355244e6314ebcbc6b50746.png)
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