




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
* 实践教学实践教学 * *大学大学 计算机与通信学院 2016 年春季学期 C 程序设计程序设计 课程设计课程设计 题 目: 五子棋游戏 专业班级:16 级物联网 1 班 姓 名: *_ 学 号: 1616520147 指导教师: * 成 绩: 摘摘 要要 五子棋是一种两人对弈或者人机对弈的纯策略型棋类游戏,应用 C 语言编写程序可以在 计算机上实现人机对弈五子棋功能。人机对弈五子棋程序由开始界面,棋盘,判断胜负和计 分等子程序构成;程序中应用了数组、全局变量、按键处理和图形编程等元素和语句。程序 通过棋盘和棋子图像生成、玩家移子与电脑判断分数高低而落子和判断胜负等功能的实现, 在计算机上用 VC+6.0 实现了人机五子棋对弈。 关键词关键词:C 语言;VC+6.0 I 目录目录 摘 要.I 第 1 章 序 言.1 1.1 设计背景 .1 1.2 设计目的 .1 第 2 章 需求分析.2 第 3 章 程序总体设计.3 3.1 程序总体框架图.3 3.2 程序流程图 .4 第 4 章 程序详细设计.5 4.1 各类头文件及自定义函数 .5 4.2 棋盘数组 .5 4.3 开始界面函数.5 4.4 棋盘界面函数.5 4.5 胜负判断函数.6 4.6 得分判断函数.6 4.7 主函数.6 第 5 章 系统测试.7 5.1 开始界面测试.7 5.2 棋盘界面测试.8 5.3 玩家输赢界面测试.11 设计总结.13 参考文献.14 致 谢.15 附录(源代码).16 0 第第 1 1 章章 序序 言言 1.11.1 设计背景设计背景 五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围 棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古 代五子棋的棋具与围棋是完全相同的。在上古的神话传说中有“女娲造人,伏羲做棋”一说, 增山海经中记载:“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。”李善注引三 国魏邯郸淳艺经中曰:“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五 十枚”。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。因而规则简单 的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区, 以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。在古代,五子棋棋具虽然与围棋相类同, 但是下法却是完全不同的。正如辞海中所言,五子棋是“棋类游戏,棋具与围棋相同, 两人对局,轮流下子,先将五子连成一行者为胜”。 传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为 1515,棋子放置于棋盘 线交叉点上。 因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一 个人的时候也能体验五子棋的乐趣。因此我们设计了一款人机对战的五子棋游戏。 1.21.2 设计目的设计目的 五子棋游戏不仅能增强人们的抽象思维能力、逻辑推理能力、空间想象力,提高人们的 记忆力、心算能力等,而且深含哲理,有助于修身养性。五子棋既有现代休闲方式所特有的 特征“短、平、快”,又有中国古典哲学所包含的高深学问“阴阳易理”。它既有简单易学 的特点,为人民群众所喜闻乐见,又有深奥的技巧;既能组织举办群众性的比赛、活动,又 能组织举办高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观,它 是中西方文化的交融点,也是中西方文化交流的一个平台。 自从计算机作为游戏对战平台以来,各种棋类游戏如雨后春笋般纷纷冒出。五子棋是一 种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。同时具有简 单易学、既动手又动脑的特点。同时也为锻炼自己的编程能力。 1 第第 2 2 章章 需求分析需求分析 根据功能需求,将程序分为图形显示、玩家电脑走棋,胜负判断和电脑计分判断落子位 置四个模块,以下分析各模块的需求。 图形显示模块图形显示模块:在给 vc+6.0 增加了 easyx 后使用了#include 图形库头 文件。程序开始运行时,给出五子棋游戏名称界面;游戏开始后要求生成 1515 的棋盘图 像,给出窗口让玩家选择是否遵守游戏规则以及是否让电脑先落子,并在棋盘右方提示如何 落子,游戏进行过程中,要求实时显示棋盘上已落下的棋子,玩家为白旗,电脑为黑棋;分 出胜负后,在棋盘上方显示“你赢了按任意键继续”“你输了按任意键继续”。 玩家控制模块玩家控制模块:程序开始时,需玩家确定遵守规则后,并且选择是否让电脑先落子,才 能开始游戏;游戏过程中,玩家通过鼠标点击棋盘选择落子;游戏结束时,玩家按任意键开 始新棋局,否则直接关掉程序窗口。 胜负判断模块胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序, 在棋盘上方显示玩家输赢语句。 电脑计分判断落子位置模块电脑计分判断落子位置模块:在能下棋的空位置中,假设电脑和玩家下在此处,分别算 出各个空位置的分数,并找出最大值。如果最大值是玩家下的,那么电脑就“抢”他的位置, 即做到了“防守”。如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻” 2 第第 3 3 章章 程序总体设计程序总体设计 3.13.1 程序总体框图程序总体框图 五子棋游戏 开始界面模块 棋盘界面模块 判断输赢模块 计算得分模块 3 3.23.2 程序流程图程序流程图 4 第第 4 4 章章 程序详细设计程序详细设计 4.14.1 各类头文件及自定义函数各类头文件及自定义函数 #include / 图形库头文件 #include / 控制台输入输出,包含 getch()函数 #include/时间函数 #include /随机函数头文件 void start (); / 开始界面 void chessboard(); / 布置棋盘 int score (int m,int n,int k); / 打分函数 int judge (int m,int n,int k); / 设置判断输赢自定义函数 4.24.2 棋盘数组棋盘数组 int a1616; / 定义全局二维数组,作为虚拟棋盘,记录棋盘情况:0 代表空格 1 代表人下的棋 2 代表 电脑下的棋 。 4.34.3 开始界面开始界面 start()start()函数模块函数模块 initgraph()函数用于定义界面的宽度和长度, loadimage()用于加载电脑相应位置的图片,使其作为背景图片铺满界面, setbkmode()用于界面文字的背景颜色, settextcolor()用于定义文字的颜色, settextstyle()用于定义文字的风格, outtextxy()用于在指定坐标输出文字。 4.44.4 棋盘界面棋盘界面 chessboard()chessboard()函数函数 initgraph()函数用于定义界面的宽度和长度, Setbkcolor()函数用于定义背景颜色, 通过 for()循环画 15*15 的棋盘界面, 画棋盘线条用 lineh()函数, 5 settextcolor()用于定义文字的颜色, settextstyle()用于定义文字的风格, outtextxy()用于在指定坐标输出文字。 4.54.5 胜负判断胜负判断 judge()judge()函数函数 定义 int 型函数 judge(),通过判断横,竖,左斜,右斜有没有五子连成一线 来决定输赢,并且返回一个 int 类型的值。 4.64.6 得分判断得分判断 score()score()函数函数 定义 int 类型的自定义函数 score(),在能下棋的空位置中,假设电脑和玩家 下在此处,分别算出各个空位置的分数,并找出最大值。如果最大值是玩家下 的,那么电脑就“抢”他的位置,即做到了“防守”。如果最大值是电脑下的, 那就让电脑在此处下,即做到了“进攻”。通过这种方法实现了电脑下棋,也 是人机五子棋的精髓所在。 4.74.7 主函数主函数 main()main() 通过 MOUSEMSG m;定义鼠标,依次调用开始界面函数 start(),棋盘界面函数 chessboard(),通过调用 HWND wnd = GetHWnd();设置了两个问题窗口:“是 否遵守游戏规则”“是否让电脑先落子”,使用 if 语句判断,如果玩家选择 了确定则执行下一步,进入游戏界面并开始游戏,游戏过程中通过 rand()函数 让电脑在棋盘中部随机落子,并且使用 setfillcolor(BLACK);函数是电脑的棋 子颜色为黑色,使用 fillcircle(50*i,50*j,20);函数画棋子为半径是 20 的圆。 同样的方法使玩家的棋子颜色为白色,半径为 20 的圆。下去过程中通过 m = GetMouseMsg(); 获取鼠标信息,并且使用 WN_LBUTTONDOWN 表示获取的是鼠标 左键的信息,即玩家通过鼠标左键来下棋。在下棋过程中每一轮都重新调用得 分函数判断最值,使电脑落子落在最值上,最后调用判断输赢 judge()函数判 断玩家的输赢,如果玩家赢了,则在棋盘界面上方显示“你赢啦按任意键继续” ,如果玩家输了则显示“你输啦按任意键继续”。 6 第第 5 5 章章 系统测试系统测试 5.15.1 开始界面测试开始界面测试 设计计划:使用一张五子棋图片作为背景,并在图片中间显示“五子棋游 戏”,并且在下方提示玩家“按任意键开始游戏”。 测试结果: 如图 5.1 所示 图 5.1 7 5.25.2 棋盘界面测试棋盘界面测试 设计计划:以黄色作为棋盘底色,在棋盘左边画 15*15 的棋盘界面,在界 面的右侧显示五子棋游戏,并且在右上角显示游戏规则:“在棋盘上单击鼠标 左键开始游戏”,在界面的右下方显示制作团队。并且在开始游戏首先弹出 “是否遵守游戏规则的选择窗口”,玩家只有选择了确定才能进入游戏,玩家 进入游戏后弹出是否让电脑先下的选择窗口,当玩家选择了确定时,电脑首先 在棋盘落黑子,如果玩家选择了取消,则直接进入棋盘界面,由玩家选择地点 落子。 测试结果: 如图 5.2,5.3 所示 8 图 5.2 9 图 5.3 10 5.35.3 玩家输赢界面测试玩家输赢界面测试 测试计划:如果玩家赢了,则在棋盘上方显示“你赢了按任意键继续”, 如果玩家输了则在棋盘上方显示“你输了按任意键继续”。 测试结果: 如图 5.4,5.5 所示: 图 5.4 11 图 5.5 12 设计总结设计总结 通过对各子程序的设计与优化,本程序完成了人机对战五子棋软件的主体的设计与制作,基 本达到了使用五子棋软件的核心要求。最重要的是为了使界面更加的美观,找到了 easyx, 成功的在 vc+6.0 中使用了 TC 编译器才有的#include /图形库头文件。而程序还有一 些不足之处,首先,程序的电脑计分模块存在不够智能的问题。其次,程序的界面过于简陋。 13 参考文献参考文献 1 颜晖,柳俊. C 语言程序设计实验与习题指导(第二版)M. 北京:高等教育出版社, 2012.3 2 谭浩强,C 语言程序设计M.清华大学出版社,2010.6 3 谭浩强,C 程序设计题解与上机指导M.清华大学出版社,2010.6 4 何钦铭,颜晖. C 语言程序设计(第 2 版)M. 北京:高等教育出版社,2012.3 5 王连相.C/C+程序设计上机指导与测试(第二版)M.中国铁道出版社,2011 6 陈超.C 语言函数手册 M. 机械工业出版社,1999 7 杨传杰.C 语言的实际应用 M. 安徽科学技术出版社,2000 14 致致 谢谢 感谢两周以来两位老师尤其是朱老师以及各位同学的的帮助,使得我能够顺利完成此次 C 语言课程设计任务,使得我对结构化的程序设计思想有了进一步的理解,对 c 语言程序设 计有了更深的体会,最重要的是能培养好的代码风格,这对我来说受益匪浅。 15 附录(源代码)附录(源代码) / 五子棋人机对战 / 电脑方设计思路:在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并 找出最大值 / 如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守” / 如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻” #include / 图形库头文件 #include / 控制台输入输出,包含 getch()函数 #include #include /随机函数头文件 void start (); / 开始界面 void chessboard(); / 布置棋盘 int score (int m,int n,int k); / 打分函数 int judge (int m,int n,int k); / 设置判断输赢自定义函数 int a1616; / 定义全局二维数组,作为虚拟棋盘,记录棋盘情况:0 代表空格 1 代表人下的棋 2 代表 电脑下的棋 void main () srand(unsigned)time(NULL);/ 随机种子 int score_p1616,score_c1616; int k,i,j,s,t,x=0,max,p; MOUSEMSG m; start();/调用 start 函数,获取开始界面 for(;) k=1; for(i=1;i16;i+) for(j=1;j16;j+) aij=0; chessboard();/调用 chessboard 函数,获取棋盘界面 HWND wnd = GetHWnd(); if(MessageBox(wnd, _T(游戏规则:点击鼠标落子。是否遵守游戏规则?), _T(游戏提醒), MB_OKCANCEL | MB_ICONQUESTION) = IDOK) / 获取玩家选择,是否先下 HWND wnd = GetHWnd();/h 是类型描述,表示句柄(handle), Wnd 是变量对象描述,表 示窗口,所以 hWnd 表示窗口句柄 /*MessageBox 指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特 定于应用程序消息, 如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。*/ if(MessageBox(wnd, _T(您是否让电脑先下?), _T(游戏提醒), MB_OKCANCEL | MB_ICONQUESTION) = IDOK)/mb_okcancel 只有两个选择键,MB_ICONQUESTION 表示问题图标, IDOK 表示结果的 ID 是 OK 执行程序 16 /* rand()函数 rand()%20 表示随机产生 0-19 的数,rand()%20+1 表示随机产生 1-20 的数 */ i=rand()%6+6; /在 6-11 之间,找一个随机数作为电脑下棋的 X 坐标 j=rand()%6+6; /在 6-11 之间,找一个随机数作为电脑下棋的 Y 坐标 aij=2; setfillcolor(BLACK);/棋子的颜色为黑色 fillcircle(50*i,50*j,20);/棋子为半径是 20 的圆 for(;) for(;p!=1;) / 玩家下棋,获取鼠标信息 m = GetMouseMsg(); /获取鼠标 switch(m.uMsg) case WM_LBUTTONDOWN:/WN_LBUTTONDOWN 表示鼠标左键按下消息 for(i=50;i=750;i=i+50) for(j=50;j4) settextcolor(CYAN); settextstyle(30, 0, _T(方正舒体); outtextxy(200,0, -你赢啦按任意键继续-); getch(); break; k=-k; / 初始化分数 score_cij:电脑分数 score_pij:玩家分数 for(i=1;i16;i+) 17 for(j=1;j16;j+) score_cij=0; score_pij=0; for(i=1;i16;i+) for(j=1;j16;j+) if(aij=0) aij=1; x=score(i,j,1); score_pij+=x; / 记录如果玩家下在此处,得到多少分 aij=2; x=score(i,j,-1); score_cij+=x; / 记录如果电脑下在此处,得到多少分 aij=0; / 找到能下棋的空位置中,假设电脑和人下在此处,得到分数中最大值 for(s=t=i=1,max=score_c11;i16;i+) for(j=1;jmax) max=score_cij; s=i; t=j; for(i=1;i4) settextcolor(CYAN); settextstyle(30, 0, _T(方正舒体); outtextxy(200, 0, -你输啦按任意键继续-); getch(); 18 break; k=-k; /* 开始界面函数 */ void start() initgraph(900,800); setbkcolor(GREEN); /cleardevice();/这个函数用于清除屏幕内容。具体的,是用当前背景色清空屏幕,并将当前点移至 (0, 0)。 /IMAGE backgroundimg,img2; /loadimage( /backgroundimg = img2; /int width = backgroundimg.getwidth(); /int height = backgroundimg.getheight();/获取长和宽 /initgraph(width,height);/根据背景图片的长和宽初始化窗口,使之铺满窗 /BeginBatchDraw(); / putimage(0,0,/在窗口上绘制背景图片 /EndBatchDraw(); setbkmode(TRANSPARENT);/文字背景透明 settextcolor(WHITE); settextstyle(120,0,_T(宋体); outtextxy(150,200,人机五子棋游戏); settextcolor(RED); settextstyle(20,0,_T(宋体); outtextxy(400,400,-按任意键开始游戏-); getch(); /* 棋盘函数 */ void chessboard() initgraph(900,780); setbkcolor(YELLOW); 19 cleardevice(); for(int i = 50;i=750;i+=50) setlinecolor(BLACK); line(50,i,750,i); line(i,50,i,750); settextcolor(GREEN); settextstyle(30,0,_T(楷体); outtextxy(770,80,游戏规则:); settextstyle(20,0,_T(楷体); outtextxy(770,130,在棋盘上); outtextxy(770,170,单击鼠标左键); settextstyle(100,0,_T(宋体); outtextxy(770,200,五); outtextxy(770,320,子); outtextxy(770,440,棋); settextstyle(30,0,_T(楷体); outtextxy(770,700,制作团队:); settextstyle(25,0,_T(楷体); outtextxy(760,750,-周,贾,张); /* 判断输赢函数 */ int judge (int m,int n,int k) int s,i,j,p=0,q=0,x=0,shu,heng,zuoxie,youxie; if (k=1) s=1; else s=2; for(i=m;i0;i-) if(ain!=s) break; else q+; heng=p+q; for(j=n,p=0;j0;j-) if(amj!=s) break; else q+; shu=p+q; for(i=m,j=n,p=0;i16,im-5,j0;i-,j-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版智慧城市投资入股合同示范文本
- 2025年度预付款担保公司针对艺术品交易合同
- 2025殡葬服务绿色殡葬理念推广与应用合同
- 2025年度文化旅游区特色商铺租赁合作协议
- 2025年度高端企业市场分析及战略规划商务咨询服务合同
- 2025年度地铁隧道建设第三方监理合同范本
- 2025版体育馆室内篮球场租赁及配套器材供应合同
- 2025年特色民宿改造升级设计与施工合同
- 2025年度能源行业财务担保合同发行与会计处理规范
- 2025版新型生态绿化工程承包合同下载
- 冷库安全基本知识培训课件
- 澄海玩具行业出口中存在的问题及对策分析
- 工业园区集中供热配套建设项目可行性研究报告
- 2025年应急管理普法知识竞赛题(附答案)
- 2024-2030全球飞机拆解再制造行业调研及趋势分析报告
- 数控铣床实训安全教育
- 物业前台倒水服务方案(3篇)
- 2025年职业指导师考试试卷:职业指导师职业指导
- 常减压装置仿真操作正常停车石油炼制装置操作02课件
- 2025年科技创新企业财务工作总结及计划
- 竞彩销售培训
评论
0/150
提交评论