五子棋课程设计实验报告Word下载.docx
《五子棋课程设计实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《五子棋课程设计实验报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
(5)悔棋功能。
玩家可以有三次悔棋机会。
(6)胜负判断功能。
程序能对下棋的结果进行判断,分出胜负。
并显示获胜方。
(7)读档、存档功能。
游戏中途退出会提示是否存档,如果存档,则下次开始的时候会提示是否读档继续上次的游戏。
第三章总体设计
3.1功能模块设计
3.1.1任务执行流程图
否是
否
是
3.1.2下棋函数流程图
是否
否
是
否是
3.2数据结构设计
3.2.1定义结构体
将棋盘上每个点的左边定义为一个结构体;
typedefstruct
{
intx,y;
}point;
3.2.2定义数组
定义数组board[15][15]表示棋盘,用来记录棋盘上每个棋子的状态;
3.2.3全局变量
定义整形数组back[4]用来记录前两步双方下棋的状态,便于后面进行悔棋操作
定义整形n=3;
用来记录悔棋次数
3.3函数功能描述
1、显示欢迎信息boolwelcome();
2、初始化棋盘voidInitBoard();
3、输出棋盘voidchessboard();
4、判断胜负intWin(charc);
5、下棋voidplay(point&
r);
6、显示获胜voidshowsusscced(charc);
7、悔棋boolBackStep(intback[]);
8、人机对战智能算法voidComAlgo(point&
9、存盘函数boolSaveLoad();
10、读盘函数boolDownLoad();
第四章程序实现
4.1源码分析
1、显示欢迎信息
boolwelcome()
{
charch;
printf("
\n\n\n\n"
);
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"
┃WelcomeyoutogobangWorld!
┃\n"
┃1、YoucanusetheA,D,WandSkeytomovethechessman;
┃2、YoucanpressSpacekeytoenterafteryoumoveit;
┃3、YoucanuseEsckeytoexitthegame;
┃4、Don'
tmovethepiecesoutofthechessboard.┃\n"
┃Doyouwanttocontinue?
(Y/N)┃\n"
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"
while(!
strchr("
YN"
ch=toupper(getch())))
{
putchar('
\a'
}
if(ch=='
N'
)returnfalse;
elsereturntrue;
}
2、初始化棋盘
voidInitBoard()
inti,j;
\n\n是否读档?
(Y/N)\n"
if((ch=toupper(getch()))=='
Y'
&
&
DownLoad())
printf("
读档成功!
\n"
else
for(i=0;
i<
15;
i++)
for(j=0;
j<
j++)
board[i][j]='
'
;
chessboard();
3、输出棋盘
voidchessboard()
//清屏
system("
cls"
//输出棋盘的上边缘
010203040506070809101112131415\n"
┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓\n"
┃│││││││││││││││┃\n"
for(inti=1;
=15;
i++)
//输出列序号及相应的列元素
%02d┣─"
i);
for(intj=1;
{
switch(board[i-1][j-1])
{
//(由于在命令行模式下显示,所以,颜色是颠倒的)
case'
:
┼─"
break;
//如果当前位置无子,则输出棋盘
h'
○─"
//如果是黑子,则输出黑子的符号
b'
●─"
//如果是白子,则输出白子的符号
g'
⊙─"
//显示光标
}
}
//输出每列的最后一个制表符
┫%02d\n"
┗━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┷━┛\n"
4、下棋
voidplay(point&
r)
charkey,c;
do
while(!
ADWSZ"
key=toupper(getch())))
if(key==27||key==32)break;
putchar('
switch(key)
case'
A'
//向左
if(r.y<
=1)break;
elser.y--;
c=board[r.x-1][r.y-1];
//记录光标
board[r.x-1][r.y-1]='
chessboard();
board[r.x-1][r.y-1]=c;
break;
D'
//向右
if(r.y>
=15)break;
elser.y++;
W'
//向上
if(r.x<
elser.x--;
S'
//向下
if(r.x>
elser.x++;
case32:
//SPACE空格
if(board[r.x-1][r.y-1]!
='
)key=0;
//key的值修改为非32的数值
else
board[r.x-1][r.y-1]='
back[0]=r.x-1;
back[1]=r.y-1;
//记录当前位置,便于悔棋
chessboard();
Z'
//悔棋
BackStep(back);
case27:
//ESC退出
printf("
GameOver!
是否存档?
if((c=toupper(getch()))=='
SaveLoad())
printf("
存档成功!
exit
(1);
default:
fflush(stdin);
}while(key!
=32);
注:
1、W、S、A、D分别表示上下左右键。
如果超出了棋盘则不进行操作。
否则向键值指示的方向移动一步。
2、c=board[r.x-1][r.y-1];
board[r.x-1][r.y-1]='
board[r.x-1][r.y-1]=c;
这四句表示记录当前移动位置,然后显示光标,显示完以后还原棋盘。
3、按空格键表示下棋,如果当前位置有棋子则不进行操作。
back[0]=r.x-1;
用于记录当前位置,便于悔棋。
4、按Z悔棋
5、按ESC键退出,并且提示是否存档。
5、判断胜负
intWin(charc)
inti,j,ok=1;
//判断横着的5个是否都相等
for(i=0;
for(j=0;
11;
if(board[i][j]==c&
board[i][j+1]==c&
board[i][j+2]==c&
board[i][j+3]==c&
board[i][j+4]==c)
returnok;
//判断竖着的5个是否都相等
for(j=0;
board[i+1][j]==c&
board[i+2][j]==c&
board[i+3][j]==c&
board[i+4][j]==c)
return1;
//判断左斜5个是否都相等
j++)
board[i+1][j+1]==c&
board[i+2][j+2]==c&
board[i+3][j+3]==c&
board[i+4][j+4]==c)
//判断右斜5个是否都相等
for(j=14;
j>
3;
j--)
board[i+1][j-1]==c&
board[i+2][j-2]==c&
board[i+3][j-3]==c&
board[i+4][j-4]==c)
returnok=0;
全篇扫面棋盘,从四个方向判断是否存在连着5个棋子
6、显示获胜
voidshowsusscced(charc)
if(c=='
)
游戏结束白棋获胜!
elseif(c=='
游戏结束黑棋获胜!
游戏结束和棋!
7、悔棋
boolBackStep(intback[])
if(n>
0)
board[back[0]][back[1]]=board[back[2]][back[3]]='
chessboard();
n--;
悔棋成功,您还有%d次悔棋机会\n"
n);
returntrue;
悔棋超过三次,您不能悔棋了!
returnfalse;
8、存盘函数
boolSaveLoad()
FILE*f;
f=fopen("
Load.TXT"
"
w"
if(f==NULL)
存档失败!
fwrite(board,sizeof(char),225,f);
fclose(f);
9、读盘函数
boolDownLoad()
r"
读档失败!
fread(board,sizeof(char),225,f);
存盘存在当前文件夹内的Load.txt文件中,用fwrite()函数和fread()函数读取和存储数组元素。
10、人机对战智能算法
voidComAlgo(point&
//棋型数组
intqiju[2][15][15][8][2]={0};
/*其中第一个下标为0时表示白棋,为1时表示黑棋,第二和第三个下标表示(x,y),
第四个下标表示8个方向,最后一个下标为0时表示棋子数,为1时表示空格数*/
chard;
//表示黑棋或白棋
intk,i,j,q,a=1;
//(k,i,j,q,0/1)表示棋型数组;
a,b用来计数
intb=0,y1=0,y2=0,x1=0,x2=0;
//b表示得分;
(x1,y1)和(x2,y2)表示坐标
inta1[15][15]={0},a2[15][15]={0};
//用来记录白棋和黑棋各个棋子位置的得分
/****************为双方填写棋型表************/
for(k=0;
k<
2;
k++)
if(board[i][j]=='
{
for(q=0;
q<
8;
q++)
{
if(k==0)d='
elsed='
//左←
if(q==0&
=0)
{
for(;
j-a>
=0;
{
if(board[i][j-a]==d){b++;
a++;
continue;
elsebreak;
}
qiju[k][i][j][q][0]=b;
b=0;
if(board[i][j-a]=='
j-a>
=0){qiju[k][i][j][q][1]=1;
a=1;
else{qiju[k][i][j][q][1]=0;
}
//左上↖
if(q==1&
i>
=0&
i-a>
if(board[i-a][j-a]==d){b++;
if(board[i-a][j-a]=='
i-a>
else{qiju[k][i][j][q][1]=0;
//上↑
if(q==2&
if(board[i-a][j]==d){b++;
if(board[i-a][j]=='
//右上↗
if(q==3&
15)
j+a<
if(board[i-a][j+a]==d){b++;
if(board[i-a][j+a]=='
15){qiju[k][i][j][q][1]=1;
//右→
if(q==4&
j+a<
if(board[i][j+a]==d){b++;
if(board[i][j+a]=='
//右下↘
if(q==5&
15&
i+a<
if(board[i+a][j+a]==d){b++;
if(board[i+a][j+a]=='
i+a<
//下↓
if(q==6&