1、15,棋子放置于棋盘线交叉点上。 因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一个人的时候也能体验五子棋的乐趣。因此我们设计了一款人机对战的五子棋游戏。1.2 设计目的五子棋游戏不仅能增强人们的抽象思维能力、逻辑推理能力、空间想象力,提高人们的记忆力、心算能力等,而且深含哲理,有助于修身养性。五子棋既有现代休闲方式所特有的特征“短、平、快”,又有中国古典哲学所包含的高深学问“阴阳易理”。它既有简单易学的特点,为人民群众所喜闻乐见,又有深奥的技巧;既能组织举办群众性的比赛、活动,又能组织举办高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观,它是中西方文化的交
2、融点,也是中西方文化交流的一个平台。 自从计算机作为游戏对战平台以来,各种棋类游戏如雨后春笋般纷纷冒出。五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。同时具有简单易学、既动手又动脑的特点。同时也为锻炼自己的编程能力。第2章 需求分析根据功能需求,将程序分为图形显示、玩家电脑走棋,胜负判断和电脑计分判断落子位置四个模块,以下分析各模块的需求。图形显示模块:在给vc+6.0增加了easyx后使用了#include 图形库头文件。程序开始运行时,给出五子棋游戏名称界面;游戏开始后要求生成1515的棋盘图像,给出窗口让玩家选择是否遵守游戏规则以及是否让电脑先落子,并在
3、棋盘右方提示如何落子,游戏进行过程中,要求实时显示棋盘上已落下的棋子,玩家为白旗,电脑为黑棋;分出胜负后,在棋盘上方显示“你赢了按任意键继续”“你输了按任意键继续”。玩家控制模块:程序开始时,需玩家确定遵守规则后,并且选择是否让电脑先落子,才能开始游戏;游戏过程中,玩家通过鼠标点击棋盘选择落子;游戏结束时,玩家按任意键开始新棋局,否则直接关掉程序窗口。胜负判断模块:实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,在棋盘上方显示玩家输赢语句。电脑计分判断落子位置模块:在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。如果最大值是玩家下的,那么电脑就
4、“抢”他的位置,即做到了“防守”。如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”第3章 程序总体设计3.1 程序总体框图五子棋游戏开始界面模块棋盘界面模块判断输赢模块计算得分模块3.2 程序流程图第4章 程序详细设计4.1各类头文件及自定义函数#include / 图形库头文件#include / 控制台输入输出,包含getch()函数time.h/时间函数stdlib.h/随机函数头文件void start (); / 开始界面void chessboard(); / 布置棋盘int score (int m,int n,int k); / 打分函数int judge (int
5、m,int n,int k); / 设置判断输赢自定义函数4.2棋盘数组int a1616; / 定义全局二维数组,作为虚拟棋盘,记录棋盘情况:0 代表空格 1 代表人下的棋 2 代表电脑下的棋 。4.3开始界面start()函数模块initgraph()函数用于定义界面的宽度和长度,loadimage()用于加载电脑相应位置的图片,使其作为背景图片铺满界面,setbkmode()用于界面文字的背景颜色,settextcolor()用于定义文字的颜色,settextstyle()用于定义文字的风格,outtextxy()用于在指定坐标输出文字。4.4棋盘界面chessboard()函数Setb
6、kcolor()函数用于定义背景颜色,通过for()循环画15*15的棋盘界面,画棋盘线条用lineh()函数,4.5胜负判断judge()函数定义int型函数judge(),通过判断横,竖,左斜,右斜有没有五子连成一线来决定输赢,并且返回一个int类型的值。4.6得分判断score()函数定义int类型的自定义函数score(),在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”。通过这种方法实现了电脑下棋,也是人机五子棋的精髓所在。4.7主函数main()通过MOUSEMSG m;定义鼠标,依次调用
7、开始界面函数start(),棋盘界面函数chessboard(),通过调用HWND wnd = GetHWnd();设置了两个问题窗口:“是否遵守游戏规则”“是否让电脑先落子”,使用if语句判断,如果玩家选择了确定则执行下一步,进入游戏界面并开始游戏,游戏过程中通过rand()函数让电脑在棋盘中部随机落子,并且使用setfillcolor(BLACK);函数是电脑的棋子颜色为黑色,使用fillcircle(50*i,50*j,20);函数画棋子为半径是20的圆。同样的方法使玩家的棋子颜色为白色,半径为20的圆。下去过程中通过m = GetMouseMsg(); 获取鼠标信息,并且使用WN_LB
8、UTTONDOWN表示获取的是鼠标左键的信息,即玩家通过鼠标左键来下棋。在下棋过程中每一轮都重新调用得分函数判断最值,使电脑落子落在最值上,最后调用判断输赢judge()函数判断玩家的输赢,如果玩家赢了,则在棋盘界面上方显示“你赢啦按任意键继续”,如果玩家输了则显示“你输啦按任意键继续”。第5章 系统测试5.1开始界面测试设计计划:使用一张五子棋图片作为背景,并在图片中间显示“五子棋游戏”,并且在下方提示玩家“按任意键开始游戏”。测试结果:如图5.1所示图5.15.2棋盘界面测试以黄色作为棋盘底色,在棋盘左边画15*15的棋盘界面,在界面的右侧显示五子棋游戏,并且在右上角显示游戏规则:“在棋盘
9、上单击鼠标左键开始游戏”,在界面的右下方显示制作团队。并且在开始游戏首先弹出“是否遵守游戏规则的选择窗口”,玩家只有选择了确定才能进入游戏,玩家进入游戏后弹出是否让电脑先下的选择窗口,当玩家选择了确定时,电脑首先在棋盘落黑子,如果玩家选择了取消,则直接进入棋盘界面,由玩家选择地点落子。如图5.2,5.3所示图5.2图5.35.3玩家输赢界面测试测试计划:如果玩家赢了,则在棋盘上方显示“你赢了按任意键继续”,如果玩家输了则在棋盘上方显示“你输了按任意键继续”。如图5.4,5.5所示:图5.4图5.5设计总结通过对各子程序的设计与优化,本程序完成了人机对战五子棋软件的主体的设计与制作,基本达到了使
10、用五子棋软件的核心要求。最重要的是为了使界面更加的美观,找到了easyx,成功的在vc+6.0中使用了TC编译器才有的#include /图形库头文件。而程序还有一些不足之处,首先,程序的电脑计分模块存在不够智能的问题。其次,程序的界面过于简陋。参考文献1 颜晖,柳俊. C语言程序设计实验与习题指导(第二版)M. 北京:高等教育出版社,2012.32 谭浩强,C语言程序设计M.清华大学出版社,2010.63 谭浩强,C程序设计题解与上机指导M.清华大学出版社,2010.64 何钦铭,颜晖. C语言程序设计(第2版)M. 北京:5 王连相.C/C+程序设计上机指导与测试(第二版)M.中国铁道出版
11、社,20116 陈超.C语言函数手册 M. 机械工业出版社,19997 杨传杰.C语言的实际应用 M. 安徽科学技术出版社,2000致 谢 感谢两周以来两位老师尤其是朱老师以及各位同学的的帮助,使得我能够顺利完成此次C语言课程设计任务,使得我对结构化的程序设计思想有了进一步的理解,对c语言程序设计有了更深的体会,最重要的是能培养好的代码风格,这对我来说受益匪浅。附录(源代码)/ 五子棋人机对战/ 电脑方设计思路:在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值/ 如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”/ 如果最大值是电脑下的,那就让电
12、脑在此处下,即做到了“进攻”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;jj+) aij=0; chessboard();/调用chessboard函数,获取棋盘界面 HWND wnd = GetHWnd(); if(MessageBox(wn
13、d, _T(游戏规则:点击鼠标落子。是否遵守游戏规则?), _T(游戏提醒), MB_OKCANCEL | MB_ICONQUESTION) = IDOK) / 获取玩家选择,是否先下 HWND wnd = GetHWnd();/h 是类型描述,表示句柄(handle), Wnd 是变量对象描述,表示窗口,所以hWnd 表示窗口句柄 /*MessageBox指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息, 如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。*/ if(MessageBox(wnd, _T(您是否让电脑先下?), M
14、B_OKCANCEL | MB_ICONQUESTION) = IDOK)/mb_okcancel只有两个选择键,MB_ICONQUESTION表示问题图标,IDOK表示结果的ID是OK执行程序 /* 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)
15、;/棋子为半径是20的圆 for(; for(;p!=1; / 玩家下棋,获取鼠标信息 m = GetMouseMsg(); /获取鼠标 switch(m.uMsg) case WM_LBUTTONDOWN:/WN_LBUTTONDOWN表示鼠标左键按下消息 for(i=50;=750;i=i+50) for(j=50;j=j+50) /判断是否能下,且下好位置 if(m.xi-10&m.yj-10&ai/50j/50=0) setfillcolor(WHITE);/玩家的棋子颜色为白色 fillcircle(i,j,20); p=1; break; if(p=1) break; p=0; a
16、i/50j/50=1; x=judge(i/50,j/50,k); / 调用自定义函数判断输赢 if(x4) settextcolor(CYAN); settextstyle(30, 0, _T(方正舒体); outtextxy(200,0, -你赢啦按任意键继续-); getch(); break; k=-k; / 初始化分数score_cij:电脑分数 score_pij:玩家分数 for(i=1; for(j=1;j+) score_cij=0; score_pij=0; if(aij=0) aij=1; x=score(i,j,1); score_pij+=x; / 记录如果玩家下在此
17、处,得到多少分 aij=2; x=score(i,j,-1); score_cij+=x; / 记录如果电脑下在此处,得到多少分 aij=0; / 找到能下棋的空位置中,假设电脑和人下在此处,得到分数中最大值 for(s=t=i=1,max=score_c11; if(score_cijmax) max=score_cij; s=i; t=j; if(score_pij max=score_pij; ast=2; / 在最高分处落棋 fillcircle(s*50,t*50,20); x=judge(s,t,k); outtextxy(200, 0, -你输啦按任意键继续- /* 开始界面函数
18、 */void start() initgraph(900,800); setbkcolor(GREEN); /cleardevice();/这个函数用于清除屏幕内容。具体的,是用当前背景色清空屏幕,并将当前点移至 (0, 0)。 /IMAGE backgroundimg,img2; /loadimage(&img2,_T(C:wuziqi.jpg /backgroundimg = img2; /int width = backgroundimg.getwidth(); /int height = backgroundimg.getheight();/获取长和宽 /initgraph(widt
19、h,height);/根据背景图片的长和宽初始化窗口,使之铺满窗 /BeginBatchDraw(); / putimage(0,0,&backgroundimg);/在窗口上绘制背景图片 /EndBatchDraw(); setbkmode(TRANSPARENT);/文字背景透明 settextcolor(WHITE); settextstyle(120,0,_T(宋体 outtextxy(150,200,人机五子棋游戏 settextcolor(RED); settextstyle(20,0,_T( outtextxy(400,400,-按任意键开始游戏- getch();/* 棋盘函数
20、 */void chessboard() initgraph(900,780); setbkcolor(YELLOW); cleardevice(); for(int i = 50;i+=50) setlinecolor(BLACK); line(50,i,750,i); line(i,50,i,750); settextcolor(GREEN); settextstyle(30,0,_T(楷体 outtextxy(770,80, outtextxy(770,130,在棋盘上 outtextxy(770,170,单击鼠标左键 settextstyle(100,0,_T( outtextxy(7
21、70,200,五 outtextxy(770,320,子 outtextxy(770,440,棋 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;m+5,im-5,i0;i-) q+; heng=p+q; for(j=n,p=0;n+5,jn-5,jj-) shu=p+q; for(i=m,j=n,p=0;16,im+5,jm-5,ji-,j-) zuoxie=p+q;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1