




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
五子棋游戏程序设计(C语言实现)一、 设计任务与目标 设计两个人对战的五子棋游戏,游戏开始界面是显示游戏的规则,然后让用户输入命令以确定游戏是否开始,如果用户确定开始,那么要显示棋盘,接下来到了最重要的几步,两个玩家交替落子,当连续五个棋子在一条直线上时,一方赢棋,游戏结束。其中,有些问题就是平时基本的输入输出问题,例如:游戏规则,可以直接打印。棋盘的显示也是一般的图形输出问题,但是稍微复杂一些。需要改进的地方和达到的目标是:1、游戏的初始界面显示的是游戏规则,当玩家确定开始的时候要清除界面来显示棋盘。2、棋盘和棋子的显示,界面(棋子和棋盘)容易分辨,这要从颜色和图形上加以区分。3、要求一方用W(上)、S(下)、A(左)、D(右),另一方用、来移动光标,再分别用Z和空格键确定落子。4、当一方走棋时,另一方的按键应该设置为无效。5、游戏进行时打印提示信息,当一方赢棋后,要显示赢棋的字符,并询问玩家是否继续开始。6、可以随时退出游戏或重新开始游戏。二、 方案设计与论证 首先设置游戏的初始界面,采用白色背景和红色前景,这可以调用conio.h库函数实现打印游戏规则。询问玩家是不是开始游戏,通过选择YN来确定。其中会遇到这样的问题:当玩家输入的不是Y(y)或者N(n)时应该怎么办呢?如果采用scanf函数来接收命令,这样会显示一个不满足要求的字符,于是可以用getch函数来接收命令,判断输入的字符是否为Y(y)和N(n),如果是再显示出来。为了界面的简洁,进入游戏前先清除屏幕,调用system()函数来实现。然后打印棋盘,可以把背景设置为湖蓝色,这样棋盘和棋子更容易分辨。游戏开始后棋盘用黑色显示,这样易于区分。具体的思路是:由于棋盘是网格状的,所以选择一个基本图形字符串十,通过循环打印而构成一张大图。接下来确定落子的位置,这需要通过改变光标的位置来实现,考虑到是在vc6.0环境下编译文件, c语言中的有些库函数并不支持,所以选择了gotoxy()函数并结合window.h下的函数,通过键盘按键控制达到光标移动功能。定义一个二维数组来记录棋子落点数据,当棋盘上的某一个位置有棋子时,能判断这个位置不能再落子了。因为游戏设置的是两个玩家操作不同的按键来控制的,所以当一方走棋时,另一方的按键要设置成无效,采用的办法是过滤接收的字符。例如,当玩家一走棋时,只有当输入的字符为W、A、S、D、Z、Q、Esc时,才响应,而、空格以及其他字符则不响应。最后是判断输赢。根据五子棋规则,如果连续的五个相同颜色的棋子在一条直线上就算赢。于是用代码实现时,就确定了基本的思路:利用for循环来遍历棋盘上的落点。这里有四种情况,分别是从左往右,从上往下,从左下往右上,从左上往右下,判断是否有五子连续在一直线上,并且连续五个位置记录的数据相等时就打赢某一方赢了。要重新开始就输入Q。三、 程序框图或流程图,程序清单与调用关系程序清单:函数声明功能Main()主函数void drawqipan()画棋盘void gotoxy()光标定位 void movegb()移动光标void luozi()落棋子void judgewin()判断输赢void system()系统函数int startgame()游戏初始界面void initdata()初始化游戏数据程序调用关系:main gotoxy()luozi()gotoxy()InitData()gotoxy()StartGame()System()movegb()gotoxy()drawqipan()judgewin()gotoxy()程序流程图:void movegb() luozi() Press落子键是棋手1落子键落白棋落黑棋结束是是开始 开始press光标键移动光标 是 是输出否结束Void drawqipan()void judgewin()否棋子数小于五棋子为黑棋传来棋子数棋手1赢是是棋手2赢结束i=1,j=1i+否i20否是否输出十是j+是ij20是 结束int StartGame()开始打印游戏规则是否开始游戏否返回真是返回假结束四、全部源程序清单#include#include #include#define play1up w#define play1down s#define play1left a#define play1right d#define play2up 72#define play2down 80#define play2left 75#define play2right 77#define play1lq z#define play2lq #define N 20 #define playnext q#define exit 27int m=1; /*游戏循环控制*/int count=1; /*回合计数器*/int t=0; /*代表坐标交叉点有无棋子的状态*/int flag=1; /*输赢标志符*/int pNN; /*记录棋盘落子情况*/char qNN; /*记录棋盘交叉点棋子种类*/struct zuobiao /*坐标位置*/int x;int y;weizhi;/-void gotoxy(int x, int y) /*建立坐标函数*/ COORD c; c.X=x; c.Y=y; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c); /-void drawqipan()/*建立棋盘*/int i,j;for(i=0;iN;i+)for(j=0;j-1)weizhi.y-;if(weizhi.y0)weizhi.y=19;break;/*玩家1光标向下移动*/case play1down:if(weizhi.y19)weizhi.y=0;break;/*玩家1光标向上移动*/case play1left:if(weizhi.x-1)weizhi.x-;if(weizhi.x0)weizhi.x=19;break;/*玩家1光标向左移动*/case play1right:if(weizhi.x19)weizhi.x=0;break;/*玩家1光标向右移动*/case play2up:if(weizhi.y-1)weizhi.y-;if(weizhi.y0)weizhi.y=19;break;/*玩家2光标向上移动*/case play2down:if(weizhi.y19)weizhi.y=0;break;/*玩家2光标向下移动*/case play2left:if(weizhi.x-1)weizhi.x-;if(weizhi.x0)weizhi.x=19;break;/*玩家2光标向左移动*/case play2right:if(weizhi.x19)weizhi.x=0;break;/*玩家2光标向右移动*/default: return ;gotoxy(2*(weizhi.x),weizhi.y);return ;/-void luozi(char press)/*落子*/if(press=play1lq)if(t=0&pweizhi.xweizhi.y=0)printf();gotoxy(2*weizhi.x,weizhi.y);qweizhi.xweizhi.y=press;pweizhi.xweizhi.y=1;t=1;count+;if(press=play2lq)if(t=1&pweizhi.xweizhi.y=0)printf();gotoxy(2*weizhi.x,weizhi.y); qweizhi.xweizhi.y=press; pweizhi.xweizhi.y=1; t=0;count+;/-void judgewin(char press)/*判断输赢*/int i,count1,count2=0,count3=0;struct zuobiao p;for(i=0;i=-4;count1-) switch(i)case 0:p.x=weizhi.x-count1;p.y=weizhi.y;break;/*从左往右判断是否有五子连续在一直线上*/case 1:p.x=weizhi.x;p.y=weizhi.y+count1;break;/*从上往下判断是否有五子连续在一直线上*/case 2:p.x=weizhi.x-count1;p.y=weizhi.y+count1;break; /* 从左上往右下判断是否有五子连续在一直线上*/case 3:p.x=weizhi.x-count1;p.y=weizhi.y-count1;break; /*从左下往右上判断是否有五子连续在一直线上*/ if(p.x=0&p.y=0)if(qp.xp.y=play1lq) count2+;count3=0; if(qp.xp.y=play2lq)count3+;count2=0;if(count2=5)gotoxy(2*22,8);flag=0;printf(黑棋胜!);gotoxy(0,21); printf(Play again press q,and press Esc escape!n);break;else count2=0; if(count3=5)gotoxy(2*22,8);flag=0;printf(白棋胜!);gotoxy(0,21); printf(Play again press q,and press Esc escape!n);break; else count3=0;/-void InitData()/*数据初始化*/system(cls);drawqipan();count=1;t=0;flag=1;weizhi.x=0;weizhi.y=0;gotoxy(0,0);/-int StartGame()/*游戏开始界面*/char ch;system(COLOR 74);printf(n);printf( 五子棋游戏nn);printf(五子棋游戏操作规则:n);printf( 按键说明:玩家一,W、S、A、D分别为上、下、左、右,Z为确定落棋n);printf(玩家二,、 分别为上、下、左、右,空格键为确定落棋。n);printf( Q键为重新开始,按Esc键退出。n);printf( 禁止在棋盘外按空格。nn);printf(你是否接受上述的游戏规则(Y/N):);ch=getch();while(ch!=Y&ch!=y&ch!=N&ch!=n) ch=getch();if(ch=Y|ch=y) putchar(ch); getch(); putchar(n);return 1; putch(ch);putchar(n);return 0;/-void main()/*主函数*/char press;if(StartGame()system(cls);system(COLOR 30);/*背景颜色和前景颜色*/drawqipan();gotoxy(0,0);while(m)if(count%2&flag)gotoxy(2*22,8);printf(黑棋走!);gotoxy(2*weizhi.x,weizhi.y);if(count%2=0&flag)gotoxy(2*22,8);printf(白棋走!);gotoxy(2*weizhi.x,weizhi.y);press=getch();if(count%2&(press!=play1up&press!=play1down&press!=play1left&press!=play1right& press!=play1lq&press!=playnext&press!=exit)continue;if(!(count%2)&(press!=play2up&press!=play2down&press!=play2left&press!=play2right &press!=play2lq&press!=playnext&press!=exit)continue;if(flag=0&press!=playnext&press!=exit) continue;movegb(press);switch(press)case play1lq:case play2lq:luozi(press);judgewin(press);break;case playnext:InitData();break;case exit :m=0;break;default :break;五、 程序运行的测试与分析 开始用的是getchar()函数接收命令,当玩家输入的不是Y(y)/N(n)时的效果如下图,此时考虑采用不回显的方式输入命令,这里用getch()函数,只有当玩家输入正确的命令时才会显示到屏幕上。另一个问题出现了,当进入游戏界面,显示棋盘后,光标的位置在左上角,这是因为源代码设置的光标的初始位置为(0,0)坐标。为了解决这个问题,于是调用system(“cls”)函数清屏,这样棋盘的位置就在左上再进一步修改一下界面,达到如下效果:进入游戏发现双方可以同时控制光标的移动,分析了代码知道,在接收了键盘的数据后,直接就调用了movgb()函数,没用对press进行分析过滤加入过滤条件再调试这时虽然能实现对另一方按键的限制,但是又有很多问题。比如玩家一连续按两次Z键(即落棋后又按了一下Z),接下来应该是玩家二控制键盘的,而实际却只有玩家一才能控制。再回过去分析代码:变量count是记录
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业互联网平台生物识别技术在智能家居行业的应用趋势报告
- 人工智能通识 课 件 第四章:AI背后的那些事儿:风险、监管与责任
- 2025年湖南省永州市中考适应性考试物理试题(含答案)
- 《抵押合同》模板
- 计算机组成原理 课件 3 存储系统
- 《美术的力量》课件 2025-2026学年浙人美版(2024)初中美术八年级上册
- 巡察整改业务培训会课件
- 输电线路红外测温课件
- 尾板车安全操作培训课件
- 输液泵的培训课件
- 抗凝剂皮下注射技术临床实践指南2024版
- 依法治校视角下高校后勤管理法律风险的识别与化解策略
- 2025年法学专业基础课程试题及答案
- 腰椎管狭窄症病例讨论
- 部编版语文(2024)二年级上册第一单元综合素养测评A卷(含答案)
- 工程质量事故案例课件
- 多囊卵巢综合症及护理方法
- 2025年城市更新与历史文化街区保护相结合的社区治理模式研究报告
- DB1311T 091-2025 旧水泥混凝土路面多锤头碎石化施工技术规范
- 前臂骨折护理查房
- 经济数学微积分 杨慧卿 第4版 教案 第1-3章 函数、极限与连续;一元函数微积分;一元函数积分学
评论
0/150
提交评论