适合初学者练习的C语言实现三子棋小游戏

 更新时间:2021年10月19日 14:32:47   作者:小明bite  
今天这篇文章主要介绍给大家分享一个适合初学者练习的利用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
#include<stdio.h>
#include<time.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语言写三子棋小游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT5 Thread线程的具体实现

    QT5 Thread线程的具体实现

    本文主要介绍了QT5 Thread线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 一起来学习C语言的输入和输出

    一起来学习C语言的输入和输出

    这篇文章主要为大家详细介绍了C语言的输入和输出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C语言实现代码雨效果

    C语言实现代码雨效果

    这篇文章主要为大家详细介绍了C语言实现代码雨效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++深入探究类与对象之友元与运算符重载

    C++深入探究类与对象之友元与运算符重载

    友元就是让一个函数或者类,访问另一个类中的私有成员;打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私,运算符重载的实质就是函数重载或函数多态,运算符重载是一种形式的C++多态,目的在于让人能够用同名的函数来完成不同的基本操作
    2022-04-04
  • 基于C++实现高精度计时器

    基于C++实现高精度计时器

    chrono是C++ 11中的时间库,它提供了跨平台的高精度时钟解决方案,精确到纳秒级,本文主要为大家详细介绍了如何使用chrono实现高精度计时器,感兴趣的可以了解下
    2024-02-02
  • C++类的分离式写法介绍示例

    C++类的分离式写法介绍示例

    今天小编就为大家分享一篇关于C++类的分离式写法介绍示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解C++中四种类型的转换

    详解C++中四种类型的转换

    这篇文章主要是想和大家一起聊聊来C++中的四种类型转换 :const_cast、static_cast、reinterpret_cast和dynamic_cast,感兴趣的可以了解一下
    2022-12-12
  • VSCode断点调试CMake工程项目的实现步骤

    VSCode断点调试CMake工程项目的实现步骤

    这篇文章主要介绍了VSCode断点调试CMake工程项目的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++实现五子棋游戏

    C++实现五子棋游戏

    这篇文章主要为大家详细介绍了C++实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 使用C语言实现扫雷游戏

    使用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了使用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论