《算法设计与分析课程设计论文五子棋游戏.doc》由会员分享,可在线阅读,更多相关《算法设计与分析课程设计论文五子棋游戏.doc(18页珍藏版)》请在三一办公上搜索。
1、算法设计与分析课程设计论文五子棋游戏学生姓名: 学生学号: 200710802017 院(系): 计算机学院 年级专业: 2007级信息与计算科学 指导教师: 2010-6-11 目录摘要21问题的提出32 问题的分析33 程序及流程的设计43.1概要设计43.2模块及其功能介绍53.2.1定义全局变量53.2.2Main()主函数53.2.3drawqp()画棋盘函数53.2.4win()判断是否胜出函数53.2.5Gameplay()双人对战函数53.2.6Xandy()显示光标纵横坐标函数63.2.7图形功能函数64 调试分析7总结8参考文献9附 录: 源程序10摘要本问介绍的一个五子棋
2、游戏的编写和设计,本游戏的依据就是下棋的双方各持黑白棋子,当某方在横、纵或对角方向连成五个棋子,则认为该玩家胜利,游戏结束。该程序用C语言编写,主要有C语言函数的调用(其中包括图形函数,判断函数等)和可视化编程,还有数组的应用,比如在该程序中就是用一个二维数组来表示棋盘。从程序表面看,这是一个二维平面图,所以数据用二维数组来表示,数组两个下标可以表示棋盘上的位置,数组元素的值代表棋格上的状态,共有三种情况,分别是0代表空格,1代表白棋,2代表黑棋。这样程序的主要工作是接收棋手按键操作,棋手1用Up、Down、Left、Right控制光标移动,回车键表示落子。棋手2用W、S、A、D控制光标移动,
3、空格键表示落子。一旦接收到回车键或空格键,说明棋手落子,先判断是否是有效位置,也就是说已经有棋子的位置不能重叠落子。落子成功后,马上判断以该位置为中心的八个方向:上、下、左、右、左上、左下、右上、右下是否有相同颜色的棋子连成五子,如果连成五子,则游戏结束,输出相应的信息。如果想退出游戏,可以按Esc键。关键词 五子棋,C语言,二维数组,函数 五子棋游戏设计1问题的提出连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五
4、子则该方就算获胜。此时,算法结束。当有任何一方想退出时,都可在算法中实现。2 问题的分析为了要实现五子棋的人和人的对战,我们就首先要实现通过键盘对棋子的操作。因此我们必须要先定义一个键盘,并用二维数组来表示棋盘并把它用图形函数输出在屏幕上。因此我们可以定义结构体来表示一个完整的棋盘。为了让人可以移动光标来选择下棋位置,我们必须要定义函数来输出光标的位置(既横纵坐标)。我们实现了人和人的对战就要胜负,因此我分析要定义一个判断函数来判断谁胜谁负。要是我们在定义一个游戏开始函数来控制游戏的还是和一个游戏结束函数来控制游戏的结束,那么我们这就是一个完整的游戏过程,则我们这个程序就基本实现了人和人的对战
5、。3 程序及流程的设计 开始西 安 工 业 大 学计算机科学与工程学院算 法 设 计 与 分 析 课 程 设 计题 目: 五子棋 班 级: 050606 人 数: 13人 成 员: 陈玮 高谦 侯夕杰 马涛 宋文彬 王伟 周仁文 邵文清赵瑞红 李盈超 尉建明 陈建军 张祥雄 学 号: 时 间: 2008年元月16日 目 录1课程设计报告-1 1.1问题描述-1 1.2需求分析-1 1.3概要设计-1 1.4详细设计-页码 1.5调试分析-页码2源程序-页码3程序的说明文件-页码4课设总结-页码1. 课程设计报告1.1问题描述连珠(五子棋)是有两个人在一盘棋上进行对抗的竞技运动。在对局开始时,先
6、由用户选择哪方先开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围的交叉点上落子,如此轮流落子,直到某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方就算获胜。此时,算法结束。当有任何一方想退出时,都可在算法中实现。 1.2需求分析 (1)、输出游戏规则并由用户决定是否遵守并开局。 (2)、要求动态画出棋盘大小。(3)、画棋子并确定其颜色。 (4)、玩家轮流下棋。(5)、判断键盘输入哪个键按规则执行操作 (6)、判断谁先落棋。 (7)判断赢家1.3概要设计 流程图:Y Y N Y N Y N Y 1.4详细设计 1.5调试分析 运行结果:屏幕显示:Please input w
7、ho is first:1 or 2 当输入1时,白棋先走;当输入2时,红棋先走。屏幕显示:Please input the size of chessbox:从键盘输入t值,则棋盘大小为t*t型。屏幕显示:Left, Right, Up, Down KEY to move, Space to put, ESC-quit 及棋盘,棋子,用上下左右键控制棋子向,用空格键确定棋子的落点 。当白棋赢时,显示The White Win ! 当红棋赢时,显示The Red Win !遇到的问题:算法改进思想:将棋盘由原先的固定大小改进为可动态变化,由原来固定的白棋先走改进为让用户可以选择哪方先落子。2源
8、程序#include#include#include#include#include#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define SPACE 0x3920#define BILI 20#define JZ 4#define JS 3#define N 19int boxNN,s; /*落子点*/int step_x,step_y ;int key ;int flag,i,j ;void draw_box();void draw_cicle(
9、int x,int y,int color);void change();void judgewho(int x,int y);void judgekey();int judgeresult(int x,int y);void attentoin();void attentoin() /*游戏规则*/ char ch ; printf(Play attentoins:nn); printf(1. Press Left,Right,Up,Down Key to move Piecenn); printf(2. Press Space to place the Piecenn); printf(3
10、. DO NOT press Space outside of the draw_boxnn); printf(Do you accept the above Playing attentoins? Y/Other:); while(1) ch=getche(); if(ch=Y|ch=y) break ; else exit(0); printf(nnwhat size of the draw_box:); scanf(%d,&s); printf(nnwho is the frist:1 or 2? ); while(1) scanf(%d,&flag); if(flag!=1&flag!
11、=2) printf(Error!n); else break; void draw_box() /*画出棋盘*/ int x1,x2,y1,y2 ; setbkcolor(LIGHTBLUE); setcolor(YELLOW); gotoxy(7,2); printf(Left, Right, Up, Down KEY to move, Space to put, ESC-quit.); for(x1=1,y1=1,y2=s;x1=s;x1+) line(x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI); for(x1=1,y1=1,x
12、2=s;y1=s;y1+) line(x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI); for(x1=1;x1=s;x1+) for(y1=1;y1=s;y1+) boxx1y1=0 ;void draw_cicle(int x,int y,int color) /*棋子*/ setcolor(color); setlinestyle(SOLID_LINE,0,1); x=(x+JZ)*BILI ; y=(y+JS)*BILI ; circle(x,y,8);void judgekey() switch(key) case LEFT :
13、if(step_x-1=1;i-) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(is) break ; else for(i=step_x+1,j=step_y;is)break ; step_x=i ; judgewho(step_x,step_y); break ; case DOWN : if(step_y+1s) break ; else for(i=step_x,j=step_y+1;js)break ; step_y=j ; judgewho(step_x,step_y); break ; case UP
14、: if(step_y-1=1;j-) if(boxij=0) draw_cicle(step_x,step_y,LIGHTBLUE); break ; if(j=1&step_x=1&step_y=1;j-) /*水平向左数*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;j5) return(1); n=0 ; for(j=x,k=y;k=1;k-) /*垂直向上数*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;k5) return(1); n=0 ; for(j=x,k=y;j=1,k=1;j-,k
15、-) /*向左上方数*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;j=s,k5) return(1); n=0 ; for(j=x,k=y;j=1;j+,k-) /*向右上方数*/ if(boxjk=flag) n+; else break ; for(j=x,k=y;j=1,k5) return(1); return(0); void main() int gdriver=VGA,gmode=VGAHI; clrscr(); attentoin(); initgraph(&gdriver,&gmode,c:tc); draw_box(); do
16、 step_x=0,step_y=0 ; judgewho(step_x-1,step_y-1); do while(bioskey(1)=0); key=bioskey(0); judgekey(); while(key!=SPACE&key!=ESC); while(key!=ESC); closegraph();_3程序的说明文件 本程序中包含一个主函数和七个子函数,它们的函数名及功能分别如下:void draw_box();画棋盘void draw_cicle(int x,int y,int color);画棋子并确定其颜色void change();改变玩家void judgewho
17、(int x,int y);判断谁落棋void judgekey();判断键盘输入哪个键按规则执行操作int judgeresult(int x,int y);判断赢家void attentoin();显示游戏规则4课设总结 从1月14日开始,我们进行了为期一周的算法课程设计。通过这次课程设计,我们拓宽了知识面,锻炼了能力,综合素质得到较大提高。 本次课程设计,使我们对从五子棋设计方案到设计的基本过程的设计方法、步骤、思路、有一定的了解与认识。在课程设计过程中,我们基本能按照规定的程序进行,先针对五子棋的设计收集、调查有关资料,其间,同组成员之间进行几次方案的讨论、修改,再讨论、再修改,最后定
18、案。设计方案确定后,又在老师指导下进行扩充详细设计,最终用c语言实现了可视化的五子棋算法。整个过程周密有序,对我们按时高质完成课程设计非常有利! 对我们计算机专业的本科生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。 课程设计达到了专业学习的预期目的。课程设计之后,我们普遍感到不仅实际动手能力有所提高,更重要的是进一步激发了我们对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进
19、行更深入的学习。 3.1概要设计 流程图:输出游戏规则 Error!玩家遵守?NY谁先下棋,输入棋盘大小s画出s*s大小的棋盘 用户决定谁先走白棋先走?N画红棋 画白棋 Y 下棋 改变玩家 下棋 横竖斜有五个相同颜色的棋子相连? N 白棋?Y 输出:The white win!输出:The red win! N 3.2模块及其功能介绍3.2.1定义全局变量int gamespeed=5000; int i,j,key; struct Sor int x; int y;/*x,y表示当前光标的位置*/ int yesNN;/* 0表示无棋子,1表示白色棋子,2表示黑色棋子*/ int kao;/
20、* 1表示白棋准备落子,2表示黑棋落子*/ int ok;/*1表示白棋胜出,2表示黑棋胜出*/ sor; 3.2.2Main()主函数按照语法规则,首先定义使用到的常数、全局变量、函数原型说明。棋盘状态用数组yes2020,初值为0,表示空格。函数的实体比较简单,调用图形驱动、画棋盘、人人对弈等自定义函数,一旦游戏结束后,关闭图形驱动,程序结束。3.2.3drawqp()画棋盘函数背景颜色设为黑色,从坐标(100,100)开始每隔20个单位用绿色画一条水平直线,一条垂直线,构成棋盘,用循环语句实现。画线函数line()的参数为线的起点和终点坐标,注意要计算正确。函数setfillstyle(
21、)可以设置填充模式和填充颜色,fillellipse(int x,int xradius,int yradius)以x和y为圆心,xradius和yradius为水平和垂直轴画一填充椭圆,当xradius和yradius相等时,则画出的是圆,用它表示棋子。3.2.4win()判断是否胜出函数本函数根据每次落子的位置,分别向上、下、左、右、左上、左下、右上、右下八个方向判断是否有相同颜色的棋子连成五子,如果成立,游戏就结束,并显示提示信息(如:红方获胜),否则继续落子。3.2.5Gameplay()双人对战函数这是游戏进行的函数,主要是接收棋手的按键消息,其处理过程如下:(1) 按Esc键程序可
22、以随时结束。(2) 按上下左右光标键,则改变棋子移动的坐标值。(3) 按回车键后判断:(4) 如落子的位置已经有棋则无效,继续按键。(5) 如落子位置是空格,可以将棋子落入格内,调用win()函数。(6) 如果棋子变化后,棋盘已下满了棋子,则游戏结束。显示平局信息。(7) 重复上述步骤,直到游戏结束。3.2.6Xandy()显示光标纵横坐标函数该函数的作用是在每次移动光标后,在屏幕左下角显示出光标的纵横坐标。3.2.7图形功能函数以下函数原形都在graphics.h中。(1)registerbgidriver():(2)initgraph(int *driver, int *mode, cha
23、r *path):用于初始化图形系统,并装入相应的图形驱动器。该函数把由driver所指向的图形驱动器代码装入内存。如果图形驱动器未装入内存,图形函数将不能操作。图形函数所用的屏显模式由mode所指向的整数值确定。最后,图形驱动器的路径是由path所指向的字符串给出。如果没有指定路径,就在当前工作路径上寻找。(3)rectangle(int left,int top,int right,int bottom):函数rectangle()用当前画出由坐标left,top及right,bottom所定义的矩形。(4)setcolor(int color):把当前画线颜色设置为color所指定的颜色
24、。每个图形显示卡的有效颜色由setpalette()提供。(5)closegraph():该函数使图形状态失效,并且释放用于保存图形驱动器和字体的系统内存。当你的程序既用到图形输出又用到非图形输出时,应该用此函数。该函数还把系统屏显模式返回到调用initgragh()前的状态。4 调试分析 该程序运行后就会在电脑屏幕上显示下面所示图象。该界面上边显示了两个玩家的控制键盘,和下棋方法。所以程序运行之后我们就够完成人和人的对战了,其结果如下图所示: 总结为期一周的算法课程设计到这里就要结束了,这次课程设计由于我本人对游戏的兴趣,我选择了五子棋游戏。在这为期一周的时间里,我不断的向同学和老师寻求帮助
25、,不断的在网上和图书馆查阅资料,感觉收获很大。这个程序是对编程基本功的一个训练,将分支、循环、数组、函数综合应用,而不仅限于编制独立的小程序,通过游戏过程增加编程的兴趣,提高编程水平。编制该程序我对以下的知识点进行的巩固和掌握:1.数组元素为结构体的数组应用。2.全局变量应用。3.按键的处理。4.数组元素图形坐标的对应。5.图形方式等等。虽然该程序是一个普通而又简单的程序,但是对于一C语言初级阶段的学生来说,是一个很好的锻炼甚至可以说是一个很好的提高。由于个人能力的限制该程序还有许多的缺陷,若要进一步的完善还需要对C语言更深一步的学习。该五子棋游戏由于要实现在屏幕上的可视化显示,所以要用到C语
26、言里面的图象函数,在图象函数这一快,以前学习C语言的时候就没有接触过,所以在编制这个程序的时候我遇到了很多困难。但是在老师和同学的帮助下我还是粗略的完成这次任务,所以我在这里我要感谢在这个过程中一直帮助我的老师和同学。参考文献1数据结构(C语言版),严蔚敏,清华大学出版社,20052算法设计与分析,王晓东主编,清华大学出版社,20053汪诗林等译,数据结构、算法与应用,(美)Sartaj Sahni著,机械工业出版社, 19994数据结构与算法分析,CLIFFORD A. SHAFFER著,张铭、刘晓丹译,电子工业出版社,19985 C语言完全手册,杨峰编著,科学出版社,20086 C语言程序
27、设计应用教程,刘玲,西南师范大学出版社,2006 附 录: 源程序#include#include#include#include#include#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011b#define SPACE 0x3920#define BILI 20#define JZ 4#define JS 3#define N 19int boxNN,s; /*落子点*/int step_x,step_y ;int key ;int flag,i,j ;void draw_box();void draw_cicle(int x,int y,int color);void change();void judgewho(int x,int y);void judgekey();int judgeresult(int x,int y);void attentoin();void attentoin() /*游戏规则*/ char ch ; printf(Play attentoins:nn); printf(1.