【C语言】二维数组实现简易井字棋

简介: 【C语言】二维数组实现简易井字棋

棋盘如下:


0.png

代码思想:

井字棋的棋盘实则就是一个九宫格,我们可以用一个三行三列的二维数组来实现。玩家执 ” x “落子,电脑执 ” o “落子,玩家输入对应格的行列号来落子,电脑通过生成行列号的随机数来落子,每下一次,棋盘更新一次,率先到达三子连线方获胜,棋盘下满则为平局。


函数构建

把棋盘各格初始位置设置成 ’  ‘ (空格)


//给棋盘各个位置赋‘ ’
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] = ' ';
    }
  }
}

打印棋盘,用横线和竖线构建一个简易的棋盘,玩家和电脑每次落子之后,先清屏再打印落子后的棋盘

//打印棋盘
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");
}

玩家落子,玩家输入对应格的行列号进行落子,并且判断玩家的输入是否合法,若不合法提醒玩家重新落子,玩家成功落子之后,对应格写入 ’ x ‘ 。

//玩家落子
void player(char board[MAX_ROW][MAX_COL]) {
  printf("玩家落子!!\n");
  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;//玩家落子,此处赋为‘x’,循环结束
  }
}

电脑落子,电脑落子通过随机数生成随机格的行列号进行落子,同样,电脑落子之前也要判断随机格的行列号是否合法,若不合法,重新生成随机数,电脑落子成功之后,对应格写入 ’ o ‘ 。

需要注意的是,随机数的生成需要在函数之前生成随机数种,我在后面主函数会写上

//电脑落子
void computer(char board[MAX_ROW][MAX_COL]) {
  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]) {
  //找不到空格了,说明满了
  //满了返回1,没满返回0
  for (int row = 0; row < MAX_ROW; row++) {
    for (int col = 0; col < MAX_COL; col++) {
      if (board[row][col] == ' ') {
        //没满
        return 0;
      }
    }
  }
  return 1;
}

判断棋局是否结束,有任何一行或列或对角线上的元素相同或者棋盘已满,则棋局结束

//玩家获胜返回'x',电脑获胜返回'o',胜负未分返回‘ ’,棋盘满了返回q
char cheak(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][2] == board[row][0]) {
      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[0][0] == board[1][1] &&
    board[2][2] == board[0][0]) {
    return board[0][0];
  }
  if (board[0][2] != ' ' &&
    board[0][2] == board[1][1] &&
    board[2][0] == board[0][2]) {
    return board[0][2];
  }
  //检测棋盘满没满
  if (Isfull(board)) {
    return 'q';
  }
  else {
    return ' ';
  }
}

主函数将各个函数串联起来,最后再判断棋局结果

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
int main() {
  //创建棋盘,初始化为全0
  char board[MAX_ROW][MAX_COL] = { 0 };
  //使用Init函数将棋盘初始位置改为' '
  Init(board);
  //生成随机种子,程序开始前设置即可
  srand((unsigned int)time(0));
  char winner = ' ';
  while (1) {
    //打印棋盘
    printboard(board);
    //玩家落子
    player(board);
    //电脑落子
    computer(board);
    //判断胜负
    winner = cheak(board);
    if (winner != ' ') {
      //胜负已分,循环结束
      break;
    }
  }
  if (winner == 'x') {
    printf("恭喜你赢了!!\n");
  }
  else if(winner=='o') {
    printf("你真菜!!\n");
  }
  else {
    printf("你和人工智障五五开\n");
  }
  system("pause");
  return 0;
}

代码运行结果

1.png


目录
相关文章
|
6月前
|
C语言
C语言期末习题之求二维数组中的最大值
C语言期末习题之求二维数组中的最大值
60 0
|
6月前
|
C语言
【C语言】利用数组处理批量数据(一维数组和二维数组)
【C语言】利用数组处理批量数据(一维数组和二维数组)
|
6月前
|
存储 数据处理 C语言
C语言二维数组
C语言二维数组
57 0
|
6月前
|
C语言
C语言---二维数组&&指针
C语言---二维数组&&指针
28 0
|
6月前
|
C语言
C语言-----用二维数组解决菱形的打印问题
C语言-----用二维数组解决菱形的打印问题
59 0
|
6月前
|
存储 C语言
遍历二维数组C语言,小白必看的绝绝子技巧!
遍历二维数组C语言,小白必看的绝绝子技巧!
C4.
|
6月前
|
存储 C语言
C语言怎样定义和引用二维数组
C语言怎样定义和引用二维数组
C4.
71 0
|
1月前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
6月前
|
C语言
C语言期末习题之二维数组转置
C语言期末习题之二维数组转置
48 0
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。