骑士周游世界
1.课题阐述
骑士周游世界:
在国际象棋中,骑士以“日”字型的步伐可踏遍棋盘,于是几个世纪前就有人提出:骑士能否从棋盘的任意一格出发,不重复地遍历棋盘上64格,最后回到出发点。
目标:掌握C#编写数据结构的算法,进而完成具有人机交互与计算机绘图的小游戏程序。
基本要求:
(1)通过算法解决骑士的路径规划问题;
(2)绘制上图所示界面,通过菜单进入游戏和显示说明;
(3)完成人机交互,实现骑士的前进和撤回。
2.思路和方法
- 理论基础
骑士周游世界也被称为骑士周游世界。将马随机放在国际棋盘的8*8棋的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘的64个方格。 - 算法分析
骑士周游世界其实是图的深度优先搜索的应用。
使用回溯(深度优先搜索)来解决,如果马在没有到第64格就已经走到尽头,就只能回退,查看其他路径,整个过程就是在棋盘上不断回溯并最终找到正确路径的过程。 - 设计流程
(1)创建棋盘SqQueue,是一个二维数组SqQueue[MAX * MAX]。
(2)将当前位置为已经访问,然后根据当前位置,计算马还能走到棋盘的哪些位置,并放入到一个集合SqStack中,最多有8个位置,每走一步,就使用step+1。
(3)遍历SqStack中存放的所有位置,看看哪个可以走通,如果走通就继续,走不通就回溯直到搜索到正确路径。
(4)运行调试。 - 代码要点
(1)利用了A*算法原理,可参照九宫格问题。
(2)利用二维数组SqQueue[MAX * MAX]实现棋盘的构建,通过调用SqStack
函数,遍历搜索到正确的棋盘路径。
3.完成情况
只完成了(1)中的通过算法解决骑士的路径规划问题的基本要求,如下图所示:
5.附件:关键源码
public partial class Form1 : Form{
const int MAX = 8;
int[,] direction = {
{
-2, 1 }, {
-1, 2 }, {
1, 2 }, {
2, 1 }, {
2, -1 }, {
1, -2 }, {
-1, -2 }, {
-2, -1 } };
int[,] maze = new int[MAX, MAX];
SqQueue[] SQ = new SqQueue[MAX * MAX];
static int count,flag=0;
public Form1(){
InitializeComponent();
}
PictureBox[,] MyPicture = new PictureBox[8, 8];
Label[,] MyLabel = new Label[8, 8];
SqStack s = new SqStack();
SqStack s2 = new SqStack();
static int TempX, TempY;
private void Form1_Load(object sender, EventArgs e){
InitLabelArray();
InitPictureBoxArray();
}
//输入初始位置 确定
private void button1_Click