《C语言图形五子棋课程设计报告.docx》由会员分享,可在线阅读,更多相关《C语言图形五子棋课程设计报告.docx(27页珍藏版)》请在第一文库网上搜索。
1、兰州交通大学博文学院C语言课程设计设计题目:五子棋游戏专业:自动化班级:14自动化学号:20143109姓名:王续指导教师:史红霞二零一四年六月二十日兰州交通大学博文学院课程设计任务书姓名王续学号20143109班级14自动化成绩设计题目五子棋游戏主要设计内容本程序是在一个方阵上通过两人对弈的形式,依次在棋盘上放置两种颜色的棋子,哪一方先让五个棋子形成一条直线(包括横、竖、对角线3个方向),即为获胜。主要设计内容有:1、游戏操作规则1)按左右上下方向键移动棋子2)按空格键确定落棋子3)禁止在棋盘外按空格2、设计思路1)黑先、白后,从天元开始相互顺序落子。2)最先在棋盘横向、竖向、斜向形成连续的
2、相同色五个棋子的一方为胜。3)如分不出胜负,则定为平局。4)对局中中途退场均判为负。5)五连同时形成,先五为胜。本人在这次程序设计中负责主要设计内容1(游戏操作规则)教师意见电信工程系第1章:需求分析11.1五子棋背景112五子棋需求分析和流程设计11.2.1程序需求分析112.2程序流程设计2第2章:概要设计32.1 各类头文件和全局变量42.2 画面显示模块4第3章:详细设计61.1 玩家操作模块63. 2音效提供模块7第4章:调试分析73.1 图形模块74. 2玩家操作模块74.3胜负判断模块7第五章:源程序代码9第六章:程序运行结果20第七章:结论与心得21附录一Co1or命令的使用说
3、明22附录二ASCII码表22第1章:需求分析1.1五子棋背景传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为18X18,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。1.2五子棋需求分析和流程设计本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子时时可见,游戏界面有提示信息轮到何方下棋,人可以通过按键盘按键移动光标,再点击enter键摆放
4、棋子,并且每落一子都有系统声音,创新之处是可以提供悔棋功能。1.2.1程序需求分析根据功能需求,将程序分为画面显示、玩家操作、音效提供、胜负判断五个模块,以下分析各模块的需求。画面显示模块:程序开始运行时,显示制作者和给出欢迎及退出界面;游戏开始后要求生成18X18的棋盘图像,并在棋盘上方显示欢迎信息“欢迎p1ayour五子棋”,棋盘下方游戏显示应该轮到甲方或者乙方落子,棋盘左右显示双方操作方式,进行过程中,要求实时显示棋盘上已落下的棋子,甲方为白球,乙方为白圈;分出胜负后,要求给出游戏结束画面,并且询问用户是否需要继续游戏。玩家操作模块:程序开始时,需玩家确定选择“人人对战”后开始游戏;游戏
5、过程中,两个玩家通过不同的按键移动光标,选择落子;游戏进行过程中,当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”。游戏结束时,有玩家选择是否开始新游戏。音效提供模块:玩家每落一子,系统提供音效一声,增加下棋的趣味性。胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,棋盘下方弹出该色玩家胜出信息。1.2.2程序流程设计根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图20图1五子棋总体结构图图2程序总体流程图第2章:概要设计2.1 各类头文件和全局变量inc1ude#inc1ude读入键
6、盘输入的指令,如inc1udeftinc1udeintstartchoice;intwinner;intp1ayer;Q200200=0;charbutton;使用getch()函数/Q数组记录旗子2.2 画面显示模块画面显示模块由欢迎界面,游戏棋盘界面,确认是否退出对话框界面,以及感谢使用界面组成。画面显示模块函数如下:voidWe1comeO欢迎界面voidDraw()绘画游戏棋盘界面voidC1ean()清除一一运动的轨迹voidmenu_choose(charpress)voidPutDown()voidgoto_xy(intx,inty)选择是否退出游戏对话框显示落子函数光标移动函数
7、画面效果图如图3,4,5,6oC:UsersasusDesktopS子棋.exe欢迎PIay五子棋!作者:小萝莉HEHondaZSSB图3欢迎界面图主菜单*人人对战*M*图4主菜单界面图图5游戏界面图图6确认退出对话框第3章:详细设计1.1 玩家操作模块棋子的移动与落子有键盘上按键控制,本程序选取甲乙双方按键都为MS、tI、一、一和回车键,“b”,“ESC”,分别代表上移、下移、左移、右移光标和落子,悔棋,退出。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为
8、按键“b”。甲乙的落子后,程序会为落子处的数组元素赋一个特定值(玩家甲的棋子赋为1,玩家乙的棋子赋为2),用于判定胜负和悔棋。玩家操作模块主要由以下函数构成:voidRecord()记录棋子的情况voidgo_back(intx1,inty1)悔棋函数voidP1ay(charch)读取键盘的操作移动光标下棋和悔棋操作3. 2音效提供模块为了提高游戏的趣味性,我们为本游戏提供了简单系统音效。程序语句很简单printfW);/,a,表示蜂鸣声第4章:调试分析3.1 图形模块1 .在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把握有些欠缺。解决方案:参考书本以及goog1e,找出最
9、合适的位置坐标。2 .在构建棋子时候,发现C语言中似乎对颜色的处理有些错误,当棋谱线的颜色为白色时,无法构建黑色棋子,只能画出白色棋子。解决方案:用白圈区别于白球,类似白子和黑子。3.2 玩家操作模块1 .在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可以覆盖另一个棋子。解决方案:通过在PUtDown()函数中添加if条件语句,判定如果所在位置对应的数组值不等于0时,不能落子。2 .另一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外造成溢出。解决方案:通过if语句判定,如果操作框超出范围则移动到对应相反位置,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对
10、应位置。3 .还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色相同的颜色来覆盖后,棋谱线条部分也会被覆盖。解决方案:在gojack();即悔棋函数。用棋谱线来覆盖棋子(例如:I-卜等)。4. 3胜负判断模块1 .在胜负判断中一直没能想到好的办法来数据化判断哪方玩家获得胜利。解决方案:通过参考书籍并加以优化,得出将棋谱做成数组,定义甲方落下为1,乙方落下为2,初始为0,这样即不会造成冲突,也很好的解决了判断问题。2 .另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜负。解决方案:至今尚未解决,尝试过局部扫描,但失败了。3 .在当前玩家按下落子按键后,程序自动调用棋子显示子程序和
11、判断胜负子程序。当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b(即backspace)。4 .游戏中Esc键可以直接退出游戏。5 .游戏过程中,如果玩家1或者玩家2有一方获得胜利后,程序自动将提示哪一方获得了胜利,并可以选择是否继续新游戏。6 .游戏结束且玩家选择不再继续后,显示谢谢使用界面,再按任意键退出游戏。第五章:源程序代码ftinc1udeftinc1udettinc1udettinc1udeftinc1ude/*编译预处理,定义按键码*/define1EFT0x4b00defineRIGHT0x4d00defineDOWN0x5000define
12、UP0x4800*若想在游戏中途退出,可按Esc键*/defineESCOxO11b*SPACE键表示落子*/defineSPACE0x3920/*设置偏移量*/defineOFFSET20defineOFFSET_x4defineOFFSET_y3*定义数组大小*/defineN19*定义全局变量*/intstatusNN;/*定义的数组,保存状态*/intstep_x,step_y;/*行走的坐标*/intkey;/*港取按下的键盘的键*/intf1ag;/*玩家标志*/*自定义函数原型*/voidDrawBoard();voidDrawCirc1e(intx,inty,intco1or)
13、;voidA1ternationO;voidJudgeP1ayer(intx,inty);voidDone();intResu1tCheck(intx,inty);voidWe1comeInfoO;voidShowMessage();*定义函数*/*显示欢迎信息函数*/voidWe1comeInfoO(charch;/*移动光标到指定位置*/gotoxy(12,4);/*显示欢迎信息*/printf(zzWe1comeyoutogobangword!”);gotoxy(12,6);printf(,71.Youcanusetheup,down,1eftandrightkeytomovethech
14、essman,zz);gotoxy(12,8);printfCandyoucanpressSpacekeytoenterafteryoumoveit!);gotoxy(12,10);printf(z,2.YoucanuseEsckeytoexitthegametoo!);gotoxy(12,12);printf(,z3.Donnotmovethepiecesoutofthechessboard!);gotoxy(12,14);printf(z/D0youwanttocontinue?(Y/N)”);ch=getchar();*判断程序是否要继续进行*/if(ch=,n,I|ch=,N,)*如果不继续进行,则推出程序*/exit(0);/*画棋盘函数*/voidDrawBoard()(intx1,x2;inty1,y2;/*设置背景色*/Setbkco1or(2);/*设置线条颜色