马踏棋盘课程设计.doc

上传人:啊飒飒 文档编号:10895889 上传时间:2021-06-11 格式:DOC 页数:13 大小:85KB
返回 下载 相关 举报
马踏棋盘课程设计.doc_第1页
第1页 / 共13页
马踏棋盘课程设计.doc_第2页
第2页 / 共13页
马踏棋盘课程设计.doc_第3页
第3页 / 共13页
马踏棋盘课程设计.doc_第4页
第4页 / 共13页
马踏棋盘课程设计.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《马踏棋盘课程设计.doc》由会员分享,可在线阅读,更多相关《马踏棋盘课程设计.doc(13页珍藏版)》请在三一文库上搜索。

1、课程设计题目1 问题描述 将马随机放在国际象棋的8*8棋盘Board88的某个方格中,马按走棋规则进行移动,要求每个方格上只进入一次,走遍棋盘上全部64个方格2 基本要求(1) 采用图形界面实现该游戏。(2) 从键盘输入马的初始位置。(3) 编制程序,求出马的行走路线 ,并按求出的行走路线,将数字1,2,64依次填入一个8* 8的方阵,并输出之。3系统分析与设计3.1 数据结构逻辑结构为线性结构,用顺序栈。坐标点用已结构体来表示,并将其的位置放在sstep的栈中,而且将每走一步的坐标放在另一栈s1中3.2 算法设计1.程序框架及功能模块划分:2.设计功能的分析与实现void exit(poin

2、t 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(07),y(07))是,则保存在point ap中,再按各自下一步的数目从大到小排序。最后,将ap中的点压栈。int number(point p)参数:point 功能:找出当前位置下一步的各种可能位置,计算可能之和算法描述:接受参数传来的值,按次序加上int horizontal=2,1,

3、-1,-2,-2,-1,1,2;int vertical=-1,-2,-2,-1,1,2,2,1;再根据legal函数来判断是否合法(x(07),y(07))是,则加1并将值返回void next(point p)参数:point 功能:/找出各个位置并将其步数记录算法描述:将其步数记录在board的相应位置,并将这点压栈到s1,判断步数是否小于64,再根据这四个条件选择执行其中的一个,再递归调用next.bool legal(point p)参数:point 功能:判断是否可行,合法(是否在棋盘上,是否走过)算法描述 :用这样的语句if(p.x=0)&(p.xn)&(p.y=0)&(boar

4、dp.xp.y=0)return true;elsereturn false;4 测试数据及结果 测试数据和运行输出及结果分析 输入x(0-7),y(0-7)0 0 1 34 3 18 49 32 13 16 4 19 56 33 14 17 50 31 57 2 35 48 55 52 15 12 20 5 60 53 36 47 30 51 41 58 37 46 61 54 11 26 6 21 42 59 38 27 64 29 43 40 23 8 45 62 25 10 22 7 44 39 24 9 28 63Press any key to continue输入x(0-7),y

5、(0-7)0 9输入不合法,重输入!输入x(0-7!),y(0-7!)4 5 30 27 10 49 40 25 8 5 11 48 29 26 9 6 39 24 28 31 56 45 50 41 4 7 47 12 51 42 19 44 23 38 32 57 46 55 52 1 18 3 13 64 53 60 43 20 37 22 58 33 62 15 54 35 2 17 63 14 59 34 61 16 21 36Press any key to continue5 总结调试过程中遇到的主要问题,是如何解决的;问题1:只走到63步原因:第64步就走完了,并且s62中只有

6、一个元素,这个判断条件(sstep.base=sstep.top&number(p2)=0)满足就进入了,而始终不能走完解决方法:改了判断条件,改为(sstep.base=sstep.top&number(p2)=0)&step!=n*n-1)解决方案:用InitStack(s1)初始化问题3:冒泡排序超出边界原因:循环次数大解决方案:减少循环次数看了其他同学,都差不多,我已经按马的下一位置最难的先走,再走难度次之的位置。 函数的功能尽量单一,调用函数时要注意是否修改了其他参数的值。一定要静下心去做。调试也很重要,从中能知道错在哪里。用vc+一定要学会这功能。 6 附录:源程序清单/SqSta

7、ck.h#pragma once#define OK 1#define ERROR 0#define OVERFLOW -2#define STACK_INIT_SIZE8#defineSTACKINCREMENT 57typedef struct int x,y;point;typedef point SElemType;typedef int Status;typedef struct SElemType * base;SElemType * top;int stacksize;SqStack;Status InitStack(SqStack &s);Status Push(SqStack

8、 &s,SElemType e);Status Pop(SqStack &s,SElemType &e);/SqStack.cpp#include SqStack.h#include #include Status InitStack(SqStack &s)s.base = ( SElemType * )malloc(STACK_INIT_SIZE*sizeof(SElemType);if(!s.base) return OVERFLOW;s.top = s.base;s.stacksize = STACK_INIT_SIZE;return OK;Status Push(SqStack &s,

9、SElemType e)if (s.top-s.base=s.stacksize)s.base=(SElemType * )realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType);if (!s.base)return OVERFLOW;s.top = s.base + s.stacksize;s.stacksize+=STACKINCREMENT;*s.top+ = e;return OK;Status Pop(SqStack &s,SElemType &e)if(s.top=s.base)return ERROR;e

10、 = *-s.top;return OK;/horse.cpp#include #include #include SqStack.hint horizontal=2,1,-1,-2,-2,-1,1,2;int vertical=-1,-2,-2,-1,1,2,2,1;int board88=0;int step=1;SqStack s65;SqStack s1;#define n 8void exit(point p);/计算出下一步可能位置,按其各个位置下一个位置的和压栈到s中int number(point p);/找出当前位置下一步的各种可能位置,计算可能之和void next(poi

11、nt p);/找出各个位置并将其步数记录bool legal(point p);/判断是否可行void main()point p;printf(输入x(0-%d),y(0-%d)n,n-1,n-1);scanf(%d%d,&p.x,&p.y);while(!(p.x=0)&(p.xn)&(p.y=0)printf(输入不合法,重输入!n);printf(输入x(0-%d!),y(0-%d!)n,n-1,n-1);scanf(%d%d,&p.x,&p.y);InitStack(s1);/初始化栈next(p);for (int i=0;in;i+)/打印棋盘for (int j=0;jn;j+

12、)printf(%5d,boardij);printf(n);int number(point p)/找出当前位置下一步的各种可能位置,计算可能之和point p1;int j=0;for(int i=0;i8;i+)p1.x=p.x+horizontali;p1.y=p.y+verticali;if(legal(p1)j+;return (j);void next(point p)/找出各个位置并将其步数记录point p1,p2;InitStack(sstep);boardp.xp.y=step;Push(s1,p);if(stepn*n)exit(p);Pop(sstep,p2);if

13、(sstep.base=sstep.top&number(p2)=0)&step!=n*n-1)Pop(s1,p1);boardp1.xp1.y=0;-step;while (sstep.base=sstep.top)Pop(s1,p1);boardp1.xp1.y=0;step-; Pop(sstep,p2);step+;next(p2);/退栈,悔棋else if(number(p2)=0&sstep.base!=sstep.top)Pop(sstep,p2);step+;next(p2);else if (number(p2)!=0&sstep.base=sstep.top)step+;

14、next(p2);else step+;next(p2);void exit(point p)/计算出下一步可能位置,按其各个位置下一个位置的和压栈到s中point temp; point p1; int j=0; point ap8=0; for(int i=0;i8;i+) p1.x=p.x+horizontali; p1.y=p.y+verticali; if(legal(p1) apj=p1; j+;/将下一步的可能位置储存在ap中for(int count=0;countnumber(p)-1;count+) /使用冒泡法,对下一步的八个规则的从大到小排序 for(int k=0;knumber(p)-1;k+)if (number(apk)number(apk+1)temp=apk+1;apk+1=apk;apk=temp; for (int t=0;t=0)&(p.xn)&(p.y=0)&(boardp.xp.y=0)return true;elsereturn false;13

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1