五子棋实验报告(含代码).doc_第1页
五子棋实验报告(含代码).doc_第2页
五子棋实验报告(含代码).doc_第3页
五子棋实验报告(含代码).doc_第4页
五子棋实验报告(含代码).doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

福 建 工 程 学 院实 验 报 告专业 计算机科学与技术 班级 计算机1001 座 号 3100301101 姓 名 张夷 日 期 2012/5/23 福建工程学院计算机与信息科学系实验报告 2010 2011 学年第 一 学期 任课老师: 章静 实验题目五子棋游戏程序开发实验时间实验开始日期:20120513 报告提交日期:20120523实验目的、要求一、实验题目:设计一个简单实用的人和人的五子棋游戏游戏程序。二、实验要求1该实验的课内学时是4个课时。2基本功能:1)用户可以选择白棋还是黑棋。2)胜负状态的判断;3)有棋子落下后棋盘状态的更新与显示;4)双方平局的判断(无空位落子)。实验设计内容一 实验设计的数据结构代码中所用到的头文件:#include#include#include#include#include编译预处理,定义按键码:#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x480#define ESC 0x011b #define SPACE 0x3920设置偏移量#define OFFSET 20#define OFFSET_x 4#define OFFSET_y 3定义全局变量#define N 19 int statusNN;/*定义的数组,保存光标状态*/int step_x,step_y;/*行走的坐标*/int key ;/*获取按下的键盘的键*/int flag; /*玩家标志*/二总体函数模块结构图:是没有构成获胜否是否是开始欢迎界面画棋盘18*18提示此时执行棋子的玩家Key!=ESCKey=SPACE执行下棋函数执行此刻棋子落下后该玩家是否获胜的判断函数更换执行棋子的玩家跳到获胜界面结束三重点函数分析1.绘制棋盘函数: 在此函数中通过各种绘图函数的调用及其设置画线类型函数的调用,使得游戏最终界面背景为绿色,棋盘为蓝色虚线构成。棋盘线条绘制中通过偏移量OFFSET实现。void DrawBoard() int x1,x2; int y1,y2; /*设置背景色*/ setbkcolor(2); /*设置线条颜色*/ setcolor(1); /*设置线条风格、宽度*/ setlinestyle(DOTTED_LINE,1,1); /*按照预设的偏移量开始画棋盘*/ for(x1=1,y1=1,y2=18;x1=18;x1+) line(x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFSET_y)*OFFSET); for(x1=1,y1=1,x2=18;y1=18;y1+) line(x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET); /*将各个点的状态设置为 0*/ for(x1=1;x1=18;x1+) for(y1=1;y1=18;y1+) statusx1y1=0; /*显示帮助信息*/ setcolor(14); /*设置字体、大小*/ settextstyle(1,0,1); outtextxy(19+OFFSET_x)*OFFSET,(2+OFFSET_y)*OFFSET,Player key:); setcolor(9); settextstyle(3,0,1); outtextxy(19+OFFSET_x)*OFFSET,(4+OFFSET_y)*OFFSET,UP-up ); outtextxy(19+OFFSET_x)*OFFSET,(6+OFFSET_y)*OFFSET,DOWN-down ); outtextxy(19+OFFSET_x)*OFFSET,(8+OFFSET_y)*OFFSET,LEFT-left); outtextxy(19+OFFSET_x)*OFFSET,(10+OFFSET_y)*OFFSET,RIGHT-right); outtextxy(19+OFFSET_x)*OFFSET,(12+OFFSET_y)*OFFSET,ENTER-space); setcolor(14); settextstyle(1,0,1); outtextxy(19+OFFSET_x)*OFFSET,(14+OFFSET_y)*OFFSET,Exit:); setcolor(9); settextstyle(3,0,1); outtextxy(19+OFFSET_x)*OFFSET,(16+OFFSET_y)*OFFSET,ESC);2.判断当前行棋方是否获胜函数:说明:此函数中,传入的参数为刚刚下过的棋子的点的坐标,传出参数为一个整形。经过判断如果形成5颗同色棋子相连则传出1,若没有则传出0.函数流程图: 否是否否是否是是否开始对刚刚落下的棋子横向探测K=x,j=yStatusjk= =flagJ-N1+;j-J=x;k=yStatusjk= =flagJ+J=5返回1,表示在横向上构成五子相连的胜局进行下一个方向的判断若其他方向上都不存在五子相连的胜利的情况,返回0结束J=1是代码: int ResultCheck(int x,int y) int j,k; int n1,n2 ; while(1) /*对水平方向进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;j=1;j-) /*向刚刚下的棋子的左侧依次探测*/ if(statusjk=flag) n1+; else break; for(j=x,k=y;j=5) /判断该色棋子是否有5颗 return(1); /*对垂直方向进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;k=1;k-) /*向刚刚下的棋子的上边依次探测*/ if(statusjk=flag) n1+; else break ; for(j=x,k=y;k=5) return(1); /*从左上方到右下方进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;(j=1)&(k=1);j-,k-) /*向刚刚下的棋子的左上方依次探测*/ if(statusjk=flag) n1+; else break; for(j=x,k=y;(j=18)&(k=5) return(1); /*从右上方到左下方进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;(j=1);j+,k-) if(statusjk=flag) n1+; /*向右上方探测*/ else break; for(j=x,k=y;(j=1)&(k=5) return(1); return(0); 3. 执行下棋函数:说明:根据键盘上下左右的移动进行棋子光标的移动,在向下一个位置点移动的过程中首先要判断他移动的方向的下一位子是否为空,当确定下一个位子为空时再判断是否要在该处按下代表落棋的空格键,若有按下落棋键则对该坐标处的status根据此时执棋棋手做出相应的标记;若下一个位置已经有棋子存在则自动跳过再对下一个坐标进行探测,查看此时是否有棋子存在;若到下个已经到达棋盘的最旁边则不再执行向此方向移动的操作。函数流程图:下棋函数向左走LEFT向右走RIGHT向上走UP向下走DOWN退出ESC放置棋子SPACE棋子的行走以LEFT方向为例:否是是是否否开始i=step_x-1;j=step_y;Stutasij= =0Step_x-1=1放置棋子部分流程图:否是是是开始判断现在的光标是否在棋盘内判断此位置是否为空Statusstep_xstep_y= =flag调用ResultCheck(step_x,step_y)= =1显示获胜界面交换执棋方结束 代码:void Done() int i ; int j ; int a=50; int b=50;/*根据不同的 key 值进行不同的操作*/ switch(key) /*棋子的移动要考虑下一个点的可达和光标此处的棋子的擦除*/ /*如果是向左移动的*/ case LEFT: /*如果下一步超出棋盘左边界则什么也不作*/ if(step_x-1=1;i-) if(statusij=0) /*对下一个点是否为空进行判断*/ DrawCircle(step_x,step_y,2); /*若一个欲到点位空,将现在的点的圈圈改为与背景相同的颜色从而达到擦除的效果*/ break ; if(i18) break ; else for(i=step_x+1,j=step_y;i18)break ; step_x=i ; /*对下一个点是否为空进行判断*/ JudgePlayer(step_x,step_y);/*根据不同的行棋者画不同颜色的圆*/ break ; /*如果是向下移动的*/ case DOWN : /*如果下一步超出棋盘下边界则什么也不作*/ if(step_y+1)18) break ; else for(i=step_x,j=step_y+1;j18) break ; step_y=j ; JudgePlayer(step_x,step_y); break ; /*如果是向上移动的*/ case UP : /*如果下一步超出棋盘上边界则什么也不作*/ if(step_y-1)=1;j-) if(statusij=0) DrawCircle(step_x,step_y,2); break ; if(j=1&step_x=1&step_y=18)/*如果操作是在棋盘之内*/ if(statusstep_xstep_y=0) /*按下确定键后,如果棋子当前位置的状态为 0*/ statusstep_xstep_y=flag ;/*则更改棋子当前位置的状态在 flag,表示是哪个行棋者行的棋*/ /*如果判断当前行棋者获胜*/ if(ResultCheck(step_x,step_y)=1) sound(1000);/*以指定频率打开 PC 扬声器*/ /*扬声器的发生时间,为 1 秒钟*/ delay(1000); nosound(); gotoxy(30,4); setbkcolor(BLUE); /*清除图形屏幕*/ cleardevice(); /*为图形输出设置当前视口*/ setviewport(100,100,540,380,1); /*绿色实填充*/ setfillstyle(1,2); /*设定填充方式*/ setcolor(YELLOW); rectangle(0,0,439,279); floodfill(50,50,14); /*填充一个有界区域*/ setcolor(12); circle(a,b,50); /*(20,20)为圆心,20 为半径画圆*/ line(20,50,30,25); line(30,25,40,50); line(60,50,70,25); line(70,25,80,50); line(30,60,50,80); line(50,80,70,60); settextstyle(1,0,5); /*三重笔划字体, 水平放大 5 倍*/ outtextxy(50,120,Congratulation !); setcolor(12); /*如果是 Player1 获胜,显示获胜信息*/ if(flag=1) settextstyle(1,0,5); outtextxy(150,30,Player1 ); /*如果是 Player2 获胜,显示获胜信息*/ if(flag=2) settextstyle(1,0,5); outtextxy(150,30,Player2 ); setcolor(15); settextstyle(3,0,4); /*无衬笔划字体, 水平放大 5 倍*/ outtextxy(100,180,win the game!); setcolor(14); settextstyle(2,0,8); getch(); exit(0); /*如果当前行棋者没有获胜,则交换行棋方*/ Alternation(); /*提示行棋方是谁*/ ShowMessage(); break; else break ; 调试过程记录 本次实验中问题代码的编写中一开始主要是对棋手行棋过程的实现中存在一些问题,在行棋时首先要注意把原来的棋子的位置空开,实验中采用将棋子颜色变为与背景色相同的颜色的办法来处理,但是在采用此种办法处理后棋盘处的地方也会出现绿色的缺口,后面采用将棋盘变为虚线的方式画出来从而解决了此问题;然后根据我们键盘输入的键向不同的方向移动棋子若该位置已经被其他棋子占据则设置一个循环一直在该方向上延伸寻找到空位再在该位置画出棋子;最后还要注意不同的棋手行使的棋子的颜色不同,要实现正确的画出棋子还要注意对此时的执棋方进行判断。实验结果记录以及与预期结果比较以及分析1欢迎界面:2.下棋a: 下棋b: 3胜利界面: 总结以及心得体会本次五子棋游戏的制作中,由于以前对游戏程序的编写没有很多的接触过,只做过一次迷宫游戏的经历而且那一的程序中还没有用到画图,所以一开始拿到题目没有什么思路。后面通过问老师对五子棋游戏的大概流程心中有数。我是先从各种画图函数先下手,然后在网上查资料了解了五子棋的行棋主要分为两大块一块是输赢的判断,另一部分就是下棋。在做好人人对战的功能后有考虑人机对战要怎么实现,但是由于人机对战时电脑方的行棋方式的可能行过多,目前只有考虑到12种的可能方式,其它方式正在考虑中。总之,在五子棋游戏的编写中,不仅学会以前没有用到过的画图函数的运用,增加了对程序编写的兴趣;而且对游戏程序的编写积累了非常宝贵的经验,明白了在程序编写时思路的清晰以及流程图的设计的重要性。同时,十分感谢老师在实验是给予的提示与耐心指导。谢谢!指导老师评阅意见指导老师: 年 月 日 代码:#include#include#include#include#include/*编译预处理,定义按键码*/#define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800/*若想在游戏中途退出, 可按 Esc 键*/#define ESC 0x011b /*SPACE 键表示落子*/#define SPACE 0x3920 /*设置偏移量*/#define OFFSET 20#define OFFSET_x 4#define OFFSET_y 3/*定义数组大小*/#define N 19 /*定义全局变量*/int statusNN;/*定义的数组,保存光标状态*/int step_x,step_y;/*行走的坐标*/int key ;/*获取按下的键盘的键*/int flag; /*玩家标志*/*自定义函数原型*/void DrawBoard();void DrawCircle(int x,int y,int color);void Alternation(); void JudgePlayer(int x,int y);void Done();int ResultCheck(int x,int y);void WelcomeInfo(); void ShowMessage();/*定义函数*/ /*显示欢迎信息函数*/void WelcomeInfo() char ch ; gotoxy(12,4); /*移动光标到指定位置*/ /*显示欢迎信息*/ printf(Welcome you to gobang word!); gotoxy(12,6); printf(1.You can use the up,down,left and right key to move the chessman,); gotoxy(12,8); printf( and you can press Space key to enter after you move it !); gotoxy(12,10); printf(2.You can use Esc key to exit the game too !); gotoxy(12,12); printf(3.Don not move the pieces out of the chessboard !); gotoxy(12,14); printf(DO you want to continue ?(Y/N); ch=getchar(); /*判断程序是否要继续进行*/ if(ch=n|ch=N) /*如果不继续进行,则推出程序*/ exit(0);/*画棋盘函数*/void DrawBoard() int x1,x2; int y1,y2; /*设置背景色*/ setbkcolor(2); /*设置线条颜色*/ setcolor(1); /*设置线条风格、宽度*/ setlinestyle(DOTTED_LINE,1,1); /*按照预设的偏移量开始画棋盘*/ for(x1=1,y1=1,y2=18;x1=18;x1+) line(x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x1+OFFSET_x)*OFFSET,(y2+OFFSET_y)*OFFSET); for(x1=1,y1=1,x2=18;y1=18;y1+) line(x1+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET,(x2+OFFSET_x)*OFFSET,(y1+OFFSET_y)*OFFSET); /*将各个点的状态设置为 0*/ for(x1=1;x1=18;x1+) for(y1=1;y1=1;j-) /*向刚刚下的棋子的左侧依次探测*/ if(statusjk=flag) n1+; else break; for(j=x,k=y;j=5) /判断该色棋子是否有5颗 return(1); /*对垂直方向进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;k=1;k-) /*向刚刚下的棋子的上边依次探测*/ if(statusjk=flag) n1+; else break ; for(j=x,k=y;k=5) return(1); /*从左上方到右下方进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;(j=1)&(k=1);j-,k-) /*向刚刚下的棋子的左上方依次探测*/ if(statusjk=flag) n1+; else break; for(j=x,k=y;(j=18)&(k=5) return(1); /*从右上方到左下方进行判断是否有 5 个同色的圆*/ n1=0; n2=0; for(j=x,k=y;(j=1);j+,k-) if(statusjk=flag) n1+; /*向右上方探测*/ else break; for(j=x,k=y;(j=1)&(k=5) return(1); return(0); /*执行下棋函数*/void Done() int i ; int j ; int a=50; int b=50;/*根据不同的 key 值进行不同的操作*/ switch(key) /*棋子的移动要考虑下一个点的可达和光标此处的棋子的擦除*/ /*如果是向左移动的*/ case LEFT: /*如果下一步超出棋盘左边界则什么也不作*/ if(step_x-1=1;i-) if(statusij=0) /*对下一个点是否为空进行判断*/ DrawCircle(step_x,step_y,2); /*若一个欲到点位空,将现在的点的圈圈改为与背景相同的颜色从而达到擦除的效果*/ break ; if(i18) break ; else for(i=step_x+1,j=step_y;i18)break ; step_x=i ; /*对下一个点是否为空进行判断*/ JudgePlayer(step_x,step_y);/*根据不同的行棋者画不同颜色的圆*/ break ; /*如果是向下移动的*/ case DOWN : /*如果下一步超出棋盘下边界则什么也不作*/ if(step_y+1)18) break ; else for(i=step_x,j=step_y+1;j18) break ; step_y=j ; JudgePlayer(step_x,step_y); break ; /*如果是向上移动的*/ case UP : /*如果下一步超出棋盘上边界则什么也不作*/ if(step_y-1)=1;j-) if(statusij=0) DrawCircle(step_x,step_y,2); break ; if(j=1&step_x=1&step_y=18)/*如果操作是在棋盘之内*/ if(statusstep_xstep_y=0) /*按下确定键后,如果棋子当前位置的状态为 0*/ statusstep_xstep_y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论