




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
兰州交通大学博文学院C语言课程设计 设计题目: 五子棋游戏 专 业: 自动化 班 级: 14自动化 学 号: 20143109 姓 名: 王续 指导教师: 史红霞 二零一四年六月二十日兰州交通大学博文学院课程设计任务书姓 名王续学号20143109班级14自动化成绩设计题目五子棋游戏主要设计内 容 本程序是在一个方阵上通过两人对弈的形式,依次在棋盘上放置两种颜色的棋子,哪一方先让五个棋子形成一条直线(包括横、竖、对角线3个方向),即为获胜。主要设计内容有:1、游戏操作规则 1)按左右上下方向键移动棋子 2) 按空格键确定落棋子 3) 禁止在棋盘外按空格2、设计思路 1) 黑先、白后,从天元开始相互顺序落子。 2) 最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。 3) 如分不出胜负,则定为平局。 4) 对局中中途退场均判为负。 5) 五连同时形成,先五为胜。本人在这次程序设计中负责主要设计内容1(游戏操作规则)教师意见 电信工程系目 录第1章:需求分析1 1.1五子棋背景.11.2五子棋需求分析和流程设计 .11.2.1 程序需求分析.11.2.2程序流程设计.2第2章:概要设计.32.1 各类头文件和全局变量.42.2 画面显示模块.4第3章:详细设计 .63.1 玩家操作模块.6 3.2音效提供模块.7第4章:调试分析.74.1 图形模块.7 4.2 玩家操作模块. 74.3 胜负判断模块 .7第5章 :源程序代码.9第6章 :程序运行结果.20第七章:结论与心得.21附录一Color命令的使用说明.22 附录二 ASCII 码表.22 第1章:需求分析1.1五子棋背景传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为1818,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。1.2 五子棋需求分析和流程设计本程序设计为人与人对弈,一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己的棋子五子相连,首先实现五子相连的一方获胜。程序执行过程中,要求棋盘、棋子时时可见,游戏界面有提示信息轮到何方下棋,人可以通过按键盘按键移动光标,再点击enter键摆放棋子,并且每落一子都有系统声音,创新之处是可以提供悔棋功能。1.2.1 程序需求分析根据功能需求,将程序分为画面显示、玩家操作、音效提供、胜负判断五个模块,以下分析各模块的需求。画面显示模块:程序开始运行时,显示制作者和给出欢迎及退出界面;游戏开始后要求生成1818的棋盘图像,并在棋盘上方显示欢迎信息“欢迎play our五子棋”,棋盘下方游戏显示应该轮到甲方或者乙方落子,棋盘左右显示双方操作方式,进行过程中,要求实时显示棋盘上已落下的棋子,甲方为白球,乙方为白圈;分出胜负后,要求给出游戏结束画面,并且询问用户是否需要继续游戏。玩家操作模块:程序开始时,需玩家确定选择“人人对战”后开始游戏;游戏过程中,两个玩家通过不同的按键移动光标,选择落子;游戏进行过程中,当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”。游戏结束时,有玩家选择是否开始新游戏。 音效提供模块:玩家每落一子,系统提供音效一声,增加下棋的趣味性。胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,并着色连成一线的五子,棋盘下方弹出该色玩家胜出信息。1.2.2程序流程设计 根据程序需求分析结果,可以得出程序的总体结构图如图1,程序总体流程图如图2。 五子棋游戏模块二:玩家操作模块三:音效提供模块四:胜负判断模块一:画面显示 图1 五子棋总体结构图开始制作者展示进入菜单界面N人人对战?退出游戏Y是否继续新游戏?开始游戏ESCY确认退出?b悔棋甲方判断NEnter甲方获胜?退出游戏显示甲方获胜消息Y确认退出?N乙方判断ESCb悔棋YEnterN乙方获胜?显示乙方获胜消息YN 图2 程序总体流程图第2章:概要设计2.1 各类头文件和全局变量#include #include#include #include/使用getch()函数int startchoice; /int winner; /int player; /Q200200= 0;/Q数组记录旗子char button;/读入键盘输入的指令,如2.2 画面显示模块画面显示模块由欢迎界面,游戏棋盘界面,确认是否退出对话框界面,以及感谢使用界面组成。 画面显示模块函数如下:void Welcome() /欢迎界面void Draw() /绘画游戏棋盘界面void Clean()/清除运动的轨迹void menu_choose(char press)/选择是否退出游戏对话框void PutDown()/显示落子函数void goto_xy(int x, int y) /光标移动函数 画面效果图如图3,4,5,6。 图3 欢迎界面图 图4 主菜单界面图 图5 游戏界面图 图6 确认退出对话框第3章:详细设计3.1 玩家操作模块棋子的移动与落子有键盘上按键控制,本程序选取甲乙双方按键都为W、S、和回车键,“b”,“ESC”,分别代表上移、下移、左移、右移光标和落子,悔棋,退出。在光标移动的过程中,光标按照玩家按键移动;在玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”。甲乙的落子后,程序会为落子处的数组元素赋一个特定值(玩家甲的棋子赋为1,玩家乙的棋子赋为2),用于判定胜负和悔棋。玩家操作模块主要由以下函数构成:void Record() /记录棋子的情况void go_back(int x1,int y1)/悔棋函数void Play(char ch)/读取键盘的操作 移动光标 下棋和悔棋操作3.2音效提供模块为了提高游戏的趣味性,我们为本游戏提供了简单系统音效。程序语句很简单 printf(a);/a表示蜂鸣声第4章:调试分析4.1 图形模块1在图形模块中,因为是第一次使用,所以刚开始时对于棋盘创建的位置把握有些欠缺。解决方案:参考书本以及google,找出最合适的位置坐标。2. 在构建棋子时候,发现C语言中似乎对颜色的处理有些错误,当棋谱线的颜色为白色时,无法构建黑色棋子,只能画出白色棋子。解决方案:用白圈区别于白球,类似白子和黑子。4.2 玩家操作模块1. 在玩家操作模块中,出现的最大问题之一就是棋盘已经有棋子的地方还可以覆盖另一个棋子。解决方案:通过在PutDown()函数中添加if条件语句,判定如果所在位置对应的数组值不等于0时,不能落子。2. 另一个问题就是之前提到的,操作定位框的时候会将定位框移到棋盘之外造成溢出。解决方案: 通过if语句判定,如果操作框超出范围则移动到对应相反位置,例如移动棋盘最上端,若继续向上移动,则移动至棋盘最下端对应位置。3. 还有一个就是悔棋模块中,通过将现有棋子覆盖与棋盘底色相同的颜色来覆盖后,棋谱线条部分也会被覆盖。解决方案:在go_back();即悔棋函数。用棋谱线来覆盖棋子(例如: 等)。4.3 胜负判断模块1. 在胜负判断中一直没能想到好的办法来数据化判断哪方玩家获得胜利。解决方案:通过参考书籍并加以优化,得出将棋谱做成数组,定义甲方落下为1,乙方落下为2,初始为0,这样即不会造成冲突,也很好的解决了判断问题。2. 另一个问题在于一直不能优化代码做到不每次都扫描整个棋盘来判断胜负。解决方案:至今尚未解决,尝试过局部扫描,但失败了。3. 在当前玩家按下落子按键后,程序自动调用棋子显示子程序和判断胜负子程序。当前玩家下棋后,另一位玩家下棋前,当前玩家可以悔棋。悔棋提示在棋盘右下方,为按键“b”(即backspace)。4.游戏中Esc键可以直接退出游戏。5.游戏过程中,如果玩家1或者玩家2有一方获得胜利后,程序自动将提示哪一方获得了胜利,并可以选择是否继续新游戏。6.游戏结束且玩家选择不再继续后,显示谢谢使用界面,再按任意键退出游戏。第五章:源程序代码 #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) 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 ; /*根据不同的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) /*按下确定键后,如果棋子当前位置的状态为0*/ if(statusstep_xstep_y=0) /*则更改棋子当前位置的状态在flag表示是哪个行棋者行的棋*/ statusstep_xstep_y=flag ; /*如果判断当前行棋者获胜*/ if(ResultCheck(step_x,step_y)=1) /*以指定频率打开PC扬声器*/ sound(1000); /*扬声器的发生时间,为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); settextstyle(1,0,5); /*三重笔划字体, 水平放大5倍*/ outtextxy(20,20,Congratulation !); setcolor(15); settextstyle(3,0,4); /*如果是Player1获胜,显示获胜信息*/ if(flag=1) /*无衬笔划字体, 水平放大5倍*/ outtextxy(20,120,Player1 win the game !); /*如果是Player1获胜,显示获胜信息*/ if(flag=2) /*无衬笔划字体, 水平放大5倍*/ outtextxy(20,120,Player2 win the game !); setcolor(14); settextstyle(2,0,8); getch(); exit(0); /*如果当前行棋者没有获胜,则交换行棋方*/ Alternation(); /*提示行棋方是谁*/ ShowMessage(); break; else break ; /*显示行棋方函数*/void ShowMessage() /*轮到Player1行棋*/ if(flag=1) setcolor(2); settextstyle(1,0,1); gotoxy(100,30); /*覆盖原有的字迹*/ outtextxy(100,30,Its turn to Player2 !); setcolor(12); settextstyle(1,0,1); outtextxy(100,30,Its turn to Player1 !); /*轮到Player2行棋*/ if(flag=2) setcolor(2); settextstyle(1,0,1); /*覆盖原有的字迹*/ outtextxy(100,30,Its turn to Player1 !); setcolor(12); settextstyle(1,0,1); gotoxy(100,20); outtextxy(100,30,Its turn to Player2 !); /*主函数*/int main() int gdriver; int gmode; int errorcode; /*清空文本模式窗口*/ clrscr(); /*显示欢迎信息*/ WelcomeInfo(); gdriver=DETECT; gmode=0; /*初始化图形系统*/ initgraph(&gdriver,&gmode,); /*返回最后一次不成功的图形操作的错误代码*/ errorcode=graphresult(); if (errorcode!= grOk) /*根据错误代码输出错误信息串*/ printf(nNotice:Error occured when grphics initialization: %sn,grapherrormsg(errorcode); printf(Press any key to quit!); getch(); exit(1); /*设置flag初始值,默认是Player1先行*/ flag=1; /*画棋盘*/ DrawBoard(); ShowMessage(); do step_x=0 ; step_y=0 ; JudgePlayer(step_x-1,step_y-1); do /*如果没有键按下,则bioskey(1)函数将返回0*/ while(bioskey(1)=0); /*获取从键盘按下的键值*/ key=bioskey(0); /*根据获得的键值进行下棋操作*/ Done(); while(key!=SPACE&key!=ESC); while(key!=ESC); /*关闭图形系统*/ closegraph(); return 0; 第6章 :程序运行结果 第7章:结论与心得 经历了这次课程设计的设计和制作的整个过程,我才发现我知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我九牛二虎之力,不说其他的,只说时间上面,我在宿舍里面熬了三个通宵,更不用说白天的时间了。这次作课程设计我也是收获很大,首先,我对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我学会用了。其次,我这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我学到了一些书本中学不到的知识,让我长了见识。同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。这次作的这一个设计,虽然我自己觉的很有的成就感,但是这必竟是我第一次作C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我一定会做的更好。 附录一 Color命令的使用说明颜色属性由两个十六进制数字指定 - 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一: 0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 湖蓝色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色附录二 ASCII 码表ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。值 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响控制字符二进制 十进制 十六进制 缩写 解释 0000 0000 0 00 NUL 空字符(Null) 0000 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年咨询工程师真题及参考答案详解(培优A卷)
- 2024-2025学年度注册公用设备工程师预测复习含答案详解(培优B卷)
- 2024年土木工程建筑施工考前冲刺练习题附参考答案详解【综合题】
- 2025年苏州工业职业技术学院单招《物理》考试彩蛋押题附参考答案详解(综合卷)
- 2024-2025学年中医助理医师自我提分评估及答案详解【全优】
- 传染病患者排泄护理与感染防控要点
- 2023年度高升专通关考试题库【名校卷】附答案详解
- 2025年城市公共自行车智能化改造项目的智能化管理方案报告
- 中班科学领域教案《奇妙的磁铁》反思
- 上海市2025-2026学年八年级语文上学期第一次月考复习试卷(含答案)
- 成品油市场管理办法培训
- 2025至2030中国管理咨询行业产业运行态势及投资规划深度研究报告
- 【课件】绝对值(课件)数学人教版2024七年级上册
- 适当性管理讲课件
- 上海爱尔眼科医院营销策略:基于市场细分与竞争优势的深入探究
- 苏教版三年级上册综合实践活动教案
- 2025-2030中国拟薄水铝石市场投资效益与未来供需形势分析报告
- 2025年中国盐业集团有限公司所属企业招聘笔试冲刺题(带答案解析)
- 2024年四川省委网信办遴选公务员真题
- 天车设备安全管理制度
- 活动承办方协议书
评论
0/150
提交评论