高分求一个C语言的五子棋程序

2024-07-20 17:48:41作者:饭克斯

//但是这些代码由于编译器的原因,在TC下仍无法运行。请使用VC。

#include

#include

#include

#include

intChessData[15][15]={0};

intGuangbiaoData[2]={8,8};

intChessStepData[255][2]={0};

voidgotoxy(intx,inty)//gotoxy在TC中是在一个系统自带的函数,但是在VC中没有这个函数,所以在网上找到了这个函数以实现同样的功能。

//只有这一个函数是网上找的,别的全部我自己写的。

{

COORDc;

c.X=x-1;

c.Y=y-1;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);

}

voidGotoChess(intx,inty)

{

x=3*x-2;y=2*y-1;

gotoxy(x,y);

}

voidMove(intMoveData)//输入参数为用户输入的方向(1表示上,2表示下,3表示左,4表示右)

{

switch(MoveData)

{

case1:GuangbiaoData[1]-=1;break;

case2:GuangbiaoData[1]+=1;break;

case3:GuangbiaoData[0]-=1;break;

case4:GuangbiaoData[0]+=1;break;

default:printf(Move函数出错);

}

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

}

intGet(int*data)//该函数的功能是用户的按键,并转化为01234567(0表示输入错误,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。)

{//并返回输入的用户号码(共同键返回3),错误则返回0

inttemp;

B:temp=getch();

if(temp==224)

{

temp=getch();

switch(temp)

{

case72:*data=1;break;

case80:*data=2;break;

case75:*data=3;break;

case77:*data=4;break;

default:gotoB;

}

return2;

}

else

{

switch(temp)

{

case'w':

case'W':*data=1;return1;break;

case's':

case'S':*data=2;return1;break;

case'a':

case'A':*data=3;return1;break;

case'd':

case'D':*data=4;return1;break;

case13:*data=5;return2;break;

case32:*data=5;return1;break;

case8:*data=6;break;

case27:*data=7;break;

default:*data=0;return0;break;

}

return3;

}

}

voidMoveToEnd()

{

gotoxy(1,30);

}

intLogicBeOut(inta,intb)

{

if(a==-1||a==15||b==-1||b==15)return1;

elsereturn0;

}

intwin(intv)

{

inti=1,j=1,a=0,b=0;

while(ChessData[a=GuangbiaoData[0]-i-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b))i++;

while(ChessData[a=GuangbiaoData[0]+j-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b))j++;

if(i+j-1>=5)return1;

i=1,j=1,a=0,b=0;

while(ChessData[a=GuangbiaoData[0]+i-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b))i++;

while(ChessData[a=GuangbiaoData[0]-j-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b))j++;

if(i+j-1>=5)return1;

i=1,j=1,a=0,b=0;

while(ChessData[a=GuangbiaoData[0]-i-1][b=GuangbiaoData[1]-1]==v*2&&!LogicBeOut(a,b))i++;

while(ChessData[a=GuangbiaoData[0]+j-1][b=GuangbiaoData[1]-1]==v*2&&!LogicBeOut(a,b))j++;

if(i+j-1>=5)return1;

i=1,j=1,a=0,b=0;

while(ChessData[a=GuangbiaoData[0]-1][b=GuangbiaoData[1]-i-1]==v*2&&!LogicBeOut(a,b))i++;

while(ChessData[a=GuangbiaoData[0]-1][b=GuangbiaoData[1]+j-1]==v*2&&!LogicBeOut(a,b))j++;

if(i+j-1>=5)return1;

return0;

}

voidNewShow()//新棋局的开始

{

inti,j;

for(i=0;i<15;i++)

for(j=0;j<15;j++)

ChessData[i][j]=0;

system(cls);

for(i=1;i<=29;i++)

{

for(j=1;j<=43;j++)

if(i%2==1)printf(-);

elseif(j%3==1)printf(|);

elseprintf();

printf(\n);

}

GuangbiaoData[0]=8;GuangbiaoData[1]=8;

MoveToEnd();

printf(现在请用户1下棋\n);

printf(用户1使用w,s,a,d移动光标,空格键落子\n);

printf(用户2使用各方向键移动光标,回车键落子\n);

printf(按下Backspace键悔棋,按下esc返回主菜单\n);

GotoChess(8,8);

}

intBeOut(intdata)

{

intXiuzheng[2],New[2];

switch(data)

{

case1:Xiuzheng[0]=0;Xiuzheng[1]=-1;break;

case2:Xiuzheng[0]=0;Xiuzheng[1]=1;break;

case3:Xiuzheng[0]=-1;Xiuzheng[1]=0;break;

case4:Xiuzheng[0]=1;Xiuzheng[1]=0;break;

case5:Xiuzheng[0]=0;Xiuzheng[1]=0;break;

default:printf(BeOut函数出错);

}

New[0]=GuangbiaoData[0]+Xiuzheng[0];

New[1]=GuangbiaoData[1]+Xiuzheng[1];

if(New[0]>15||New[0]15||New[1]<1)return1;

elsereturn0;

}

voidUserChoose(int*choice)

{

system(cls);

printf(________________________________________________________________________________);

printf(________________________________________________________________________________);

printf($1.单人游戏);

printf(2.双人游戏);

printf(3.退出游戏);

printf(4.游戏帮助);

printf(________________________________________________________________________________);

printf(________________________________________________________________________________);

printf();

printf(开心五子棋);

printf();

printf(出品人:张云聪);

printf(学号:067108034);

printf(指导老师:邵艳玲);

printf();

printf();

printf(温馨提示,游戏时请把窗口最大化,以达到最佳效果);

printf(________________________________________________________________________________);

inttemp=0,i=0;

do

{

if((temp=getch())==224)

{

temp=getch();

if(temp==72&&i!=0)

{

gotoxy(34,3+i);

printf();

i--;

gotoxy(34,3+i);

printf($);

gotoxy(0,0);

}

elseif(temp==80&&i!=3)

{

gotoxy(34,3+i);

printf();

i++;

gotoxy(34,3+i);

printf($);

gotoxy(0,0);

}

}

elseif(temp==13){*choice=i+1;return;}

elseif(temp==27){*choice=3;return;}

elseif(temp=='1'||temp=='2'||temp=='3'||temp=='4'){*choice=temp-48;return;}

}while(1);

}

intCannotDo(intv1,intv2,intMoveData,intchoice)//第一个输入值为按键的用户号,第二个是本应该按键的用户号,第三个为按下键的对应值,第四个键代表游戏模式。

{

if(v1==3)return0;//如果用户输入的为共用按键,则CannotDo为假

elseif(v1==0)return1;//如果用户输入错误,则CannotDo为真

elseif(v1!=v2&&choice==2)return1;//如果不该此用户输入,而用户进行了输入,则CannotDo为真

if(BeOut(MoveData))return1;//如果移动出边界则CannotDo为真

return0;

}

intCannotLuozi()//判断是否可以落子。

{

if(ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1])

return1;

elsereturn0;

}

intluozi(intv)//玩家v落子。

{

ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]+=v*2;

if(v==1)printf(O);

elseif(v==2)printf(X);

elseprintf(luozi函数出错);

if(win(v)){MoveToEnd();printf(玩家%d获得了胜利!\n,v);for(inti=1;i<=240;i++)printf();GotoChess(GuangbiaoData[0],GuangbiaoData[1]);getch();return1;}

MoveToEnd();

printf(现在请用户%d下棋,v%2+1);

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

return0;

}

voidHuiQi(intstep)//输入的是当前的要悔的棋是第几步

{

GuangbiaoData[0]=ChessStepData[step-1][0];

GuangbiaoData[1]=ChessStepData[step-1][1];

ChessData[GuangbiaoData[0]-1][GuangbiaoData[1]-1]=0;

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

printf(-);

MoveToEnd();

printf(现在请用户%d下棋,(step+1)%2+1);

GotoChess(GuangbiaoData[0],GuangbiaoData[1]);

}

intDataGetAndChoose(intchoice)

{

intMoveData=0,i=0,temp;//MoveData0表示不可移动,1表示上,2表示下,3表示左,4表示右,5表示落子,6表示悔棋,7表示退出。

while(1)

{

loop:while(temp=Get(&MoveData),CannotDo(temp,i%2+1,MoveData,choice));

switch(MoveData)

{

case1:

case2:

case3:

case4:Move(MoveData);break;

case7:return0;

case6:

if(i==0){MoveToEnd();printf(现在无法悔棋);GotoChess(GuangbiaoData[0],GuangbiaoData[1]);}

elseHuiQi(i--);

break;

case5:

if(CannotLuozi())gotoloop;

if(luozi(i%2+1))return0;

ChessStepData[i][0]=GuangbiaoData[0];

ChessStepData[i][1]=GuangbiaoData[1];

i++;

break;

default:printf(DataGetAndChoose函数出错);break;

}

}

return1;

}

voidShowHelp()

{

system(cls);

printf(********************************************************************************);

printf(********************************************************************************);

printf(******单人游戏供用户一个人自己与自己下棋研究棋局之用******);

printf(******双人游戏中,用户1使用wsad控制方向,按空格落子******);

printf(******用户2按方向键控制方向,回车键落子******);

printf(******游戏过程中按esc返回主菜单******);

printf(******游戏过程中退格键悔棋******);

printf(******双人模式中某人下棋时,另一个用户无法控制光标与落子******);

printf(************);

printf(******帮助******);

printf(******按任意键返回******);

printf(********************************************************************************);

printf(********************************************************************************);

getch();

}

intmain()

{

intchoice=0;

system(color2b);

choose:UserChoose(&choice);

if(choice4)gotochoose;

if(choice==3){gotoxy(1,18);

printf(\n谢谢您的使用,再见);getch();return0;}

if(choice==4){ShowHelp();gotochoose;}

NewShow();

DataGetAndChoose(choice);

main();

return0;

展开全文

相关攻略