首页后端开发其他后端知识C语言三子棋怎么做,步骤和方法是什么?

C语言三子棋怎么做,步骤和方法是什么?

时间2024-03-28 17:34:04发布访客分类其他后端知识浏览1650
导读:C语言三子棋怎么做,步骤和方法是什么?用C语言实现三子棋并不难,下文给大家介绍了详细的实现步骤及代码,大家可以参考了解看看,对新手学习C语言有一定的学习价值,接下来跟随小编学习一下吧。 一、写代码前明确下棋时的步骤与顺序 1.创建一个3...

C语言三子棋怎么做,步骤和方法是什么?用C语言实现三子棋并不难,下文给大家介绍了详细的实现步骤及代码,大家可以参考了解看看,对新手学习C语言有一定的学习价值,接下来跟随小编学习一下吧。

一、写代码前明确下棋时的步骤与顺序

  • 1.创建一个3*3的棋盘.
  • 2.将上面创建的棋盘中每个格初始化成' '状态.
  • 3.打印出初始化完成的棋盘
  • 4.玩家落子
  • 5.电脑落子
  • 6.判断胜负

写代码之前梳理好大概的思路,先写出初步的主函数

int main() {
    
 char winner = ' ';

 //1.创建一个棋盘,并初始化.
 char board[MAX_ROW][MAX_COL] = {
 0 }
    ;
    
 //2.init函数将棋盘每个格子初始化成' '.
 init(board);

 while (1) {
    
  //3.打印棋盘
  printBoard(board);
    
  //4.玩家落子
  playerMove(board);
    
  //5.判断胜负
  winner = checkWinner(board);

  if (winner != ' ') {
    
   //胜负已分
   break;

  }
    
  //6.电脑落子
  computerMove(board);
    
  //7.判断胜负
  winner = checkWinner(board);

  if (winner != ' ') {
    
   //胜负已分
   break;

  }

 }



在创建棋盘是char board[][]的[]中不要写3,写3在后面看代码时不能明确分清3代表什么

因此建议定义宏

#define MAX_ROW  3
#define MAX_COL  3


这样可以清楚的看出[]中的内容代表什么,提高可读性.

二 根据初步的主函数完成想要的代码

1.写一个函数来初始化棋盘

//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
    
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  for(int col = 0;
     col  MAX_COL;
 col++) {
    
   board[row][col] = ' ';

  }

 }
    
 //设计随机种子
 srand((unsigned int) time(0));

}

 

2.打印棋盘

void printBoard(char board[MAX_ROW][MAX_COL]) {
    
 system("cls");
    
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  printf("+---+---+---+\n");
    
  for (int col = 0;
     col  MAX_COL;
 col++) {
    
   printf("| %c ", board[row][col]);

  }
    
  printf("|");
    
  printf("\n");

 }
    
 printf("+---+---+---+\n");

}



system("cls")是让每次打印棋盘前清除之前的棋盘这样能让界面清晰一些

(使用的是简单的C来完成程序所以打印的棋盘也比较简陋)

3.玩家落子

void playerMove(char board[MAX_ROW][MAX_COL]) {
    
 printf("请玩家落子!");

 while (1) {
    
  printf("请输入落子的位置(row col):");
    
  int row = 0;
    
  int col = 0;
    
  scanf("%d %d", &
    row, &
    col);
    
  //输入后验证输入内容是否合法.
  if (row  0 || row >
    = MAX_ROW || col  0 || col >
= MAX_COL) {
    
   printf("输入有误.请重新输入!\n");
    
   continue;

  }

  if (board[row][col] != ' ') {
    
   printf("当前位置已有棋子,请重新输入!\n");
    
   continue;

  }
    
  board[row][col] = 'x';
    
  break;

 }

}



以输入坐标的方式来实现落子,并且要检测玩家落子是否合理,以免输入无效的坐标.

4.电脑落子

void computerMove(char board[MAX_ROW][MAX_COL]) {
    
 printf("轮到电脑落子");

 while (1) {
    
  int row = rand() % MAX_ROW;
    
  int col = rand() % MAX_COL;

  if (board[row][col] != ' ') {
    
   continue;

  }
    
  board[row][col] = 'o';
    
  break;

 }

}



电脑落子采用随机数的方式来进行落子,因此需要设置随机种子,将它写在初始化棋盘函数内,每次初始化一次进行一次随机种子的设置

由于是随机落子因此实现的不是人工智能而是人工智障.

5.判断胜负

int checkWinner(char board[MAX_ROW][MAX_COL]) {
    
 //检查所有行
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  if (board[row][0] != ' ' &
    &
     board[row][0] == board[row][1] &
    &
 board[row][0] == board[row][2]) {
    
   return board[row][0];

  }

 }
    
 //检查所有列
 for (int col = 0;
     col  MAX_COL;
 col++) {
    
  if (board[0][col] != ' ' &
    &
     board[0][col] == board[1][col] &
    &
 board[0][col] == board[2][col]) {
    
   return board[0][col];

  }

 }
    
 //检查对角线
 if (board[0][0] == board[1][1] &
    &
     board[0][0] == board[2][2] &
    &
 board[0][0] != ' ') {
    
  return board[0][0];

 }
    
 if (board[0][2] == board[1][1] &
    &
     board[0][2] == board[2][0] &
    &
 board[0][2] != ' ') {
    
  return board[0][2];

 }

 if (isFull(board)) {
    
  return 'q';

 }
    
 return ' ';

}


检查每行 每列 对角线是否有三个相同的棋子从而判断胜负.

int isFull(char board[MAX_ROW][MAX_COL]) {
    
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  for (int col = 0;
     col  MAX_COL;
 col++) {

   if (board[row][col] == ' ') {
    
    //棋盘没满
    return 0;

   }

  }

 }
    
 return 1;

}
    
 


检查棋盘有没有下满(可能出现和棋)

这就实现一个简单的三子棋游戏

在主函数中玩家落子后应也判断一次胜负,以免出现玩家胜利电脑再落子的情况.

三、三子棋实现代码

#define _CRT_SECURE_NO_WARNINGS
#includestdio.h>
    
#includetime.h>

 
#define MAX_ROW  3
#define MAX_COL  3
 
//将棋盘初始化成' '
void init(char board[MAX_ROW][MAX_COL]) {
    
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  for(int col = 0;
     col  MAX_COL;
 col++) {
    
   board[row][col] = ' ';

  }

 }
    
 //设计随机种子
 srand((unsigned int) time(0));

}

void printBoard(char board[MAX_ROW][MAX_COL]) {
    
 system("cls");
    
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  printf("+---+---+---+\n");
    
  for (int col = 0;
     col  MAX_COL;
 col++) {
    
   printf("| %c ", board[row][col]);

  }
    
  printf("|");
    
  printf("\n");

 }
    
 printf("+---+---+---+\n");

}

void playerMove(char board[MAX_ROW][MAX_COL]) {
    
 printf("请玩家落子!");

 while (1) {
    
  printf("请输入落子的位置(row col):");
    
  int row = 0;
    
  int col = 0;
    
  scanf("%d %d", &
    row, &
    col);
    
  //输入后验证输入内容是否合法.
  if (row  0 || row >
    = MAX_ROW || col  0 || col >
= MAX_COL) {
    
   printf("输入有误.请重新输入!\n");
    
   continue;

  }

  if (board[row][col] != ' ') {
    
   printf("当前位置已有棋子,请重新输入!\n");
    
   continue;

  }
    
  board[row][col] = 'x';
    
  break;

 }

}

void computerMove(char board[MAX_ROW][MAX_COL]) {
    
 printf("轮到电脑落子");

 while (1) {
    
  int row = rand() % MAX_ROW;
    
  int col = rand() % MAX_COL;

  if (board[row][col] != ' ') {
    
   continue;

  }
    
  board[row][col] = 'o';
    
  break;

 }

}

int isFull(char board[MAX_ROW][MAX_COL]) {
    
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  for (int col = 0;
     col  MAX_COL;
 col++) {

   if (board[row][col] == ' ') {
    
    //棋盘没满
    return 0;

   }

  }

 }
    
 return 1;

}

int checkWinner(char board[MAX_ROW][MAX_COL]) {
    
 //检查所有行
 for (int row = 0;
     row  MAX_ROW;
 row++) {
    
  if (board[row][0] != ' ' &
    &
     board[row][0] == board[row][1] &
    &
 board[row][0] == board[row][2]) {
    
   return board[row][0];

  }

 }
    
 //检查所有列
 for (int col = 0;
     col  MAX_COL;
 col++) {
    
  if (board[0][col] != ' ' &
    &
     board[0][col] == board[1][col] &
    &
 board[0][col] == board[2][col]) {
    
   return board[0][col];

  }

 }
    
 //检查对角线
 if (board[0][0] == board[1][1] &
    &
     board[0][0] == board[2][2] &
    &
 board[0][0] != ' ') {
    
  return board[0][0];

 }
    
 if (board[0][2] == board[1][1] &
    &
     board[0][2] == board[2][0] &
    &
 board[0][2] != ' ') {
    
  return board[0][2];

 }

 if (isFull(board)) {
    
  return 'q';

 }
    
 return ' ';

}

int main() {
    
 char winner = ' ';

 //1.创建一个棋盘,并初始化.
 char board[MAX_ROW][MAX_COL] = {
 0 }
    ;
    
 //2.init函数将棋盘每个格子初始化成' '.
 init(board);

 while (1) {
    
  //3.打印棋盘
  printBoard(board);
    
  //4.玩家落子
  playerMove(board);
    
  //5.判断胜负
  winner = checkWinner(board);

  if (winner != ' ') {
    
   //胜负已分
   break;

  }
    
  //6.电脑落子
  computerMove(board);
    
  //7.判断胜负
  winner = checkWinner(board);

  if (winner != ' ') {
    
   //胜负已分
   break;

  }

 }

 if (winner == 'x') {
    
  printf("恭喜你,你赢了!\n");

 }
else if(winner=='o') {
    
  printf("你真菜连人工智障都玩不过\n");

 }
else {
    
  printf("你和人工智障五五开\n");

 }
    
 return 0;

}
    

运行界面如下:

以上就是关于C语言三子棋怎么做的介绍,本文只是提供了一种实现思路,代码仅供参考,需要的朋友可以了解看看,希望对大家学习C语言有帮助,想要了解更多可以继续浏览网络其他相关的文章。

文本转载自PHP中文网

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: C语言三子棋怎么做,步骤和方法是什么?
本文地址: https://pptw.com/jishu/655092.html
HTML页面显示图片有哪些方式 HTML页面中超链接文本颜色怎样修改

游客 回复需填写必要信息