。
//但是这些代码由于编译器的原因,在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;