qq_41327011 2018-01-13 01:32 采纳率: 0%
浏览 3262
已结题

c语言五子棋人机对战代码如何写

如何写一段人机五子棋,机器不用特别聪明就行,机器下的时候要显示落子坐标
人人我已写好,求.......
#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()
{

  • 写回答

6条回答 默认 最新

  • devmiao 2018-01-13 02:40
    关注
     //date 2014年7月7日09:53:24
    //willows  
    //五子棋
    
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    
    //棋盘初始化函数
    //Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL
    void init_Chessboard(char Chessboard[][7], int ln)
    {
      if ((Chessboard != NULL) && (ln>0)){
        int i = 0, j = 0;
        for (i = 0; i<ln; ++i){
          for (j = 0; j<ln; ++j){
            Chessboard[i][j] = '\t';
          }
        }
      // return Chessboard;
      }
    // return NULL;
    }
    
    
    //显示棋盘函数
    void show_Chessboard(char Chessboard[][7], int ln)
    {
      assert((Chessboard != NULL) && (ln > 0));
    
      int i = 0, j = 0;
      for (i = 0; i<ln; ++i){
        putchar('\t');
        putchar(i + '0');
      }//end for1
      putchar('\n');
      putchar('\n');
    
      for (i = 0; i<ln; ++i){
        putchar(i + '0');
        for (j = 0; j<ln; ++j){
          if ('\t' == Chessboard[i][j]){
            putchar(Chessboard[i][j]);
          }
          else
          {
            putchar('\t');
            putchar(Chessboard[i][j]);
          }
    
        }
        putchar('\n');
        putchar('\n');
      }//end for2
    }
    
    //棋子下子函数
    //下子成功返回1,不成功返回0
    int play(char Chessboard[][7], int ln, int x, int y, char ChessPieces)
    {
      assert(Chessboard); //ChessPieces=NULL跳出
      if ((x<ln) && (y<ln) && (x >= 0) && (y >= 0)){
        if ('\t' == Chessboard[x][y]){
    
          Chessboard[x][y] = ChessPieces;
          return 1;  //成功
        }
        else
        {
          return 0;
        }//end if2
      }//end if1
      return 0;
    }
    
    //满盘判断
    //棋盘满了判断//满了就返回-1
    int full_Chess(char Chessboard[][7], int ln)
    {
      int i = 0, j = 0;
      for (i = 0; i<ln; ++i){
        for (j = 0; j<ln; ++j){
          if ('\t' == Chessboard[i][j]){
            return 0;  //棋盘未满
          }//end if
        }//end for j
      }//end for i
    
      return 1;//棋盘满了
    
    }
    
    
    //是否连成五子线判断函数
    //Chessboard=棋盘数组,ln=棋盘宽度,(XS,YS)方向判断起点坐标,(dx,dy)方向增量标记
    //连成线返回1,没有返回0
    int judga_line(char Chessboard[][7], int ln, int XS, int YS, int dx, int dy)
    {
      assert((Chessboard != NULL) && (ln > 0));
      if((XS <ln) && (YS<ln)  //起点坐标在棋盘内
        && (XS >=0) && (YS >=0)
        && (dx != 0 || dy != 0))        //坐标增量不为同时0
      {
    
        if (((XS + dx * 4) > ln) || ((XS + dx * 4)<0) || //判断终点坐标
          ((YS + dy * 4)>ln) || ((YS + dy * 4) < 0) || //在棋盘外
          ('\t' == Chessboard[XS][YS]))
        {
            return 0;  //不在棋盘内,或者起点是没下子
        }
        else
        {
          int i = 0;
          for (i = 1; i < 5; ++i){
            if (Chessboard[XS][YS] != Chessboard[XS + (dx * i)][YS + (dy * i)])
            {
              return 0;  //如果不是连续5个一样的
            }//end if3
          }//end for1
          return 1;  //五个都一样,且都在棋盘内
        }//end if 2
      }
      return 0;  //其他情况
    }
    
    //裁判函数
    //Chessboard 棋盘数组,ln=棋盘宽度
    //赢了返回1,否则返回0
    int judga(char Chessboard[][7], int ln)
    {
      assert((NULL != Chessboard) && (ln>0));
      int i = 0, j = 0;
      //纵向成五子连线判断
      for (i = 0; i<(ln - 4); ++i){
        for (j = 0; j<ln; ++j){
          if (judga_line(Chessboard, ln, i, j, 1, 0)){
            return 1;
          }
        }//end for_j
      }//end for_i
    
        //横向成五子连线判断
      for (i = 0; i<ln; ++i){
        for (j = 0; j<(ln - 4); ++j){
          if (judga_line(Chessboard, ln, i, j, 0, 1)){
            return 1;
          }
        }//end for_j
      }//end for_i
    
        //左上到右下成五子连线判断
      for (i = 0; i<(ln - 4); ++i){
        for (j = 0; j<(ln - 4); ++j){
          if (judga_line(Chessboard, ln, i, j, 1, 1)){
            return 1;
          }
        }//end for_j
      }//end for_i
    
        //左下到右上成五子连线判断
      for (i = ln-1; i>(ln-4); --i){
        for (j = 0; j <(ln - 4); ++j){
          if (judga_line(Chessboard, ln, i, j, -1, 1)){
            return 1;
          }
        }//end for_j
      }//end for_i
    
      return 0;  //没能赢
    }
    
    
    //主函数
    
    
    int main()
    {
      char CB[7][7];
      char nameA[50] = "玩家A";
      char nameB[50] = "玩家B";
      int x = -1, y = -1;
      //初始化
      init_Chessboard(CB, 7);
    
      printf("请输入玩家A的名字:");
      scanf("%s", nameA);
    
      printf("请输入玩家B的名字:");
      scanf("%s", nameB);
    
      //显示棋盘
      show_Chessboard(CB, 7);
    
      while (1){
        //判断是否棋盘已满
        if (full_Chess(CB, 7)){
          puts("\n棋盘已满,下次再战!");
          break; //跳出最外层while
        }//end if
    
    
        //玩家A下子
        while (1){
          printf("\n请玩家 %s 下子 @\n", nameA);
          printf("棋子行坐标X=");
          scanf("%d", &x);
          printf("棋子列坐标Y=");
          scanf("%d", &y);
    
          if (play(CB, 7, x, y, '@')){  //@ ascii=64
            break;   //下子成功
          }
          else
          {
            puts("下子失败,请重新选定位置下子");
            continue;  //下子不成功,重新下子
          }//end if
        }//end while A
    
        //显示棋盘
        show_Chessboard(CB, 7);
    
        //判断玩家A是否胜利
        if (judga(CB, 7)){
          printf("\n恭喜玩家 %s 成功取得胜利!!鲜花\n", nameA);
          getchar();
          getchar();
          break; //跳出最外层while
        }//不用下了
    
        //玩家B下子
        while (1){
          printf("\n请玩家 %s 下子 O\n", nameB);
          printf("棋子行坐标X=");
          scanf("%d", &x);
          printf("棋子列坐标Y=");
          scanf("%d", &y);
    
          if ((play(CB, 7, x, y, 'O'))){ //O ascii=79
            break;   //下子成功
          }
          else
          {
            puts("下子失败,请重新选定位置下子");
            continue;  //下子不成功,重新下子
          }//end if
    
        }//end while B
    
        //显示棋盘
        show_Chessboard(CB, 7);
    
        //判断玩家B是否胜利
        if (judga(CB, 7)){
          printf("\n恭喜玩家 %s 成功取得胜利!! 鲜花\n", nameA);
          getchar();
          getchar();
          break; //跳出最外层while
        }//不用下了
    
      }
    
      return 0;
    
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 微信小游戏反编译后,出现找不到分包的情况
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)