五子棋游戏程序开发实验报告.docx

上传人:b****6 文档编号:6044654 上传时间:2023-01-03 格式:DOCX 页数:39 大小:21.04KB
下载 相关 举报
五子棋游戏程序开发实验报告.docx_第1页
第1页 / 共39页
五子棋游戏程序开发实验报告.docx_第2页
第2页 / 共39页
五子棋游戏程序开发实验报告.docx_第3页
第3页 / 共39页
五子棋游戏程序开发实验报告.docx_第4页
第4页 / 共39页
五子棋游戏程序开发实验报告.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

五子棋游戏程序开发实验报告.docx

《五子棋游戏程序开发实验报告.docx》由会员分享,可在线阅读,更多相关《五子棋游戏程序开发实验报告.docx(39页珍藏版)》请在冰豆网上搜索。

五子棋游戏程序开发实验报告.docx

五子棋游戏程序开发实验报告

代码:

#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

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

当前位置:首页 > 自然科学

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

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