用C语言实现三子棋游戏

本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下

初始工作,通过#define 定义一个标识符来表示一个常量(棋盘的横纵坐标)
(因为在代码的编写中,会有多处需要用到坐标。那么,在阅读代码时就可能会导致读者疲于理解当前的值到底是代表什么,即会对代码的解读造成困扰。所以,在该代码中通过使用宏定义解决了这个问题,同时也方便后续更改棋盘的大小。)

#define MAX_ROW 3
#define MAX_COL 3

游戏创建流程

1. 创建棋盘

创建棋盘(二维数组),并将其初始化(空白,无子状态)。

//1. 棋盘初始化
void init(char chessBoard[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   //将这个棋盘(二维数组)每个位置都初始化为空
   chessBoard[row][col] = '   ';
  }
 }
}

2. 打印棋盘

打印棋盘,令玩家能够看到此时棋盘的状态。

//2. 打印棋盘
void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]) {
 printf("+---+---+---+\n");
 for(int row = 0; row < MAX_ROW; row++) {
  printf("|");
  for (int col = 0; col < MAX_COL; col++) {
   printf(" %c |", chessBoard[row][col]);
  }
  printf("\n+---+---+---+\n");
 }
}

3. 玩家落子

玩家将通过输入坐标(row, col)落子。
注意:在玩家选择坐标后需要做合法性检验,即判断玩家落子的位置是否已经有子,如果有,则玩家需要重新输入坐标落子。

//3. 玩家落子
void playMove(char chessBoard[MAX_ROW][MAX_COL]) {
 while (1) {
  int row = 0, col = 0;
  printf("请玩家通过输入坐标落子:");
  scanf("%d %d", &row, &col);
      //检验玩家是否输入错误
   if (row < 0 || col < 0 || row >= MAX_ROW || col >= MAX_COL) {
    printf("输入错误!请重新输入");
    continue;
   }
         // 检验玩家输入的位置 是否已经有子(判断位置是否为空,不为空即有子)
   else if (chessBoard[row][col] != ' ') {
    printf("该位置已经有子,请重新输入");
    continue;
   }
   else {
    //没问题,落子,标记为'x',并退出当前循环
    chessBoard[row][col] = 'x';
    break;
   }
 }
}

4. 判定此时胜负情况

4.1 判断当前胜负情况,有四种获胜的方式:

1)横着3个都是一样的字符;
2)竖着3个都是一样的字符;
3)1,3象限对角线的3个位置都是一样的字符;
4)2,4象限对角线的3个位置都是一样的字符。

//4. 判定胜负情况,检查棋盘的所有位置,是否符合胜利的4种情况
//玩家获胜,返回x; 电脑获胜,返回o; 和棋返回p;
char chessWin(char chessBoard[MAX_ROW][MAX_COL]) {
 //判断横着的3个位置
 for (int row = 0; row < MAX_ROW; row++) {
  if (chessBoard[row][0] != ' ' && chessBoard[row][0] == chessBoard[row][1] && chessBoard[row][0] == chessBoard[row][2]) {
   return chessBoard[row][0];
  }
 }
 //判断竖着的3个位置
 for (int col = 0; col < MAX_COL; col++) {
  if(chessBoard[0][col] != ' ' && chessBoard[0][col] == chessBoard[1][col] && chessBoard[0][col] == chessBoard[2][col] ){
   return chessBoard[0][col];
  }
 }
 //判断2,4象限对角线的3个位置
 if (chessBoard[0][0] != ' ' && chessBoard[0][0] == chessBoard[1][1] && chessBoard[0][0] == chessBoard[2][2]) {
  return chessBoard[0][0];
 }
 //判断1,3象限对角线的3个位置
 if (chessBoard[2][0] != ' ' && chessBoard[2][0] == chessBoard[1][1] && chessBoard[2][0] == chessBoard[0][2]) {
  return chessBoard[2][0];
 }
 if (isFull(chessBoard)) {
  return 'p';
 }
 return ' ';
}

4.2 胜负情况判断后有4种情况,分别是:

1)玩家获胜,返回 ‘x' ;
2)电脑获胜,返回 ‘o' ;
3)和棋,棋盘下满了,但是没有分出胜负,返回 ‘p' ;
4)棋盘还有位置是空着的,下棋继续,返回 ‘ ' ;

我们在主函数中定义一个字符变量,用来判断程序结束返回的是什么,继而判断是玩家获胜、电脑获胜、和棋还是游戏未结束。
根据字符型变量的值得知游戏的结果(具体过程如后主函数内容所示)。

4.3 判断是否和棋的函数为:

//4.3 判断是否和棋(棋盘满了,但未分胜负),返回1表示棋盘满了,返回0表示棋盘未满
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
 for (int row = 0; row < MAX_ROW; row++) {
  for (int col = 0; col < MAX_COL; col++) {
   if (chessBoard[row][col] == ' ') {
    return 0;
   }
  }
 }
 return 1;
}

5. 电脑落子(电脑随机落子)

通过 rand() 函数实现电脑的随机落子。
(取余运算是很好的截短方法,在这里,我们通过取余运算将横纵坐标的值控制在了[0,2]之间。)

//5. 电脑落子(随机)
void computerPlayMove(char chessBoard[MAX_ROW][MAX_COL]) {
 while (1) {
  //控制落子的坐标 x,y 在[0,2]之间
  int row = rand() % MAX_ROW;
  int col = rand() % MAX_COL;
  //判断电脑想落子的位置是否为空(即是否已经有子),如若已经有子,继续循环
  if (chessBoard[row][col] != ' ') {
   continue;
  }
  //如果电脑想落子的位置为空,则将 ‘o' 赋给该位置,并结束循环
  chessBoard[row][col] = 'o';
  break;
 }
}

6. 判定此时胜负情况

同过程4。

7. 主函数

注意,我们将 字符型二维数组棋盘 写在了主函数中,而非整个程序的开头。
原因是:如果写在开头,那么这个变量就是全局变量了。
全局变量的生命周期是整个程序,会占用更多的内存,而且如果在程序中间已经使用完毕这个变量,也是不能释放内存的。
此外,全局变量的作用域是整个工程。如果在哪里将它改动后,整体都会受到影响,在查问题出在哪里的时候会很麻烦。
所以,本着尽量不使用全局变量的原则,将这个变量写在了主函数中。当其他函数需要这个参数的时候,再进行传参使用即可。

int main() {
 char chessBoard[MAX_ROW][MAX_COL];
 char winner = ' ';
 //1. 棋盘初始化
 init(chessBoard);

 while (1) {
  //2. 打印棋盘,令玩家观察此时棋盘的状态
  printChessBoard(chessBoard);
  //3. 玩家落子
  playMove(chessBoard);
  //4. 判断胜负情况
  winner = chessWin(chessBoard);
  if (winner != ' ') {
   //已经有非空返回值,游戏结束
   break;
  }
  //5. 电脑落子
  computerPlayMove(chessBoard);
  //4. 判断胜负情况
  winner = chessWin(chessBoard);
  if (winner != ' ') {
   //已经有非空返回值,游戏结束
   break;
  }
 }
 if (winner == 'x') {
  printChessBoard(chessBoard);
  printf("恭喜玩家获胜!");
 }
 else if (winner == 'o') {
  printChessBoard(chessBoard);
  printf("惜败,电脑获胜了哦~");
 }
 else {
  printChessBoard(chessBoard);
  printf("哎呀,你和电脑打成平手了呢~");
 }

 system("pause");
 return 0;
}

以上就是我在写三子棋游戏的思路、代码以及一些需要注意的点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C语言实现三子棋

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 题目:C语言实现三子棋 问题分析:首先用到数组,存储信息.棋盘的信息和棋子的信息 打印棋盘 读取棋子的位置 判断是否连子 打印棋盘 然后重复 代码如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //数组沙盘 char Global_Gobang[10][10]; int Global_line, Global_p

  • C语言实现三子棋的步骤和代码详解

    一.问题描述 用c语言实现三子棋. 二.基本流程 在写三子棋的代码之前,我们来看看实现这个游戏的逻辑: 1.菜单界面选择开始或者退出游戏. 2.创建棋盘并初始化. 3.打印棋盘. 4.玩家落子(玩家输入行列坐标的方式来落子),'x'表示玩家落子. 5.判定胜负关系(输,赢,和棋),'q'表示和棋. 6.电脑落子(随机位置落子) ,'o'表示电脑落子. 7.判定胜负关系. 8.回到 步骤2 继续执行. 三.步骤 1.菜单界面 1.开始游戏 0.退出游戏 int menu(){ printf("--

  • C语言实现简单的三子棋

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 一.主要思想 1.创建一个3*3的棋盘(使用字符数组) 2.初始化棋盘(用空格填充) 3.打印棋盘(使其有可见的边框) 4.玩家落子,用x表示(检验是否越界,是否已经落子,是否赢) 5.电脑落子,用o表示(检验是否已经落子,是否赢)  注:电脑在有效范围内随机落子,使用当前时间戳设置随机种子即srand(time(0)) 6.三种情况:玩家赢,电脑赢,和棋 二.代码实现 #define _CRT_SECURE_NO

  • C语言实现简单三子棋程序

    使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数组初始化. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 3 //行 #define COL 3 //列 char arr[ROW][COL] = { 0 }; Arr_init(arr,

  • C语言实现三子棋小游戏详解

    在用c语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利. 以下为源代码: 1.首先打印出菜单. void menu() { printf("**********************************\n"); printf("**********************************\n"); printf("***** 0.play *********

  • C语言三子棋小游戏的实现代码

    本文实例为大家分享了C语言三子棋小游戏的具体代码,供大家参考,具体内容如下 一.介绍: 运用C语言的数组等相关知识:实现一个简易的三子棋小游戏: 三子棋小游戏的大概内容为 此游戏在设计时:总共设计了三个文件: game.h: 类型的声明和函数的声明 game.c:函数功能的具体实现 test.c: 测试文件 二.具体实现: (1).game.h模块: 代码实现如下: #define _CRT_SECURE_NO_WARNINGS 1 //头文件包含 #include <stdio.h> #in

  • C语言实现三子棋小游戏

    在这里我们要写出一个三子棋的小游戏,能够实现所需要的三字连珠的功能,并且可以使得游戏让玩家进行选择是否继续的功能. 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void init_board(char arr[ROW][COL]) { int i=0; int j=0; for

  • C语言实现简单三子棋游戏

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 游戏介绍:使用C语言中二维数组和函数的基本知识实现一个三子棋游戏,这个游戏要实现的基本功能有初始化棋盘.棋盘的打印.玩家下棋.电脑下棋.判断输赢. 代码框架: 1.头文件(game.h) #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<st

  • C语言实现三子棋程序

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 先直接上代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //2.实现三子棋游戏. #include<Windows.h> //Sleep() RAND_MAX 的头文件 void menu() //打印菜单 { printf("****************************\n"); printf("***

随机推荐