c五子棋课设说明书含完整源代码解读.docx
- 文档编号:25221091
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:32
- 大小:360.98KB
c五子棋课设说明书含完整源代码解读.docx
《c五子棋课设说明书含完整源代码解读.docx》由会员分享,可在线阅读,更多相关《c五子棋课设说明书含完整源代码解读.docx(32页珍藏版)》请在冰豆网上搜索。
c五子棋课设说明书含完整源代码解读
*******************
实践教学
*******************
****大学
计算机与通信学院
2016年春季学期
C程序设计课程设计
题目:
五子棋游戏
专业班级:
16级物联网1班
姓名:
******__
学号:
1616520147
指导教师:
******
成绩:
摘要
五子棋是一种两人对弈或者人机对弈的纯策略型棋类游戏,应用C语言编写程序可以在计算机上实现人机对弈五子棋功能。
人机对弈五子棋程序由开始界面,棋盘,判断胜负和计分等子程序构成;程序中应用了数组、全局变量、按键处理和图形编程等元素和语句。
程序通过棋盘和棋子图像生成、玩家移子与电脑判断分数高低而落子和判断胜负等功能的实现,在计算机上用VC++6.0实现了人机五子棋对弈。
关键词:
C语言;VC++6.0
目录
摘要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
第1章序言
1.1设计背景
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。
有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。
在上古的神话传说中有“女娲造人,伏羲做棋”一说,《增山海经》中记载:
“休舆之山有石焉,名曰帝台之棋,五色而文状鹑卵。
”李善注引三国魏邯郸淳《艺经》中曰:
“棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。
这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。
因而规则简单的五子棋也可能出自当时,并是用石子作棋子。
亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。
在古代,五子棋棋具虽然与围棋相类同,但是下法却是完全不同的。
正如《辞海》中所言,五子棋是“棋类游戏,棋具与围棋相同,两人对局,轮流下子,先将五子连成一行者为胜”。
传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为15×15,棋子放置于棋盘线交叉点上。
因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一个人的时候也能体验五子棋的乐趣。
因此我们设计了一款人机对战的五子棋游戏。
1.2设计目的
五子棋游戏不仅能增强人们的抽象思维能力、逻辑推理能力、空间想象力,提高人们的记忆力、心算能力等,而且深含哲理,有助于修身养性。
五子棋既有现代休闲方式所特有的特征“短、平、快”,又有中国古典哲学所包含的高深学问“阴阳易理”。
它既有简单易学的特点,为人民群众所喜闻乐见,又有深奥的技巧;既能组织举办群众性的比赛、活动,又能组织举办高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观,它是中西方文化的交融点,也是中西方文化交流的一个平台。
自从计算机作为游戏对战平台以来,各种棋类游戏如雨后春笋般纷纷冒出。
五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。
同时具有简单易学、既动手又动脑的特点。
同时也为锻炼自己的编程能力。
第2章需求分析
根据功能需求,将程序分为图形显示、玩家电脑走棋,胜负判断和电脑计分判断落子位置四个模块,以下分析各模块的需求。
图形显示模块:
在给vc++6.0增加了easyx后使用了#include
程序开始运行时,给出五子棋游戏名称界面;游戏开始后要求生成15×15的棋盘图像,给出窗口让玩家选择是否遵守游戏规则以及是否让电脑先落子,并在棋盘右方提示如何落子,游戏进行过程中,要求实时显示棋盘上已落下的棋子,玩家为白旗,电脑为黑棋;分出胜负后,在棋盘上方显示“你赢了按任意键继续”“你输了按任意键继续”。
玩家控制模块:
程序开始时,需玩家确定遵守规则后,并且选择是否让电脑先落子,才能开始游戏;游戏过程中,玩家通过鼠标点击棋盘选择落子;游戏结束时,玩家按任意键开始新棋局,否则直接关掉程序窗口。
胜负判断模块:
实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,在棋盘上方显示玩家输赢语句。
电脑计分判断落子位置模块:
在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。
如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”。
如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”
第3章程序总体设计
3.1程序总体框图
3.2程序流程图
第4章程序详细设计
4.1各类头文件及自定义函数
#include
#include
#include
#include
voidstart();//开始界面
voidchessboard();//布置棋盘
intscore(intm,intn,intk);//打分函数
intjudge(intm,intn,intk);//设置判断输赢自定义函数
4.2棋盘数组
inta[16][16];//定义全局二维数组,作为虚拟棋盘,记录棋盘情况:
0代表空格1代表人下的棋2代表电脑下的棋。
4.3开始界面start()函数模块
initgraph()函数用于定义界面的宽度和长度,
loadimage()用于加载电脑相应位置的图片,使其作为背景图片铺满界面,setbkmode()用于界面文字的背景颜色,
settextcolor()用于定义文字的颜色,
settextstyle()用于定义文字的风格,
outtextxy()用于在指定坐标输出文字。
4.4棋盘界面chessboard()函数
initgraph()函数用于定义界面的宽度和长度,
Setbkcolor()函数用于定义背景颜色,
通过for()循环画15*15的棋盘界面,
画棋盘线条用lineh()函数,
settextcolor()用于定义文字的颜色,
settextstyle()用于定义文字的风格,
outtextxy()用于在指定坐标输出文字。
4.5胜负判断judge()函数
定义int型函数judge(),通过判断横,竖,左斜,右斜有没有五子连成一线来决定输赢,并且返回一个int类型的值。
4.6得分判断score()函数
定义int类型的自定义函数score(),在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。
如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”。
如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”。
通过这种方法实现了电脑下棋,也是人机五子棋的精髓所在。
4.7主函数main()
通过MOUSEMSGm;定义鼠标,依次调用开始界面函数start(),棋盘界面函数chessboard(),通过调用HWNDwnd=GetHWnd();设置了两个问题窗口:
“是否遵守游戏规则”“是否让电脑先落子”,使用if语句判断,如果玩家选择了确定则执行下一步,进入游戏界面并开始游戏,游戏过程中通过rand()函数让电脑在棋盘中部随机落子,并且使用setfillcolor(BLACK);函数是电脑的棋子颜色为黑色,使用fillcircle(50*i,50*j,20);函数画棋子为半径是20的圆。
同样的方法使玩家的棋子颜色为白色,半径为20的圆。
下去过程中通过m=GetMouseMsg();获取鼠标信息,并且使用WN_LBUTTONDOWN表示获取的是鼠标左键的信息,即玩家通过鼠标左键来下棋。
在下棋过程中每一轮都重新调用得分函数判断最值,使电脑落子落在最值上,最后调用判断输赢judge()函数判断玩家的输赢,如果玩家赢了,则在棋盘界面上方显示“你赢啦按任意键继续”,如果玩家输了则显示“你输啦按任意键继续”。
第5章系统测试
5.1开始界面测试
设计计划:
使用一张五子棋图片作为背景,并在图片中间显示“五子棋游戏”,并且在下方提示玩家“按任意键开始游戏”。
测试结果:
如图5.1所示
图5.1
5.2棋盘界面测试
设计计划:
以黄色作为棋盘底色,在棋盘左边画15*15的棋盘界面,在界面的右侧显示五子棋游戏,并且在右上角显示游戏规则:
“在棋盘上单击鼠标左键开始游戏”,在界面的右下方显示制作团队。
并且在开始游戏首先弹出“是否遵守游戏规则的选择窗口”,玩家只有选择了确定才能进入游戏,玩家进入游戏后弹出是否让电脑先下的选择窗口,当玩家选择了确定时,电脑首先在棋盘落黑子,如果玩家选择了取消,则直接进入棋盘界面,由玩家选择地点落子。
测试结果:
如图5.2,5.3所示
图5.2
图5.3
5.3玩家输赢界面测试
测试计划:
如果玩家赢了,则在棋盘上方显示“你赢了按任意键继续”,如果玩家输了则在棋盘上方显示“你输了按任意键继续”。
测试结果:
如图5.4,5.5所示:
图5.4
图5.5
设计总结
通过对各子程序的设计与优化,本程序完成了人机对战五子棋软件的主体的设计与制作,基本达到了使用五子棋软件的核心要求。
最重要的是为了使界面更加的美观,找到了easyx,成功的在vc++6.0中使用了TC编译器才有的#include
而程序还有一些不足之处,首先,程序的电脑计分模块存在不够智能的问题。
其次,程序的界面过于简陋。
参考文献
[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
致谢
感谢两周以来两位老师尤其是朱老师以及各位同学的的帮助,使得我能够顺利完成此次C语言课程设计任务,使得我对结构化的程序设计思想有了进一步的理解,对c语言程序设计有了更深的体会,最重要的是能培养好的代码风格,这对我来说受益匪浅。
附录(源代码)
//五子棋人机对战
//电脑方设计思路:
在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值
//如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”
//如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”
#include
#include
#include
#include
voidstart();//开始界面
voidchessboard();//布置棋盘
intscore(intm,intn,intk);//打分函数
intjudge(intm,intn,intk);//设置判断输赢自定义函数
inta[16][16];//定义全局二维数组,作为虚拟棋盘,记录棋盘情况:
0代表空格1代表人下的棋2代表电脑下的棋
voidmain(){
srand((unsigned)time(NULL));//随机种子
intscore_p[16][16],score_c[16][16];
intk,i,j,s,t,x=0,max,p;
MOUSEMSGm;
start();//调用start函数,获取开始界面
for(;;){
k=1;
for(i=1;i<16;i++){
for(j=1;j<16;j++)
a[i][j]=0;
}
chessboard();//调用chessboard函数,获取棋盘界面
HWNDwnd=GetHWnd();
if(MessageBox(wnd,_T("游戏规则:
点击鼠标落子。
是否遵守游戏规则?
"),_T("游戏提醒"),MB_OKCANCEL|MB_ICONQUESTION)==IDOK){
//获取玩家选择,是否先下
HWNDwnd=GetHWnd();//h是类型描述,表示句柄(handle),Wnd是变量对象描述,表示窗口,所以hWnd表示窗口句柄
/*MessageBox指的是显示一个模态对话框,其中包含一个系统图标、一组按钮和一个简短的特定于应用程序消息,
如状态或错误的信息。
消息框中返回一个整数值,该值指示用户单击了哪个按钮。
*/
if(MessageBox(wnd,_T("您是否让电脑先下?
"),_T("游戏提醒"),MB_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坐标
a[i][j]=2;
setfillcolor(BLACK);//棋子的颜色为黑色
fillcircle(50*i,50*j,20);//棋子为半径是20的圆
}
for(;;){
for(;p!
=1;){
//玩家下棋,获取鼠标信息
m=GetMouseMsg();//获取鼠标
switch(m.uMsg){
caseWM_LBUTTONDOWN:
{//WN_LBUTTONDOWN表示鼠标左键按下消息
for(i=50;i<=750;i=i+50){
for(j=50;j<=750;j=j+50){
//判断是否能下,且下好位置
if(m.xi-10&&m.y
setfillcolor(WHITE);//玩家的棋子颜色为白色
fillcircle(i,j,20);
p=1;
break;
}
}
if(p==1){
break;
}
}
}
}
}
p=0;
a[i/50][j/50]=1;
x=judge(i/50,j/50,k);//调用自定义函数判断输赢
if(x>4){
settextcolor(CYAN);
settextstyle(30,0,_T("方正舒体"));
outtextxy(200,0,"---你赢啦按任意键继续---");
getch();
break;
}
k=-k;
//初始化分数score_c[i][j]:
电脑分数score_p[i][j]:
玩家分数
for(i=1;i<16;i++){
for(j=1;j<16;j++){
score_c[i][j]=0;
score_p[i][j]=0;
}
}
for(i=1;i<16;i++){
for(j=1;j<16;j++){
if(a[i][j]==0){
a[i][j]=1;
x=score(i,j,1);
score_p[i][j]+=x;//记录如果玩家下在此处,得到多少分
a[i][j]=2;
x=score(i,j,-1);
score_c[i][j]+=x;//记录如果电脑下在此处,得到多少分
a[i][j]=0;
}
}
}
//找到能下棋的空位置中,假设电脑和人下在此处,得到分数中最大值
for(s=t=i=1,max=score_c[1][1];i<16;i++){
for(j=1;j<16;j++){
if(score_c[i][j]>max){
max=score_c[i][j];
s=i;
t=j;
}
}
}
for(i=1;i<16;i++){
for(j=1;j<16;j++){
if(score_p[i][j]>max){
max=score_p[i][j];
s=i;
t=j;
}
}
}
a[s][t]=2;//在最高分处落棋
setfillcolor(BLACK);
fillcircle(s*50,t*50,20);
x=judge(s,t,k);
if(x>4){
settextcolor(CYAN);
settextstyle(30,0,_T("方正舒体"));
outtextxy(200,0,"---你输啦按任意键继续---");
getch();
break;
}
k=-k;
}
}
}
}
/*开始界面函数*/
voidstart(){
initgraph(900,800);
setbkcolor(GREEN);
//cleardevice();//这个函数用于清除屏幕内容。
具体的,是用当前背景色清空屏幕,并将当前点移至(0,0)。
//IMAGEbackgroundimg,img2;
//loadimage(&img2,_T("C:
\\wuziqi.jpg"));
//backgroundimg=img2;
//intwidth=backgroundimg.getwidth();
//intheight=backgroundimg.getheight();//获取长和宽
//initgraph(width,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();
}
/*棋盘函数*/
voidchessboard(){
initgraph(900,780);
setbkcolor(YELLOW);
cleardevice();
for(inti=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,"--周,贾,张");
}
/*判断输赢函数*/
intjudge(intm,intn,intk){
ints,i,j,p=0,q=0,x=0,shu,heng,zuoxie,youxie;
if(k==1)
s=1;
else
s=2;
for(i=m;i if(a[i][n]! =s) break; else p++; } for(i=m-1;i>m-5,i>0;i--){ if(a[i][n]! =s) break; else q++; } heng=p+q; for(j=n,p=0;j if(a[m][j]! =s) break; else p++; } for(j=n-1,q=0;j>n-5,j>0;j--){ if(a[m][j]! =
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 说明书 完整 源代码 解读