五子棋游戏程序开发实验报告.docx
- 文档编号:6044654
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:39
- 大小:21.04KB
五子棋游戏程序开发实验报告.docx
《五子棋游戏程序开发实验报告.docx》由会员分享,可在线阅读,更多相关《五子棋游戏程序开发实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
五子棋游戏程序开发实验报告
代码:
#include
#include
charchess[20][20];//棋盘
intdraw[15][15][4][5];//记录平局
intflag[20][20];//判断是否已有落子
intmark[20][20];//判断是否历遍该处
intcount[20][20],num=0;//每个点构成活三、活四、冲四的数目
intscore=0;//记录每个点的可去性
intround=0;//记录回合数
intvictor=0;//victor=1时表胜利,victor=-1时表失败
intact_two_num=0,act_one_num=0;
intdead_three_num=0;//记录活二
(一)数
charchess_kind1[11][20]={"x+xxx","xx+xx","xxx+x","xxxx+","+xxxx",
"++xxx+","+x+xx+","+xx+x+","+xxx++","+xxxx+","xxxxxx"};
charchess_kind2[11][20]={"o+ooo","oo+oo","ooo+o","oooo+","+oooo",
"++ooo+","+o+oo+","+oo+o+","+ooo++","+oooo+","oooooo"};
charchess_kind3[6][20]={"+xx+++","++xx++","+++xx+","+x+x++","++x+x+","+x++x+"};
charchess_kind4[6][20]={"+oo+++","++oo++","+++oo+","+o+o++","++o+o+","+o++o+"};
charchess_kind5[4][20]={"+x++++","++x+++","+++x++","++++x+"};
charchess_kind6[14][20]={"+o++++","++o+++","+++o++","++++o+"};
charchess_kind7[10][20]={"ox+x+x","ox+xx+","ox++xx","oxx++x","oxxx++",
"x+x+xo","+xx+xo","xx++xo","x++xxo","++xxxo"};
charchess_kind8[10][20]={"xo+o+o","xo+oo+","xo++oo","xoo++o","xooo++",
"o+o+ox","+oo+ox","oo++ox","x++xxo","++ooox"};
//初始化mark,count,draw
voidinitial(){
inti=0,j=0,k=0,l=0;
for(i=0;i<15;i++){
for(j=0;j<15;j++){
for(k=0;k<4;k++){
for(l=0;l<15;l++){
draw[i][j][k][l]=0;
}
}
}
}
for(i=0;i<15;i++){
for(j=0;j<15;j++){
mark[i][j]=0;
count[i][j]=0;
}
}
}
//选择棋色
intchose_color(){
intchose;
printf("\t\t\t\tx:
黑棋o:
白棋\n\n");
printf("\t\t\t\t选择棋色\n");
printf("\t\t\t\t1黑棋\n");
printf("\t\t\t\t2白棋\n");
printf("\t\t\t\t");
scanf("%d",&chose);
if(chose==1)
return1;
else
return0;
}
//平局检测
intcheck_draw(charoppsite){
intr=0,c=0,i=0,j=0,k=0;
intl=0,m=0,n=0,p=0;
int*x[4]={&p,&l,&m,&l};
int*y[4]={&l,&p,&l,&l};
for(r=0;r<15;r++){
for(c=0;c<15;c++){
for(k=0;k<4;k++)
for(i=0;i<5;i++){
for(j=4;j>=0;j--){
l=i-j;
m=j-i;
if(judge_boundary((r+1)+*x[k],(c+1)+*y[k])==1){
draw[r][c][k][i]=1;
break;
}else{
if(chess[r+*x[k]][c+*y[k]]==oppsite){
draw[r][c][k][i]=1;
break;
}
}
}
}
}
}
for(r=0;r<15;r++){
for(c=0;c<15;c++){
for(k=0;k<4;k++){
for(i=0;i<5;i++){
if(draw[r][c][k][i]==0)
return0;
}}}}
return1;
}
//判断输入是否越界
intjudge_boundary(introw,intcol){
if(row>15||row<1||col>15||col<1)
return1;
else
return0;
}
//打印棋盘
voidprint_chessboard(){
inti=0,j=0,k=0;
printf("\n\n\n\n\n");
printf("\t\t\t\t五子棋\n\n");
printf("\t\t\t\to:
白棋x:
黑棋\n\n");
printf("\t\t");
printf("%-4d",0);
for(i=1;i<17;i++)
printf("%-3d",i);
printf("\n\t\t%-3d",1);
for(i=0;i<15;i++){
for(j=0;j<15;j++){
printf("%2c",chess[i][j]);
}
if(i+2<16)
printf("%3d\n\t\t%-3d",i+1,i+2);
}
printf("%3d\n\t\t",15);
printf("%-4d",0);
for(i=1;i<17;i++){
printf("%-3d",i);
}
}
//活三、活四、冲四的判断与搜索
//判断存放的棋子是否形成活三、活四、冲四
intjudge_active34(charactive_three[][20],charactive_four[][20],charplayer){
inti=0,j=0;
/*for(i=0;i<6;i++){
printf("*active_three[%d]=%s\n",i,active_three[i]);
}*/
if(player=='x'){
//活三
for(i=0;i<11;i++){
for(j=0;j<6;j++){
if(strcmp(chess_kind1[i],active_three[j])==0){
if(i==10)
return-1;
else
returni+1;
}
}
//printf("\nchess_kind1=%s,active_three=%s\n",chess_kind1[i],active_three[j]);
}
//活四、冲四
for(i=0;i<11;i++){
for(j=0;j<5;j++){
if(strcmp(chess_kind1[i],active_four[j])==0){
//printf("i=%d,%s\n",i,active_four[j]);
returni+1;
}
}
}
}
else{
for(i=0;i<11;i++){
for(j=0;j<6;j++){
//printf("\nchess_kind2=%s\n",chess_kind2[i]);
if(strcmp(chess_kind2[i],active_three[j])==0){
if(i==10)
return-1;
else
returni+1;
}
}
}
//活四、冲四
for(i=0;i<11;i++){
for(j=0;j<5;j++){
if(strcmp(chess_kind2[i],active_four[j])==0)
returni+1;
}
}
}
return0;
}
//横向搜索
inthorizontal(intr,intc,charplayer){
inti=0,j=0;
charactive_three[20][20],active_four[20][20];
inttemp;
//活三
for(i=0;i<6;i++){
//printf("i=%d\n",i);
for(j=5;j>=0;j--){
//printf("j=%dyes\n",j);
if(judge_boundary((r+1),(c+1)+i-j)==1){
active_three[i][5-j]='';
active_three[i][1]='\0';
break;
}
else{
active_three[i][5-j]=chess[r][c+i-j];
}
active_three[i][6]='\0';
}
//if(r+1==7&&c+1==2)
//printf("\n%d,%dactive_three=%s\n",r+1,c+1,active_three[i]);
}
//活四、冲四
for(i=0;i<5;i++){
for(j=4;j>=0;j--){
if(judge_boundary((r+1),(c+1)+i-j)==1){
active_four[i][4-j]='';
active_three[i][1]='\0';
break;
}
else
active_four[i][4-j]=chess[r][c+i-j];
}
active_four[i][5]='\0';
//printf("\n%d,%dactive_four=%s\n",r+1,c+1,active_four[i]);
}
temp=judge_active34(active_three,active_four,player);
returntemp;
}
//纵向搜索
intvertical(intr,intc,charplayer){
inti=0,j=0;
charactive_three[6][20],active_four[5][20];
inttemp;
//活三
for(i=0;i<6;i++){
for(j=5;j>=0;j--){
if(judge_boundary((r+1)+i-j,(c+1))==1){
active_three[i][5-j]='';
active_three[i][1]='\0';
break;
}
else{
active_three[i][5-j]=chess[r+i-j][c];
active_three[i][6]='\0';
}
}
//printf("\nr=%d,c=%d,active_three=%s\n",r+1,c+1,active_three[i]);
}
//活四、冲四
for(i=0;i<5;i++){
for(j=4;j>=0;j--){
if(judge_boundary((r+1)+i-j,(c+1))==1){
active_four[i][4-j]='';
active_four[i][1]='\0';
break;
}
else
active_four[i][4-j]=chess[r+i-j][c];
active_four[i][5]='\0';
//if(r+1==1&&c+1==5)
//printf("%c",active_four[i][4-j]);
}
//if(r+1==1&&c+1==5)
//printf("\nr=%d,c=%d,active_four=%s\n",r+1,c+1,active_four[i]);
}
temp=judge_active34(active_three,active_four,player);
//printf("temp=%d\n",temp);
returntemp;
}
//左斜搜索
intleft_oblique(intr,intc,charplayer){
inti=0,j=0;
charactive_three[20][20],active_four[20][20];
inttemp;
//活三
for(i=0;i<6;i++){
for(j=5;j>=0;j--){
if(judge_boundary((r+1)-i+j,(c+1)+i-j)==1){
active_three[i][5-j]='';
active_three[i][1]='\0';
break;
}
else
active_three[i][5-j]=chess[r-i+j][c+i-j];
active_three[i][6]='\0';
}
}
//活四、冲四
for(i=0;i<5;i++){
for(j=4;j>=0;j--){
if(judge_boundary((r+1)-i+j,(c+1)+i-j)==1){
active_four[i][4-j]='';
active_four[i][1]='\0';
break;
}
else
active_four[i][4-j]=chess[r-i+j][c+i-j];
//if(r+1==7&&c+1==1)
//printf("%c",active_four[i][4-j]);
}
active_four[i][5]='\0';
}
temp=judge_active34(active_three,active_four,player);
returntemp;
}
//右斜搜索
intright_oblique(intr,intc,charplayer){
inti=0,j=0;
charactive_three[20][20],active_four[20][20];
inttemp;
//活三
for(i=0;i<6;i++){
for(j=5;j>=0;j--){
if(judge_boundary((r+1)+i-j,(c+1)+i-j)==1){
active_three[i][5-j]='';
active_three[i][1]='\0';
break;
}
else
active_three[i][5-j]=chess[r+i-j][c+i-j];
}
active_three[i][6]='\0';
//printf("\nr=%d,c=%d,active_three=%s\n",r+1,c+1,active_three[i]);
}
//活四、冲四
for(i=0;i<5;i++){
for(j=4;j>=0;j--){
if(judge_boundary((r+1)+i-j,(c+1)+i-j)==1){
active_four[i][4-j]='';
active_four[i][1]='\0';
break;
}
else
active_four[i][4-j]=chess[r+i-j][c+i-j];
}
active_four[i][5]='\0';
//if(r+1==8&&c+1==9)
//printf("\nr=%d,c=%d,active_four=%s\n",r+1,c+1,active_four[i]);
}
temp=judge_active34(active_three,active_four,player);
returntemp;
}
//输入落子位置
voidinput_position(intchose){
introw,col;
printf("\n\n\t\t输入落子位置:
");
input:
scanf("%d%d",&row,&col);
if(judge_boundary(row,col)){
printf("\n\t\t下标越界请重新输入:
");
gotoinput;
}
if(flag[row-1][col-1]==1){
printf("\n\t\t该位置已有已有落子请重新输入:
");
gotoinput;
}
if(chose==1){
//printf("ok\n");
flag[row-1][col-1]=1;
chess[row-1][col-1]='x';
}
else{
flag[row-1][col-1]=1;
chess[row-1][col-1]='o';
}
//printf("yes\n");
system("cls");
}
//判断是否五子
voidfive_point(intchose,charobject){
intr,c;
chartemp;
intresult[4];
if(chose==1)
temp='x';
else
temp='o';
inti=0,j=0,k=0,l=0;
for(r=0;r<15;r++){
for(c=0;c<15;c++){
if(judge_boundary(r+1,c+1)==1||victor==1||victor==-1)
return;
//num++;
//printf("num=%d,r=%d,c=%d\n",num,r+1,c+1);
if(object=='p'){
//禁手的判断
result[0]=horizontal(r,c,temp);
result[1]=vertical(r,c,temp);
result[2]=left_oblique(r,c,temp);
result[3]=right_oblique(r,c,temp);
for(i=0;i<4;i++){
if(result[i]==-1){
victor=-1;
return;
}
}
}
for(i=0;i<5;i++){
if(chess[r+i][c+i]!
=temp||judge_boundary(r+1+i,c+1+i)==1)
break;
}
for(j=0;j<5;j++){
if(chess[r+j][c-j]!
=temp||judge_boundary(r+1+j,c+1-j)==1)
break;
}
for(k=0;k<5;k++){
if(chess[r+k][c]!
=temp||judge_boundary(r+1+k,c+1)==1)
break;
}
for(l=0;l<5;l++){
if(chess[r][c+l]!
=temp||judge_boundary(r+1,c+1+l)==1)
break;
}
//num++;
//printf("temp=%c,num=%d,r=%d,c=%d\n",temp,num,r,c);
//printf("i=%d,j=%d,k=%d,l=%d\n",i,j,k,l);
if(i==5||j==5||k==5||l==5){
victor=1;
return;
}
else{
for(i=0;i<4;i++){
//printf("\nchess[r][c]=%c\n",chess[r][c]);
if(result[i]>=6&&result[i]<=10)
count[r][c]++;
}
if(count[r][c]>=2){
victor=-1;
return;
}
}
}
}
}
//电脑计算每一种下法的得分
voidaccum_score(intr,intc,introute,intdirction,charcomputer){
intzero=0;
intopp_route;
int*x[8]={&zero,&zero,&route,&opp_route,&route,&opp_route,&opp_route,&route};
int*y[8]={&zero,&opp_route,&zero,&zero,&route,&opp_route,&route,&opp_route};
//printf("route=%d\n",route);
if(route==3){
score++;
for(route=0;route<3;route++){
opp_route=-route;
if(chess[r+*x[dirction-1]][c+*y[dirction-1]]==computer)
score++;
}
}
//printf("score=%d\n",score);
return;
}
//死三的判断
intjudge_dead3(chardead_three[][20],charside){
inti,j;
for(i=0;i<10;i++){
for(j=0;j<6;j++){
if(side=='x'){
//printf("chess_kind3=%s,active_two=%s\n",chess_kind3[i],active_two[j]);
if(strcmp(chess_kind7[i],dead_three[j])==0)
returni+1;
}
elseif(side=='o'){
if(strcmp(chess_kind8[i],dead_three[j])==0)
returni+1;
}
}
}
return0;
}
//死三的搜索
voidsearch_dead_three(intr,i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 五子棋 游戏 程序 开发 实验 报告