五子棋源码实验报告及人机对战说明Word格式文档下载.docx
- 文档编号:7926313
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:33
- 大小:107.43KB
五子棋源码实验报告及人机对战说明Word格式文档下载.docx
《五子棋源码实验报告及人机对战说明Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《五子棋源码实验报告及人机对战说明Word格式文档下载.docx(33页珍藏版)》请在冰点文库上搜索。
冲棋型共9种:
己方4种,对方4种,边界1种。
左图为边界冲棋型。
空点的右端为边界。
或
左图为己冲2。
从左端的空点向右看会发现己方有连续的2个子,且右端有挡(此处有挡表示有对方的子或为边界)。
故该点的1方向为己冲2。
左图为对冲4。
(4)空活棋型。
从一空点向一方向看有1个空点,继续看有己方或对方的活棋型。
空活棋型共8种:
左图为己空活2。
从左端的空点向右看有1个空点,继续看会发现己方有连续的2个子,且右端无挡。
故该点的1方向为己空活2。
左图为对空活1。
(5)空冲棋型。
从一空点向一方向看有1个空点,继续看有己方或对方或边界冲棋型。
空冲棋型共9种:
左图为边界空冲棋型。
空点的右端为空点再右看为边界。
或
左图为己空冲2。
从左端的空点向右看有1个空点,继续看会发现己方有连续的2个子,且右端有挡。
故该点的1方向为己空冲2。
3人人对战的实现。
双方玩家轮流下子,直到一方形成五连即判为胜方。
下子时输入棋盘上显示的对应坐标。
如果某方需要悔棋,则输入1515即可。
悔棋只能悔一步。
在人机对战中亦可悔棋。
4电脑下子的实现。
人机对战中电脑下子是通过AI(int*p,int*q)这个函数实现的。
用p、q返回下子的坐标。
先历遍棋盘上所有点,如发现一个空点则调用函数value(intp,intq)计算该空点的价值。
每个点又由8个方向的棋型组成。
调用函数qixing(intn,intp,intq)判断空点pq在n方向上的棋型号。
对每种棋型进行赋值,然后对各个方向的棋型进行分析。
最后计算出该空点的价值。
如此找到棋盘上价值最大的空点,则电脑在该处下子。
5棋型价值的计算。
棋型价值的计算是通过函数value(intp,intq)实现的。
先调用函数qixing(intn,intp,intq)判断空点pq在n方向上的棋型号。
n为1-8方向从右顺时针开始数。
对8个方向的棋型进行分析后给出该点的价值。
各种棋型的价值存在数组a[2][4][4]中。
本程序将两相反方向的棋型进行合在一起进行分析。
本程序分为六类进行讨论。
1空棋型and其他。
2边界冲棋型and其他。
3边界空冲棋型and其他。
4己活己活己活己冲对活对活对活对冲。
5己活对活己活对冲己冲对活己冲对冲。
6其他棋型。
7
6胜利及棋型的判断。
胜利及棋型的判断都调用了函数yiwei(intn,int*i,int*j)。
在n方向上对坐标ij移位。
n为1-8方向从右顺时针开始数。
胜利的判断:
每下一次子从该点向1方向移位,移位后判断新点是否与下的子相同。
如相同则继续移位判断,否则转向判断即n+=4;
如转向后仍然没五连,则换下一个方向判断即n-=3;
直到出现五连则胜利,如果8个方向判断完都没有五连则返回0,表示还未胜利。
棋型的判断:
棋型的判断主要运用switch语句。
在某一方向移位后判断该点的状态。
最后得出该方向上的棋型号。
7补充说明
1.在WIN7环境下用VC++运行棋盘之间有空隙,影响美观。
建议在XP操作系统下运行。
2.程序经过多次修改。
各次修改如下:
V1.1修改了胜负判断函数win的算法。
V1.2加上了人人对战的功能,并加上了开始界面。
V1.3增加了一些注释,并对棋型值数组做了更改。
V1.4修正了2个BUG,进一步对棋型值数组做了更改。
V1.5修改了画棋盘draw的算法,改变了主函数main,增加函数start,并增加了赢棋之后是否继续的功能,还完善了各棋型的赋值,进一步对棋型值数组做了更改。
实验报告
2014–2015学年第一学期任课老师:
课程名称
结构化程序综合设计
班级
学号
实验题目
设计一个简单五子棋游戏程序
实验时间
实验开始日期:
报告提交日期:
实验目的、要求
设计一个简单五子棋游戏程序,能够实现人机对战!
实验要求
(1)、输出游戏规则并由用户决定是否遵守并开局。
(2)、要求动态画出棋盘大小。
(3)、画棋子并确定其颜色。
(4)、玩家轮流下棋。
(5)、判断键盘输入哪个键按规则执行操作
(6)、判断谁先落棋。
(7)、判断赢家
实验步骤与容
1、主要设计思想;
有使用光标移动函数,进行光标的移动,将光标跟存下棋子的数组结合一起运用,其中人下棋子只需一个光标位置移动函数即可,对于电脑下棋,这就需要一个函数找出在棋盘中所有没有落子的位置进行判断,找出其中价值最大的一点并将光标移过去,判断是否胜利就是一个判断函数,每次下棋子都要判断,主要判断方法就是在这一点上、下、左、右、左斜上、右斜上、左斜下、右斜下,八个方向判断一下即可。
2、程序框图
3、核心代码解释
voidgotoxy(intx,inty);
//建立坐标函数
voiddrawqipan();
//绘制棋盘及数据初始化
voidjilu();
//人机记录落子情况
intcluozi(intx,inty);
//由电脑落子时调用
voidluozi();
//人机玩家落子
intcheckWin();
//检查游戏是否有输赢
voidKeypress(charn);
//人机光标位置移动
voidKeypress1(charn);
//人人光标位置移动
voidyiwei(intn,int*i,int*j);
/*在n方向上对坐标ij移位n为1-8方向从右顺时针开始数*/
intqixing(intn,intp,intq);
/*checkWin返回空点pq在n方向上的棋型号n为1-8方向从右顺时针开始数*/
intvalue(intp,intq);
/*计算空点pq的价值以k返回*/
voidAI();
/*电脑下子*/
voidluozi1();
//人人玩家落子
voidjilu1();
//人人记录落子情况
//光标函数
voidgotoxy(intx,inty)//建立坐标函数
{
COORDc;
c.X=2*x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
//修改当前光标的位置
}
//光标位置移动
voidKeypress(charn)
switch(n)
{
caseup:
weizhi.y--;
gotoxy(weizhi.x,weizhi.y);
break;
//向上移动光标
caseleft:
weizhi.x--;
//向左移动光标
caseright:
weizhi.x++;
//向右移动光标
casedown:
weizhi.y++;
//向下移动光标
caselz:
luozi();
//开始落子操作
}
//电脑下子
voidAI()/*电脑下子*p*q返回下子坐标*/
inti,j,k,max=0,I,J;
/*IJ为下点坐标*/
for(j=0;
j<
15;
j++){
for(i=0;
i<
i++){
if(Q[j][i]==0)/*历遍棋盘,遇到空点则计算价值,取最大价值点下子。
*/
k=value(i,j);
//计算价值函数调用
if(k>
=max){
I=i;
J=j;
max=k;
cluozi(I,J);
//找到价值最大的点电脑下子
实验结果记录以及与预期结果比较以及分析
1、程序调试过程中遇到的困难
期间遇到了一个致命的错误,找了好久好久才发现,就是光标函数的i,j跟储存棋盘情况的i,j正好相反,这个错误找出来感觉真是不容易,还有一个麻烦就是在人机对战的时候刚刚开始执行的人下完棋子就判断结果,所以每次判断都有延迟,最后才发现,不管是人跟电脑下棋子后都应该判断。
其他还是七七八八的小错误,现在想想要想把一个程序不出错的编写确实不容易啊!
2、程序结果
结果:
人人对战
总结以及心得体会
经过本次试验,我c语言的应用了,以前只是编写一些小小的程序,现在可以利用简单的c程序可以做出稍微大型一点的程序,像五子棋这种游戏想想我们玩的时候感觉很奇妙,但是经过我的深思熟虑我也可以在计算机用简单的c语言给搞定了,我们有时感觉一个小小的游戏玩的时候感觉很简单,但是在用代码实现的时候却发现考虑的东西很多,不然那个游戏的bug就会很多,得经过好多实例的检验。
只有这样我们才能让程序按照我们的意愿去实现它的功能!
指导老师评阅意见
指导老师:
年月日
源码:
#include"
windows.h"
stdio.h"
conio.h"
#defineup'
w'
#defineleft'
a'
#definedown'
s'
#defineright'
d'
#definelz'
p'
#definecls'
m'
#defineSPA0
#defineMAN1
#defineCOM2/*空位置设为0,玩家下的位置设为1,电脑下的位置设为2*/
structstu//定义位置记录结构体
intx;
inty;
}weizhi;
intplayer=0;
intQ[15][15]={0};
//定义数组以记录落子情况
/*返回空点pq在n方向上的棋型号n为1-8方向从右顺时针开始数*/
voidAI(int*p,int*q);
/*电脑下子*p*q返回下子坐标*/
voiddrawqipan()//绘制棋盘及数据初始化
inti,j;
system("
cls"
);
//清除屏幕
i<
i++)
j<
j++)
Q[i][j]=0;
printf("
十"
\n"
weizhi.x=6;
weizhi.y=6;
//程序数据初始化
gotoxy(6,6);
voidjilu()//记录落子情况
Q[weizhi.y][weizhi.x]=player+1;
if(player==1)player=0;
//玩家变换
elseplayer=1;
voidjilu1()//记录落子情况
Q[weizhi.x][weizhi.y]=player+1;
intcluozi(intx,inty)//由电脑落子时调用
weizhi.x=x;
weizhi.y=y;
gotoxy(weizhi.x,weizhi.y);
jilu();
○"
voidluozi()//玩家落子
if(Q[weizhi.y][weizhi.x]==0)//判断当前位置是否已经落子
●"
voidluozi1()//玩家落子
if(Q[weizhi.x][weizhi.y]==0)//判断当前位置是否已经落子
if(player)
jilu1();
else
intcheckWin()//检查游戏是否有输赢
intp;
intr,c,rr,cc,count=0;
p=player==0?
2:
1;
for(c=0;
c<
c++)
for(r=0;
r<
r++)
if(Q[r][c]!
=p)
continue;
//检查列
rr=r;
cc=c;
while(--cc>
=0&
&
Q[rr][cc]==p)count++;
cc=c;
while(++cc<
15&
if(count+1>
=5)
returnp;
//检查行
count=0;
while(--rr>
while(++rr<
//检查反斜边
cc--;
rr--;
while((cc>
=0||rr>
=0)&
Q[rr][cc]==p){count++;
cc--;
}rr=r;
cc++;
rr++;
while((cc<
15||rr<
15)&
cc++;
//检查正斜边
15||rr>
=0||rr<
return0;
voidKeypress(charn)//光标位置移动
//开始落子操作
casecls:
drawqipan();
//重新开始
voidKeypress1(charn)//光标位置移动
if(weizhi.y<
=0)weizhi.y=14;
elseweizhi.y--;
if(weizhi.x<
=0)weizhi.x=14;
elseweizhi.x--;
if(weizhi.x>
=14)weizhi.x=0;
elseweizhi.x++;
if(weizhi.y>
=14)weizhi.y=0;
elseweizhi.y++;
luozi1();
voidyiwei(intn,int*i,int*j)/*在n方向上对坐标ij移位n为1-8方向从右顺时针开始数*/
case1:
*i+=1;
case2:
*j+=1;
case3:
case4:
*i-=1;
case5:
case6:
*j-=1;
case7:
case8:
intqixing(intn,intp,intq)/*返回空点pq在n方向上的棋型号n为1-8方向从右顺时针开始数*/
intk,m=0;
/*棋型号注解:
己活000-003己冲010-013对活100-103对冲110-113己空活020-023己空冲030-033对空活120-123对空冲130-133空-1边界冲-2边界空冲-3*/
yiwei(n,&
p,&
q);
if(p<
0||p>
14||q<
0||q>
14)k=-2;
/*边界冲棋型*/
switch(Q[q][p])
caseCOM:
m++;
14)
k=m+9;
returnk;
while(Q[q][p]==COM)
if(Q[q][p]==0)k=m-1;
/*己方活棋型*/
elsek=m+9;
/*己方冲棋型*/
break;
caseMAN:
k=m+109;
while(Q[q][p]==MAN)
if(Q[q][p]==SPA)k=m+99;
/*对方活棋型*/
elsek=m+109;
/*对方冲棋型*/
caseSPA:
k=-3;
/*边界空冲棋型*/
k=m+29;
if(Q[q][p]==SPA)k=m+19;
/*己方空活棋型*/
elsek=m+29;
/*己方空冲棋型*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 源码 实验 报告 人机 说明