c五子棋课设说明书含完整源代码Word文档格式.docx
《c五子棋课设说明书含完整源代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《c五子棋课设说明书含完整源代码Word文档格式.docx(27页珍藏版)》请在冰豆网上搜索。
![c五子棋课设说明书含完整源代码Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/3/bda327f2-7328-4d57-974f-6a4114115734/bda327f2-7328-4d57-974f-6a41141157341.gif)
15,棋子放置于棋盘线交叉点上。
因为传统五子棋只能实现人人对战,而用计算机编程能够实现人机对战,一个人的时候也能体验五子棋的乐趣。
因此我们设计了一款人机对战的五子棋游戏。
1.2设计目的
五子棋游戏不仅能增强人们的抽象思维能力、逻辑推理能力、空间想象力,提高人们的记忆力、心算能力等,而且深含哲理,有助于修身养性。
五子棋既有现代休闲方式所特有的特征“短、平、快”,又有中国古典哲学所包含的高深学问“阴阳易理”。
它既有简单易学的特点,为人民群众所喜闻乐见,又有深奥的技巧;
既能组织举办群众性的比赛、活动,又能组织举办高水平的国际性比赛;
它的棋文化源渊流长,具有东方的神秘和西方的直观,它是中西方文化的交融点,也是中西方文化交流的一个平台。
自从计算机作为游戏对战平台以来,各种棋类游戏如雨后春笋般纷纷冒出。
五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。
同时具有简单易学、既动手又动脑的特点。
同时也为锻炼自己的编程能力。
第2章需求分析
根据功能需求,将程序分为图形显示、玩家电脑走棋,胜负判断和电脑计分判断落子位置四个模块,以下分析各模块的需求。
图形显示模块:
在给vc++6.0增加了easyx后使用了#include<
graphics.h>
图形库头文件。
程序开始运行时,给出五子棋游戏名称界面;
游戏开始后要求生成15×
15的棋盘图像,给出窗口让玩家选择是否遵守游戏规则以及是否让电脑先落子,并在棋盘右方提示如何落子,游戏进行过程中,要求实时显示棋盘上已落下的棋子,玩家为白旗,电脑为黑棋;
分出胜负后,在棋盘上方显示“你赢了按任意键继续”“你输了按任意键继续”。
玩家控制模块:
程序开始时,需玩家确定遵守规则后,并且选择是否让电脑先落子,才能开始游戏;
游戏过程中,玩家通过鼠标点击棋盘选择落子;
游戏结束时,玩家按任意键开始新棋局,否则直接关掉程序窗口。
胜负判断模块:
实时监测棋盘上棋子,一旦某一色棋子出现五子连线,终止游戏程序,在棋盘上方显示玩家输赢语句。
电脑计分判断落子位置模块:
在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值。
如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”。
如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”
第3章程序总体设计
3.1程序总体框图
五子棋游戏
开始界面模块
棋盘界面模块
判断输赢模块
计算得分模块
3.2程序流程图
第4章程序详细设计
4.1各类头文件及自定义函数
#include<
//图形库头文件
#include<
conio.h>
//控制台输入输出,包含getch()函数
time.h>
//时间函数
stdlib.h>
//随机函数头文件
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()函数
Setbkcolor()函数用于定义背景颜色,
通过for()循环画15*15的棋盘界面,
画棋盘线条用lineh()函数,
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].北京:
[5]王连相.C/C++程序设计上机指导与测试(第二版)[M].中国铁道出版社,2011
[6]陈超.C语言函数手册[M].机械工业出版社,1999
[7]杨传杰.C语言的实际应用[M].安徽科学技术出版社,2000
致谢
感谢两周以来两位老师尤其是朱老师以及各位同学的的帮助,使得我能够顺利完成此次C语言课程设计任务,使得我对结构化的程序设计思想有了进一步的理解,对c语言程序设计有了更深的体会,最重要的是能培养好的代码风格,这对我来说受益匪浅。
附录(源代码)
//五子棋人机对战
//电脑方设计思路:
在能下棋的空位置中,假设电脑和玩家下在此处,分别算出各个空位置的分数,并找出最大值
//如果最大值是玩家下的,那么电脑就“抢”他的位置,即做到了“防守”
//如果最大值是电脑下的,那就让电脑在此处下,即做到了“进攻”
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<
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("
您是否让电脑先下?
),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;
=750;
i=i+50){
for(j=50;
j=j+50){
//判断是否能下,且下好位置
if(m.x<
i+10&
&
m.x>
i-10&
m.y<
j+10&
m.y>
j-10&
a[i/50][j/50]==0){
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;
for(j=1;
j++){
score_c[i][j]=0;
score_p[i][j]=0;
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];
if(score_c[i][j]>
max){
max=score_c[i][j];
s=i;
t=j;
if(score_p[i][j]>
max=score_p[i][j];
a[s][t]=2;
//在最高分处落棋
fillcircle(s*50,t*50,20);
x=judge(s,t,k);
outtextxy(200,0,"
---你输啦按任意键继续---"
}
}
}
/*开始界面函数*/
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+=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(770,200,"
五"
outtextxy(770,320,"
子"
outtextxy(770,440,"
棋"
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;
m+5,i<
if(a[i][n]!
=s)
break;
else
p++;
for(i=m-1;
i>
m-5,i>
0;
i--){
q++;
heng=p+q;
for(j=n,p=0;
n+5,j<
if(a[m][j]!
for(j=n-1,q=0;
j>
n-5,j>
j--){
shu=p+q;
for(i=m,j=n,p=0;
16,i<
m+5,j<
i++,j++){
if(a[i][j]!
for(i=m-1,j=n-1,q=0;
0,i>
m-5,j>
i--,j--){
zuoxie=p+q;