五子棋课程设计实验报告Word格式文档下载.docx

上传人:b****7 文档编号:22115963 上传时间:2023-02-02 格式:DOCX 页数:33 大小:218.53KB
下载 相关 举报
五子棋课程设计实验报告Word格式文档下载.docx_第1页
第1页 / 共33页
五子棋课程设计实验报告Word格式文档下载.docx_第2页
第2页 / 共33页
五子棋课程设计实验报告Word格式文档下载.docx_第3页
第3页 / 共33页
五子棋课程设计实验报告Word格式文档下载.docx_第4页
第4页 / 共33页
五子棋课程设计实验报告Word格式文档下载.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

五子棋课程设计实验报告Word格式文档下载.docx

《五子棋课程设计实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《五子棋课程设计实验报告Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。

五子棋课程设计实验报告Word格式文档下载.docx

Cpu:

2.1GHZ,内存,2GB,硬盘:

320GB,操作系统:

windowsxp

软件环境:

安装VC++6.0

第二章功能描述

本程序用C语言实现了五子棋游戏,能进行基本的五子棋操作。

程序能实现界面的初始化功能、下棋功能、人机智能对战功能、胜负判断功能、悔棋功能、读档及存档功能,通过键盘操作控制下棋。

(1)显示欢迎界面。

在游戏开始时出现一个欢迎的界面同时介绍了游戏的规则;

(2)初始化功能。

程序初始化屏幕和棋盘,默认玩家先行。

(3)下棋操作。

利用W、S、A、D及空格键实现下棋操作,在下棋过程中能随时按ESC键退出。

(4)人机智能对战功能。

电脑根据玩家的下棋对棋盘进行智能分析,然后下棋,实现人机对弈。

(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++;

continu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1