马踏棋盘c++课程设计

合集下载

马踏棋盘c语言课程设计

马踏棋盘c语言课程设计

马踏棋盘c语言课程设计一、教学目标本课程的目标是让学生掌握C语言的基本语法、数据结构、算法和编程技巧,培养学生独立思考、解决问题和合作交流的能力。

具体分为以下三个部分:1.知识目标:学生能够理解并掌握C语言的基本语法、数据类型、运算符、控制结构、函数、数组、指针等概念,了解C语言的面向对象编程思想。

2.技能目标:学生能够运用C语言编写简单的程序,解决实际问题,具备一定的编程能力。

3.情感态度价值观目标:培养学生对计算机科学的兴趣,增强自信心,培养克服困难的勇气和团队协作精神。

二、教学内容教学内容主要包括C语言的基本语法、数据结构、算法和编程技巧。

具体安排如下:1.第一章:C语言概述,介绍C语言的发展历程、特点和基本语法。

2.第二章:数据类型和运算符,讲解整型、浮点型、字符型数据以及各类运算符的用法。

3.第三章:控制结构,包括条件语句、循环语句和跳转语句。

4.第四章:函数,讲解函数的定义、声明、调用以及函数的参数传递。

5.第五章:数组和指针,介绍数组的声明、初始化和使用,以及指针的基本概念和应用。

6.第六章:字符串和文件操作,讲解字符串的表示、操作方法以及文件读写。

7.第七章:编程实践,通过实际项目让学生综合运用所学知识解决实际问题。

三、教学方法本课程采用多种教学方法,包括讲授法、案例分析法、实验法和讨论法。

1.讲授法:用于讲解C语言的基本语法、数据结构和算法。

2.案例分析法:通过分析实际项目,让学生了解C语言在实际中的应用。

3.实验法:让学生动手编写程序,培养实际编程能力。

4.讨论法:鼓励学生提问、交流和分享,培养合作交流能力。

四、教学资源1.教材:《C程序设计语言》(K&R)或《C Primer Plus》。

2.参考书:《C语言编程之美》、《C语言深度剖析》。

3.多媒体资料:PPT课件、教学视频、在线教程。

4.实验设备:计算机、编程环境(如Code::Blocks、Visual Studio等)。

数据结构 马踏棋盘 设计报告

数据结构 马踏棋盘 设计报告

《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目:姓名:院系:专业:年级:学号:指导教师:2011年月日目录1、程序设计的目的2、设计题目3、分析4、设计思想5、算法6、测试结果7、调试分析8、小结1、课程设计的目的1、熟练使用C++语言编写程序,解决实际问题;2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;5、学习并熟悉栈的有关操作;6、利用栈实现实际问题;2、设计题目【马踏棋盘】*问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。

要求每个方格上只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。

*测试数据:由读者指定,可自行指定一个马的初始位置。

*实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

3、分析确定输入值的范围,输入马的初始行坐标X和Y,X和Y的范围都是1到8之间。

程序的功能是输出马走的步骤,要使马从任一起点出发,通过程序能找到下一个地点,然后遍历整个棋盘。

每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

输出时可以用二维数组。

4、设计思想输入马初始位置的坐标。

将初始位置进栈,经过一个while循环,取出符合条件的栈顶元素。

利用函数,找出栈顶元素周围未被占用的新位置,如果有,新位置入栈;否则弹出栈顶元素。

C++ 数据结构课程设计 马踏棋局文档

C++ 数据结构课程设计 马踏棋局文档

课程设计题目1 问题描述将马随机放在国际象棋的8*8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动,要求每个方格上只进入一次,走遍棋盘上全部64个方格2 基本要求(1)采用图形界面实现该游戏。

(2)从键盘输入马的初始位置。

(3)编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8* 8的方阵,并输出之。

3系统分析与设计3.1 数据结构逻辑结构为线性结构,用顺序栈。

坐标点用已结构体来表示,并将其的位置放在s[step]的栈中,而且将每走一步的坐标放在另一栈s1中3.2 算法设计1.程序框架及功能模块划分:2.设计功能的分析与实现void exit(point p)参数:point功能:计算出下一步可能位置,按其各个位置下一个位置的和压栈到s[]中算法描述:接受参数传来的值,按次序加上int horizontal[]={2,1,-1,-2,-2,-1,1,2};int vertical[]={-1,-2,-2,-1,1,2,2,1};再根据legal函数来判断是否合法(x(0~7),y(0~7))是,则保存在point ap[]中,再按各自下一步的数目从大到小排序。

最后,将ap[]中的点压栈。

int number(point p)参数:point功能:找出当前位置下一步的各种可能位置,计算可能之和算法描述:接受参数传来的值,按次序加上int horizontal[]={2,1,-1,-2,-2,-1,1,2};int vertical[]={-1,-2,-2,-1,1,2,2,1};再根据legal函数来判断是否合法(x(0~7),y(0~7))是,则加1并将值返回void next(point p)参数:point功能:/找出各个位置并将其步数记录算法描述:将其步数记录在board[][]的相应位置,并将这点压栈到s1,判断步数是否小于64,再根据这四个条件选择执行其中的一个,再递归调用next.bool legal(point p)参数:point功能:判断是否可行,合法(是否在棋盘上,是否走过)算法描述:用这样的语句if((p.x>=0)&&(p.x<n)&&(p.y<n)&&(p.y>=0)&&(bo ard[p.x][p.y]==0))return true;elsereturn false;4 测试数据及结果测试数据和运行输出及结果分析输入x(0-7),y(0-7)0 01 34 3 18 49 32 13 164 19 56 33 14 17 50 3157 2 35 48 55 52 15 1220 5 60 53 36 47 30 5141 58 37 46 61 54 11 266 21 42 59 38 27 64 2943 40 23 8 45 62 25 1022 7 44 39 24 9 28 63 Press any key to continue输入x(0-7),y(0-7)0 9输入不合法,重输入!输入x(0-7!),y(0-7!)4 530 27 10 49 40 25 8 511 48 29 26 9 6 39 2428 31 56 45 50 41 4 747 12 51 42 19 44 23 3832 57 46 55 52 1 18 313 64 53 60 43 20 37 2258 33 62 15 54 35 2 1763 14 59 34 61 16 21 36 Press any key to continue5 总结调试过程中遇到的主要问题,是如何解决的;问题1:只走到63步原因:第64步就走完了,并且s[62]中只有一个元素,这个判断条件(s[step].base==s[step].top&&number(p2)==0)满足就进入了,而始终不能走完解决方法:改了判断条件,改为((s[step].base==s[step].top&&number(p2)==0)&&step!=n* n-1)解决方案:用InitStack(s1)初始化问题3:冒泡排序超出边界原因:循环次数大解决方案:减少循环次数看了其他同学,都差不多,我已经按马的下一位置最难的先走,再走难度次之的位置。

c语言程序课程设计棋盘

c语言程序课程设计棋盘

c语言程序课程设计棋盘一、课程目标知识目标:1. 让学生掌握C语言中的数组知识,并能运用数组创建和操作棋盘。

2. 理解和掌握循环结构在棋盘程序中的应用,如嵌套循环用于遍历棋盘。

3. 学习使用函数对棋盘程序进行模块化设计,理解模块间的关系和调用方式。

技能目标:4. 能够编写简单的C语言程序,实现基本的棋盘游戏逻辑,例如棋子的移动、位置的判断等。

5. 培养学生的逻辑思维能力,通过编程解决棋盘游戏中遇到的问题。

6. 提高学生的问题分析能力,使其能够通过算法设计处理棋盘游戏中的特定问题。

情感态度价值观目标:7. 培养学生对编程和算法设计的兴趣,激发学生在信息技术领域的探究欲望。

8. 强调团队协作的重要性,通过小组合作完成棋盘程序的设计,培养学生的沟通和团队协作能力。

9. 培养学生的创新意识,鼓励学生提出和实现独特的棋盘游戏规则和功能。

课程性质:本课程设计以实践性为主,结合理论知识的讲解,注重培养学生的实际操作能力和编程思维。

学生特点:考虑到学生为高中年级,具备一定的逻辑思维能力和问题解决能力,但编程经验可能有限。

教学要求:通过棋盘程序的设计,将复杂问题分解为若干个小问题,引导学生循序渐进地掌握C语言编程和应用,同时注重激发学生的学习兴趣和创新能力。

教学过程中应注重个体差异,提供个性化的指导和反馈,确保每位学生都能实现既定的学习目标。

二、教学内容本节教学内容围绕C语言程序设计,结合棋盘游戏项目,主要包括以下部分:1. C语言基础知识回顾:数组的使用、数据类型、变量声明与赋值。

- 教材章节:第3章 数组和第5章 数据类型与表达式。

2. 控制结构:循环结构的使用,重点讲解嵌套循环在棋盘遍历中的应用。

- 教材章节:第4章 控制结构。

3. 函数与模块化设计:介绍如何将棋盘程序拆分为函数模块,实现代码复用和模块化。

- 教材章节:第6章 函数。

4. 棋盘程序设计:a. 棋盘的初始化:创建二维数组表示棋盘,并进行初始化。

马踏棋盘数据结构报告参考模板

马踏棋盘数据结构报告参考模板

《数据结构》课程设计报告课程设计题目:马踏棋盘姓名:张程浩院系:通信工程专业:信息安全年级:2011学号:11225104指导教师:任雪萍2012年11 月26 日(任雪萍编写)目录一、课程设计目的 (3)二、任务分析 (3)三、分析设计 (3)四、调试分析 (5)五、测试结果 (5)六、小结 (6)七、用户手册 (6)八、附录 (6)九、参考文献 (8)一、课程设计目的(1)熟练使用C语言编写程序,强化模块设计理念;(2)设计一个国际象棋马踏棋盘的演示程序。

(3)理解栈的特性“后进先出”和队列的特性“先进先出”。

(4)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;二、任务分析(1)要求:在国际象棋8×8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。

编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,并输出它的行走路线。

(2)输入:任意一个起始位置;输出:无重复踏遍棋盘的结果,以数字1-64表示行走路线。

三、分析设计●需要处理的数据的逻辑结构:线性结构●合适的存储结构:顺序储存●设计好的数据类型:#define BS 8 //棋盘大小typedef int Status;int step;int board[8][8]={0}; //定义棋盘int mayway[9]; //储存可能的路径int Htry1[8]={-2,-1,1,2,2,1,-1,-2},Htry2[8]={1,2,2,1,-1,-2,-2,-1};/*存储马各个出口位置相对当前位置列下标的增量数组*/typedef struct { //位置存储表达方式int i; //行坐标int j; //列坐标int from; //存储下一步所选方向}SElemType;typedef struct {SElemType *base; //在栈构造之前和销毁之后,base的值为NULLSElemType *top; //栈顶指针int stacksize; //当前已经分配的储存空间,以元素为单位}Stack;Stack Path;●本程序包含模块:1、主程序模块:void main(){定义变量;接受命令;处理命令;退出;}234、输出路径函数模块——输出马儿行走的路径;各模块之间的调用关系:●与功能对应的模块划分定义://构造一个空栈SStatus InitStack(Stack &s);//若栈不空,则用e返回s的栈顶元素,返回OK;否则返回ERRORStatus GetTop(Stack s,SElemType &e);//插入元素e为新的栈顶元素Status Push(Stack &s,SElemType e);//若栈不空,则删除s的栈顶元素,并用e返回其值,并返回OK;否则返回ERROR Status Pop(Stack &s,SElemType &e);//从栈底到栈顶依次对栈中每个元素输出。

c语言课程设计棋盘

c语言课程设计棋盘

c语言课程设计棋盘一、教学目标本节课的学习目标包括以下三个方面:1.知识目标:学生需要掌握C语言的基本语法和编程技巧,了解棋盘游戏的原理和设计方法。

2.技能目标:学生能够运用C语言编写简单的棋盘游戏,提高编程能力和问题解决能力。

3.情感态度价值观目标:培养学生对计算机科学的兴趣,增强创新意识和团队合作精神。

二、教学内容本节课的教学内容主要包括以下几个部分:1.C语言基本语法和编程技巧:数据类型、变量、运算符、控制结构等。

2.棋盘游戏的原理和设计方法:棋盘的表示方法、游戏规则的制定、玩家交互等。

3.棋盘游戏的编程实现:编写游戏主函数、调用游戏功能函数、处理玩家输入等。

三、教学方法为了实现本节课的教学目标,我们将采用以下几种教学方法:1.讲授法:讲解C语言基本语法和编程技巧,引导学生掌握棋盘游戏的原理。

2.案例分析法:分析经典棋盘游戏案例,让学生了解游戏设计的方法和技巧。

3.实验法:让学生动手编写棋盘游戏,培养实际编程能力和问题解决能力。

4.小组讨论法:分组进行游戏设计,鼓励学生互相交流、合作,提高团队合作精神。

四、教学资源为了支持本节课的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言程序设计》等相关教材,为学生提供理论知识的学习材料。

2.参考书:《C语言编程实例教程》等参考书,为学生提供更多的学习资源。

3.多媒体资料:制作课件和教学视频,为学生提供直观的学习体验。

4.实验设备:计算机、编程环境等,为学生提供实践操作的平台。

五、教学评估本节课的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性。

2.作业:布置相关的编程作业,评估学生的理解和应用能力。

3.考试:进行期中和期末考试,全面评估学生的知识掌握和编程能力。

评估方式应客观、公正,能够全面反映学生的学习成果。

同时,注重鼓励学生的创新和团队合作精神。

六、教学安排本节课的教学安排如下:1.教学进度:按照教材的章节和教学大纲进行教学,确保完成教学任务。

马踏棋盘-大学课程设计

马踏棋盘-大学课程设计

马踏棋盘一目的1、巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解。

2、掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等)。

3、提高利用计算机分析解决综合性实际问题的基本能力。

4、加强对基础知识的运用,做到学以致用。

5、二需求分析1、从键盘输入马起始的横坐标x和纵坐标y,其范围都是0-7。

2、马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格。

3、一般说来,当马位于位置(i,j)时,可以走到下列8个位置之一( x-2,y+1),(x-1,y+2),(x+1,y+2),(x+2,y+1),(x+2,y-1)(x+1,y-2),(x-1,y-2),(x-2,y-1)4、求出马的行走路线,将数字1到64依次填入一个8X8的方阵,输出到文本中(文本中能清楚看到方阵)。

输出的形式;(1)以数组下标形式输入,代表起始位置,i表示行标,j表示列标。

(2)以棋盘形式输出,每一格打印马走的步数,这种方式比较直观。

3、程序所能达到的功能;(1)让马从任一起点出发都能够历遍整个8×8的棋盘。

(2)能寻找多条不同的行走路径。

4.测试数据,包括正确的输入及输出结果和含有错误的输入及其输出结果。

数据可以任定,只要 0<=X<7&&0<=Y<7 就可以了。

正确的输出结果为一个2维数组,每个元素的值表示马行走的第几步。

若输入有错,程序会显示“输入错误,请重新输入:”并且要求用户重新输入数据,直至输入正确为止。

三概要设计initstack(s) //构建一个空栈。

push(s,e) //在栈顶插入新的元素。

pop(s,e)//将栈顶元素弹出。

settop(s, e) //将e设为栈顶元素。

gettop(s, e)//将栈顶元素取出。

stackempty(s) //判断栈是否为空check(int x,int y)//判断点(x,y)是否在棋盘内weighting()//求棋盘中每一点的权值四详细设计1、名称详细内容详细内容详细内容详细内容详细内容详细内容详细内容详细内容详细内容详棋盘点的结构类型定义typedef struct{int x;该点的横坐标int y;该点的纵坐标int z;}elemtype;栈的类型定义typedef struct SNode{elemtype data;struct SNode *next;}SNode,*Linkstack;栈的初始化操作int initstack(Linkstack &s){s=(Linkstack)malloc(sizeof(SNode));if(!s){printf("初始化失败!");return 0;}s->next=NULL;return 1;}入栈操作int push(Linkstack &s,elemtype e){Linkstack p;p=(Linkstack)malloc(sizeof(SNode));if(!p) return 0;p->next=s->next;s->next=p;p->data=e;return 1;}出栈操作int pop(Linkstack &s,elemtype &e) {Linkstack p=s->next;if(p==NULL) return 0;s->next=p->next;e=p->data;free(p);return 1;}取栈顶元素操作gettop(Linkstack &s,elemtype &e) {Linkstack p=s->next;if(p==NULL) return 0;e=p->data;return 1;}判断栈是否为空操作int stackempty(Linkstack s){int flag=0;if(s->next==NULL)flag=1;return flag;}设为栈顶元素操作int settop(Linkstack &s,elemtype e) {if(s->next!=NULL){s->next->data=e;return 1;}else return 0;}void setmap(){int i,j,k,m,d1,d2,x1,x2,y1,y2,l1,l2; for(i=0;i<N;i++)//for 1{for(j=0;j<N;j++)//for 2{for(k=0;k<8;k++)map[i][j][k]=k;//默认8个方向顺时针赋值for(k=0;k<8;k++)//for 3 与 for 4 两个循环对方向索引按点的权值升序排列,不能到达的方向排在最后{for(m=k+1;m<8;m++) //for 4{d1=map[i][j][k];x1=i+HTry1[d1];y1=j+HTry2[d1];d2=map[i][j][m];x2=i+HTry1[d2];y2=j+HTry2[d2];l1=check(x1,y1);l2=check(x2,y2);if((l1==0&&l2)||(l1&&l2&&(weight[x1][y1]>weight[x2][y2]))){map[i][j][k]=d2;map[i][j][m]=d1; //交换两个方向值,按权值递增排列,不可到达的目标点(超出棋盘)的方向放在最后面}//end if}//end for 4}//end for 3}//end for 2}//end for 1}//end setmap()void path(int xx, int yy){ int c[N*N]={0},h[N*N]={0};Linkstack a;elemtype ptemp;elemtype pop_temp,get_temp;elemtype p,dest_p; //当前点和目标点int step=0,x,y,s,k=1,l=1,d =0;char ch;p.x = xx; p.y = yy;p.z = 0;//初始化出发点board[xx][yy]=1;initstack(a);push(a,p); //起始点的坐标和首选方向入栈while(1){if (step==63){output(a);exit(1);}if(stackempty(a)) break;gettop(a,p);x=p.x; y=p.y; d=p.z;if(d>=8)//该点所有方向已走完,退栈{board[x][y]=0; //抹去痕迹step--; //步数减一pop(a,pop_temp); //退栈gettop(a,get_temp); //取当前栈顶元素ptemp.x=get_temp.x;ptemp.y=get_temp.y;ptemp.z=get_temp.z+1;settop(a,ptemp); //更改方向gettop(a,p);} //end if (d>=8)if(d<8)//方向未走完{s=map[x][y][d];//map[x][y][0]未必是(x,y)点的HTry[0]方向,而是到该点可到的权值最小的点的方向即HTry[map[x][y][0]dest_p.x=x+HTry1[s];dest_p.y=y+HTry2[s];if(check(dest_p.x,dest_p.y)&&board[dest_p.x][dest_p.y]==0)//目标点在棋盘内且未被走过,则将目标点入栈同时标记当前点为已走过{h[step]=step;board[x][y]=1;step++;//步数加一dest_p.z=0;push(a,dest_p);//存入目标点,方向栈初始}else//目标点已被走过或目标点不在棋盘内,换方向{ //printf(" 进行");ptemp.x=p.x;ptemp.y=p.y;ptemp.z=d+1;//取下一个方向 settop(a,ptemp);//切换方向// gettop(a,p);//gettop(a,p);//x=p.x; y=p.y; d=p.z;检测重新将d赋值//printf("%d %d %d",x,y,d);}} //enf if(d<8)//printf("步数%d\n ",step);} //end while(1)}void output(Linkstack a){ Linkstack b;int c[8][8]={0},i,j,k=N*N,l=1,x,y;initstack(b);elemtype e;while(!stackempty(a)){pop(a,e);c[e.x][e.y]=k;k--;push(b,e);}gettop(b,e);x=e.x;y=e.y;printf("起始坐标:(%d,%d)\n",x,y);while(!stackempty(b)){ pop(b,e);printf("(%d,%d)",e.x,e.y);push(a,e);}printf("棋盘表示为:\n");for(i=0;i<8;i++){for(j=0;j<8;j++){printf("%2d",c[i][j]);printf(" ");if(j==7) printf("\n");}}}五调试分析1、设计gettop函数时误将栈顶元素取出,原因是多加了一条s->next=p->next语句,造成不应有的错误2、写settop(s)函数时,忘记了s仅为头结点误将e赋值给了s->data,而实际上应为s->next->data=e;由此造成的错误极难发现,这也进一步说明了基础知识的重要。

棋盘游戏c课程设计

棋盘游戏c课程设计

棋盘游戏c课程设计一、课程目标知识目标:1. 学生能理解棋盘游戏的基本规则,掌握相关的策略与方法。

2. 学生能运用所学的棋盘游戏知识,分析并解决实际问题。

3. 学生能了解棋盘游戏的历史背景,认识到其在我国传统文化中的地位。

技能目标:1. 学生通过棋盘游戏,提高逻辑思维、策略规划和问题解决能力。

2. 学生在游戏中,锻炼团队协作、沟通表达和竞争意识。

3. 学生能够运用所学知识,设计并推广自己的棋盘游戏。

情感态度价值观目标:1. 学生培养对棋盘游戏的兴趣,激发探究欲望,形成主动学习的习惯。

2. 学生在游戏中,树立公平竞争的意识,尊重对手,培养良好的竞技道德。

3. 学生通过棋盘游戏,认识到团结协作的重要性,增强集体荣誉感。

课程性质:本课程以棋盘游戏为载体,结合学科知识,注重培养学生的思维能力、合作精神和竞技道德。

学生特点:学生处于好奇心强、求知欲旺、善于合作、乐于竞争的阶段,对棋盘游戏具有较强的兴趣。

教学要求:教师应关注学生的个体差异,因材施教,以引导、启发和鼓励为主,注重培养学生的自主学习和团队协作能力。

在教学过程中,关注学生的学习成果,及时进行评估和反馈,确保课程目标的实现。

二、教学内容本章节教学内容主要包括以下几部分:1. 棋盘游戏概述:介绍棋盘游戏的历史、种类及其在我国传统文化中的地位,让学生了解棋盘游戏的背景知识。

2. 棋盘游戏规则与策略:详细讲解常见棋盘游戏(如:围棋、象棋、五子棋等)的规则,分析游戏策略,引导学生掌握基本技巧。

3. 棋盘游戏实践:组织学生进行棋盘游戏实践,培养其逻辑思维、策略规划和问题解决能力。

4. 团队协作与竞技道德:通过棋盘游戏,让学生体验团队合作的重要性,树立公平竞争意识,培养良好的竞技道德。

5. 创新设计:鼓励学生运用所学知识,设计并推广自己的棋盘游戏,激发创新意识。

教学大纲安排如下:第一课时:棋盘游戏概述、围棋基本规则与策略第二课时:象棋基本规则与策略、五子棋基本规则与策略第三课时:棋盘游戏实践(分组进行围棋、象棋、五子棋比赛)第四课时:团队协作与竞技道德教育、创新设计(学生设计棋盘游戏)第五课时:成果展示与评价(学生展示设计成果,师生共同评价)教学内容与教材关联性:本章节内容与教材中关于逻辑思维、策略规划和团队合作的相关章节紧密相连,旨在通过棋盘游戏这一载体,实现教材知识点的实际应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.问题描述设计一个国际象棋的马踏棋盘的演示程序2.需求分析(1)将马随即放在国际象棋的8×8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

(2)编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,……,64依次填入一个8×8的方阵,输出之。

(3)程序执行命令为:1)输入起始方格坐标(X,Y)2)求解第一组路径并显示,按Q键退出系统,按其他任意键求解并显示下一组路径。

(4)测试数据:(0,0),(1,2)3概要设计3.1[程序设计思路].按照顺时针顺序,每次产生一个新的路点,并验证此路点的可用性,需要考虑的问题包括是否超出棋盘和此点已经走过与否。

如新路点可用,则入栈,并执行下一步,每次按照上一路点的位置生成新路点。

如一个路点的可扩展路点数为0,则走不下去了,进行回溯。

3.2[存储结构设计]8个可能位置可以用两个一维数组表示:数组1: 0 1 2 3 4 5 6 7-2 -1 1 1221-1 -2数组2:0 1 2 3 4 5 6 71 2 2 1 -1 -2 -2 -1位于(i,j)的马可以走到的新位置是在棋盘范围内的(I+数组1[h],j+数组2[h]),其中h=0,1,…7。

每次在多个可走位置中选择其中一个进行试探,其中未曾试探过的可走位置用适当栈结构妥善管理,也备试探失败时的“回溯”(悔棋)使用,即用栈结构存储试探的路径来进行路径试探操作。

3.3[主要算法设计]3.3.1栈类的定义和接口:template <class Type>class MyStack{private:Type *bottom; // 元素存放的动态数组int size,ptr; // 堆栈大小和当前栈顶元素索引inline int extent(){…}; //当栈满时,自动扩充public://构造函数MyStack() {bottom=new Type[BASESIZE];ptr=-1;size=BASESIZE;};//用默认大小初始化MyStack(int i) {bottom=new Type[i];ptr=-1;size=i;}; //用指定大小初始化//析构函数~MyStack(){if(bottom!=NULL) delete []bottom;};//清栈inline void clear(){…};//判栈空inline bool IsEmpty(){…};//入栈int push(Type e);//出栈int pop(Type &e);//获得栈顶元素int top(Type &e);//直接修改栈定元素int settop(Type e);// 用callback函数对栈从栈底向上遍历void traverse(void callback(Type *),Type *);};3.3.2本程序的结构1)主程序模块:void main(){初始化;向屏幕输出输入提示;接受输入起始坐标(X,Y);输出第一组解的路径和回溯情况;while(1){接受命令;处理命令{if(命令==退出)退出;其他命令{输出下一组解的路径及回溯情况;}}}异常处理{};正常退出;}2)路径求解模块---求解所有可行的路径3)可行路径求解的核心算法:bool Result(int start_x, int start_y, int board[][8]){初始化路径栈sPath;初始化方向栈sDir;初始化当前步数序号和当前方向step = 1, d = 0将点(start_x,start_y)入路径栈,将该点方向d入方向栈;while(1){将当前的路径栈中点出栈并保存,将该点方向出栈并保存;//为上一次的目标点和目标方向if(方向=>8){ 抹去该点痕迹;步数序号-1;调用MyStack的traverse函数演示退栈情况;退栈;方向栈中的方向++;continue;}if(方向<8)//方向未走完{if(目标点在棋盘内且未被走过){ 记录序号,目标点入栈,目标点方向初始为0入栈;continue;}else(目标点已被走过或目标点不在棋盘内){方向++;continue;//继续}}//enf if(d<8)if (步数序号已满){向屏幕输出路径if(查看下一路径){回退一步;方向++;continue;}}} //end while(1)}3.4[测试用例设计]依次输入(0,0)(1,2)4详细设计4.1堆栈类MyStack参见文件base 中MyStack模板类的定义和实现。

4.2求解出所有路径为了快速求解出所有路径,使用了优化策略,即计算各个点的可以行走的下一个点的个数作为点的权值存放在权值矩阵weight[8][8]中;然后根据这个矩阵对各点的8方向各方向按权设置优先级,保存于各点方向矩阵序列map[8][8][8],权值小的优先行走。

详见horse.cpp文件中的setweight,setmap函数。

4.3求解路径核心算法函数bool Result(int myx, int myy, int board[][8]){ MyStack<MyPoint> sPath; // 栈,记录路径点MyStack<int> sDir; // 栈,记录方向选择MyPoint p,dest_p; // 当前点和目标点int step = 1, d = 0; // 当前序号,方向p.x = myx; p.y = myy;sPath.push(p); sDir.push(d);//起始点的坐标和首选方向入栈,//map[x][y][0]未必是(x,y)点的offset[0]方向,而是到该点可到的权值最小的点的方向即offset[map[x][y][0]] board[p.x][p.y] = 1;//起始点标记已走且序号为1MyPoint pTemp;int iTemp;while(1){if (step==N*N) //路径完成{ void(*pFun)(MyPoint *) ;pFun=&TraverseOut;MyPoint *e=NULL;cout<<"\n起始点为("<<myx<<","<<myy<<")的解空间\n";cout<<"依次走以下坐标(按行顺序)[第"<<num<<" 组] \n";sPath.traverse(TraverseOut,e);output();//输出路径矩阵if(ch=='q')break;else//回退前一步{ sPath.pop(p);sDir.pop(d);//退栈;sDir.top(d);sDir.settop(d+1);step--;continue;}}if(sPath.top(p)==-1||sDir.top(d)==-1) break;int x=p.x;int y=p.y;if(d>=8)//该点所有方向已走完,退栈{ board[x][y]=0;//初始化;step--;sPath.pop(pTemp);sDir.pop(iTemp);//退栈sDir.top(iTemp);sDir.settop(iTemp+1);//更改方向continue;}//end if (d>=8)if(d<8)//方向未走完{int off=map[x][y][d];dest_p.x=x+offset[off].x;dest_p.y=y+offset[off].y;if(check(dest_p.x,dest_p.y)&&board[dest_p.x][dest_p.y]==0)//目标点在棋盘内且未被走过,则将目标点入栈同时标记为已走过{ board[x][y]=step;//记录序号sPath.push(dest_p);//存入目标点sDir.push(0); //存入方向栈初始0;continue;}else//i目标点已被走过或目标点不在棋盘内,换方向{ d++;//取下一个方向sDir.settop(d);//换方向continue;//继续}} //enf if(d<8)} //end while(1)}4.4main和其他UI函数核心代码/*horse.cpp 马踏棋盘算法实现文件文件 base 是自定义的数据结构类的定义和实现文件*/ #include <iostream>#include "base"using namespace std;/*全局宏,常量,变量,函数声明*/#define N 8 //棋盘大小int map[N][N][8]; //按各点权值递升存放待走方向,每点8个int weight[N][N]; //各点的权值int board[N][N]; //表示棋盘的数组static MyPoint offset[8] = // 8个候选方向的偏移{ -2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2, -1, -2, -2, -1 };char ch;int num=1;void setweight();//求各点权值void setmap(); //各点的8个方向按权值递增排列bool Result(int x, int y, int board[][8]); //主算法函数/*主函数*/void main(){ for(int i=0;i<8;i++)for(int j=0;j<8;j++)board[i][j]=0;setweight();setmap();char x,y;while(1){ cout<<"请输入起始点坐标X (可取0~7):";cin>>x;cout<<"请输入起始点坐标Y (可取0~7):";cin>>y;if(x<'0'||x>'7'||y<'0'||y>'7')cout<<"起始坐标错误,重新输入!\n\n";break;}bool re=Result(x-'0',y-'0',board);cout<<endl<<endl;if(re=false)cout<<"Bye!\n\n";elsecout<<"Good Bye!\n\n";}//end main()/*求各点权值:可走的方向数.该值越小,则被上一点选中的可能性越大*/ void setweight(){for(int i=0;i<N;i++)//for 1{ for(int j=0;j<N;j++)//for 2{ weight[i][j]=0;for(int k=0;k<N;k++)// for 2{ int x,y;x=i+offset[k].x;y=j+offset[k].y;if(x>=0&&x<N&&y>=0&&y<N){weight[i][j]++;//即在8个方向中,(i,j)点有几个方向可以移动}}}}//end of for 1}//end setweight()/*检查(i,j)是否在棋盘内*/int check(int i,int j){ if(i<0||i>=8||j<0||j>=8)return 0;return 1;}/*标准输出*/void output(){ cout<<"求解结果矩阵[第"<<num<<" 组] \n";num++;for(int i=0;i<8;i++){ for(int j=0;j<8;j++)if(board[i][j]==0)cout<<64<<"\t";else cout<<board[i][j]<<"\t";}cout<<"\n";cout<<"输入q to quit,其他字符查看其他路径:";cin>>ch;}/*将各点的8个方向按该方向下的目标点的权值递增排列,不可到达的目标点(超出棋盘)的方向放在最后面*/void setmap(){ for(int i=0;i<N;i++)//for 1{ for(int j=0;j<N;j++)//for 2{ for(int k=0;k<8;k++)map[i][j][k]=k;//设置默认方向索引for(int k=0;k<8;k++)//for 3 与for 4 两个循环对方向索引按点的权值升序排列,不能到达的方向排在最后{ for(int m=k+1;m<8;m++) //for 4{ int d1=map[i][j][k];int x1=i+offset[d1].x;int y1=j+offset[d1].y;int d2=map[i][j][m];int x2=i+offset[d2].x;int y2=j+offset[d2].y;int n1=check(x1,y1);int n2=check(x2,y2);if( ( n1==0 && n2 ) || /*k方向不可达到,而m方向可达到*/( n1 && n2&&weight[x1][y1]>weight[x2][y2] )/*都可到但达m方向权值小*/){ map[i][j][k]=d2;map[i][j][m]=d1; /*向交换两个方值*/}//end if}//end for 4}//end for 3}//end for 2}//end for 1}//end setmap()void TraverseOut(MyPoint *e){ static iEndl=1;cout<<"("<<e->x<<","<<e->y<<") ";iEndl%=8;if(iEndl==0)iEndl++;}bool Result(int myx, int myy, int board[][8])// bool (*callback)(MyStack<Type>&, bool)=NULL){ MyStack<MyPoint> sPath; // 栈,记录路径点MyStack<int> sDir; // 栈,记录方向选择MyPoint p,dest_p; // 当前点和目标点int step = 1, d = 0; // 当前序号,方向p.x = myx; p.y = myy;sPath.push(p); sDir.push(d);//起始点的坐标和首选方向入栈,// map[x][y][0]未必是(x,y)点的offset[0]方向,而是到该点可到的权值最小的点的方向即offset[map[x][y][0]] board[p.x][p.y] = 1;//起始点标记已走且序号为1MyPoint pTemp;int iTemp;while(1){ if (step==N*N){ /*void(*pFun)(MyPoint *) ;pFun=&TraverseOut;MyPoint *e=NULL;cout<<"\n起始点为("<<myx<<","<<myy<<")的解空间\n";cout<<"依次走以下坐标(按行顺序)[第"<<num<<" 组] \n";sPath.traverse(TraverseOut,e);*/output();if(ch=='q')break;else//回退前一步{ sPath.pop(p);sDir.pop(d);//退栈;sDir.top(d);sDir.settop(d+1);step--;continue;}}if(sPath.top(p)==-1||sDir.top(d)==-1) break;int x=p.x;int y=p.y;if(d>=8)//该点所有方向已走完,退栈{ //cout<<endl<<"back:("<<x<<" ,"<<y<<")#"; //debug infoboard[x][y]=0;//抹去痕迹;step--;sPath.pop(pTemp);sDir.pop(iTemp);//退栈sDir.top(iTemp);sDir.settop(iTemp+1);//更改方向continue;}//end if (d>=8)if(d<8)//方向未走完{ int off=map[x][y][d];dest_p.x=x+offset[off].x;dest_p.y=y+offset[off].y;if(check(dest_p.x,dest_p.y)&&board[dest_p.x][dest_p.y]==0)//目标点在棋盘内且未被走过,将目标点入栈并标记当前点为已走过{ //cout<<"\n"<<"in :("<<dest_p.x<<","<<dest_p.y<<") step="<<step<<" d:"<<d;//debug infoboard[x][y]=step;//记录序号step++;sPath.push(dest_p);//存入目标点sDir.push(0); //存入方向栈初始0;continue;}else//i目标点已被走过或目标点不在棋盘内,换方向{ d++;//取下一个方向sDir.settop(d);//换方向continue;//继续}}//enf if(d<8)}//end while(1)}5调试分析程序中的指针操作多次出现错误,尤其发生在操作栈中的方向分量时,由于操作的失误,开始实际未保存此数据,导致多次循环需要回溯时进入死循环。

相关文档
最新文档