如何写一段人机五子棋,机器不用特别聪明就行,机器下的时候要显示落子坐标
人人我已写好,求.......
#include
#include
#include
#include
#define SIZE 15
#define DEEP 5
#define WIDTH 8
const char chess[3][4] = {{0xEF,0xBF,0xAD}, {0xEF,0xBF,0xAE}, ""};
const int dire[4][2]={{0,1},{1,0},{1,1},{-1,1}};
const int dire1[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{1,1},{1,-1},{-1,1}};
char board[SIZE+1][SIZE*6+10];
int databoard[SIZE+2][SIZE+2];
int record[SIZE*SIZE+2][2];
int orderofplayer;
int orderofcom;
int isdight(char);//判断是否是数字
int issupper(char);//判断是否是大写
void renren();
void CreatBoard();
void PrintBoard();
int IfValidReadin(char[]);
int Readin();
int Ifwin(int);
int IfInBoard(int,int);//判断是否在棋盘内
int main()
{
renren();
printf("Over\n");
return 0;
}
int isdight(char c)
{
if (c>='0'&&c<='9') return c-'0';
else return -1;
}//判断是否是数字
int issupper(char c)
{
if (c>='A'&&c<='Z') return c-'A'+1;
else return 0;
}//判断是否是大写字母
void CreatBoard()
{
const char leftup[7] = {0xE2,0x94,0x8C,0xE2,0x94,0x80};
const char up[7] = {0xE2,0x94,0xAC,0xE2,0x94,0x80};
const char rightup[7] = {0xE2,0x94,0x90,0x20,0x20,0x20};
const char left[7] = {0xE2,0x94,0x9C,0xE2,0x94,0x80};
const char right[7] = {0xE2,0x94,0xA4,0x20,0x20,0x20};
const char leftdown[7] = {0xE2,0x94,0x94,0xE2,0x94,0x80};
const char down[7] = {0xE2,0x94,0xB4,0xE2,0x94,0x80};
const char rightdown[7] = {0xE2,0x94,0x98,0x20,0x20,0x20};
const char middle[7] = {0xE2,0x94,0xBC,0xE2,0x94,0x80};
int i, j, p;
memset(board, 0, sizeof board);
for (p = 0; p < 6; p++)
board[1][p + 1] = leftup[p];
for (j = 2; j <= SIZE - 1; j++)
for (p = 0; p < 6; p++)
board[1][6 * j - 5 + p] = up[p];
for (p = 0; p < 6; p++)
board[1][6 * SIZE - 5 + p] = rightup[p];
for (i = 2; i <= SIZE - 1; i++)
{
for (p = 0; p < 6; p++)
board[i][p + 1] = left[p];
for (j = 2; j <= SIZE - 1; j++)
for (p = 0; p < 6; p++)
board[i][6 * j - 5 + p] = middle[p];
for (p = 0; p < 6; p++)
board[i][6 * SIZE - 5 + p] = right[p];
}
for (p = 0; p < 6; p++)
board[SIZE][p + 1] = leftdown[p];
for (j = 2; j <= SIZE - 1; j++)
for (p = 0; p < 6; p++)
board[SIZE][6 * j - 5 + p] = down[p];
for (p = 0; p < 6; p++)
board[SIZE][6 * SIZE - 5 + p] = rightdown[p];
return;
}
void PrintBoard()
{
int i,j;
CreatBoard();
for (i=1; i<=SIZE; i++)
for (j=1; j<=SIZE; j++)
{
if (databoard[i][j]==1)
{
board[i][6 * j - 5] = chess[0][0];
board[i][6 * j - 4] = chess[0][1];
board[i][6 * j - 3] = chess[0][2];
}
if (databoard[i][j]==2)
{
board[i][6 * j - 5] = chess[1][0];
board[i][6 * j - 4] = chess[1][1];
board[i][6 * j - 3] = chess[1][2];
}
}
for (i=1; i<=SIZE; i++)
{
printf("%2d ",SIZE-i+1);
for (j=1; j<=6*SIZE; j++)
printf("%c",board[i][j]);
printf("\n");
}
printf(" ");
for (i=1; i<=SIZE; i++)
printf("%c ",'A'+i-1);
printf("\n");
return;
}
int IfValidReadin(char readin[])
{
int x=0,y=0,i=0,len;
len=strlen(readin);
if (readin[0]=='Z'&&readin[1]=='T') return -5;
if (readin[0]=='H'&&readin[1]=='Q') return -1;
if (isdight(readin[0])<0) return -4;
while (isdight(readin[i])>=0)
{
x=x*10+isdight(readin[i]);
i++;
}
if (x>SIZE) return -2;
else x=SIZE-x+1;
if (!issupper(readin[i])) return -4;
else y=issupper(readin[i]);
if (len!=i+1) return -4;
if (y>SIZE) return -2;
if (databoard[x][y]!=0) return -3;
else return x*(SIZE+1)+y;
}
int Readin()
{
int t;
char readin[100];
scanf("%s",readin);
while ((t=IfValidReadin(readin))<=0)
{
switch (t)
{
case -1:return -1; break;
case -2:printf("Wrong,"); break;
case -3:printf("Wrong,"); break;
case -4:printf("Wrong,"); break;
default:break;
}
printf("Re-enter:\n");
scanf("%s",readin);
}
return t;
}
int IfInBoard(int x,int y)
{
if (xSIZE||ySIZE) return 0;
else return 1;
}
int Ifwin(int player)
{
int i,j,len,mode,x,y;
for (i=1; i<=SIZE; i++)
for (j=1; j<=SIZE; j++)
for (mode=0; mode<=3; mode++)
{
x=i; y=j;
if (databoard[x][y]!=player) continue;
len=1;
while (IfInBoard(x+dire[mode][0],y+dire[mode][1])
&& databoard[x+dire[mode][0]][y+dire[mode][1]]==player)
{
len++;
if (len==5) return 1;
x+=dire[mode][0];
y+=dire[mode][1];
}
}
return 0;
}
void renren()
{
int step=1;
int nowx,nowy,t;
printf("Palyer1 %s Player 2%s\n Enter(HQ):\n",chess[1],chess[2]);
while (!Ifwin(step%2+1) && step<=SIZE*SIZE)
{
PrintBoard();
if (step>1) printf("Last:%d%c\n",SIZE-record[step-1][0]+1,record[step-1][1]+'A'-1);
printf("%d Enter:",(step+1)%2+1);
t=Readin();
if (t==-1)
{
return;
}
nowx=t/(SIZE+1);
record[step][0]=nowx;
nowy=t%(SIZE+1);
record[step][1]=nowy;
switch ((step+1)%2+1)
{
case 1:databoard[nowx][nowy]=1; break;
case 2:databoard[nowx][nowy]=2; break;
default:break;
}
step++;
}
if (step>SIZE*SIZE) printf("Full:\n");
else printf("%d Win\n",step%2+1);
PrintBoard();
printf("Step %d\n",step-1);
return;
}
void renji()
{