【C语言】小游戏--三子棋(下)

简介: 【C语言】小游戏--三子棋(下)

3.玩家下棋


三点基本要求

  1. 接收玩家所输入的地址位置(我们所判断的数组元素应该是玩家输入值-1
  2. 判断玩家所输入的地址所在是否已有落子
  3. 将玩家的棋子落入对应位置
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);

这样写会把棋盘写死

还有就是不方便扩展棋盘,假设变成5x5的棋盘修改量巨大


测试和头文件部分:

player_move(board, ROW, COL);
void player_move(char board[ROW][COL], int row,int col);


代码实现:

void player_move(char board[ROW][COL], int row, int col)
{
  printf("玩家下棋\n");
  while (1) {
    printf("请输入要下棋的坐标:>");
    int x = 0, y = 0;
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (board[x - 1][y - 1] == ' ')
      {
        board[x - 1][y - 1] = '*';
        break;
      }
      else {
        printf("该坐标已被占用,请重新输入\n");
      }
    }
    else {
      printf("坐标越界\n");
    }
  }
}


运行结果:

e4d5b5f500b041d998f593792e49c36a.png


4.电脑下棋


随机生存坐标,只要坐标没被占用,就下棋

srand()函数只用调用一次即可

5d83a59ebc494f7bb990ed83abc63494.png

int x = rand() % row;

 int y = rand() % col;

rand()函数生成的自然数是0-32767之间的数,若rand()%10那么就是0-9之间的数


也需要判断电脑所下的地址是否被占用,以及将棋子落下,这点和玩家所需的要求一致

测试和头文件部分:

computer_move(board,ROW,COL);
void computer_move(char board[ROW][COL], int row, int col);


代码实现:

void computer_move(char board[ROW][COL], int row, int col)
{
  printf("电脑下棋:\n");
  while (1)//反复下
  {
    int x = rand() % row;//0-2范围
    int y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}


运行结果:

a6d0b3399b5f49d6bb588593de8c91ce.png

5.判断棋盘满的条件


使用is_full()函数来实现这一功能。

在这一函数中,需要实现以下几个逻辑:

判断游戏结束的四种状态:

玩家赢     --  返回'*'

电脑赢     --  返回'#'

平局         --  返回'Q'

游戏继续  --  返回'C'


前面的ret是用于返回的一个值,若ret != 'C' ,则游戏继续 ,用char ret = 0定义,

static int is_full(char board[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')
        return 0;
    }
  }
  return 1;
}


判断平局条件

da81889320994a7589c54e08a7455a16.png

is_full这个函数只是为了支持is_win函数的,只是在is_win函数内部使用,没必要在头文件中声明

运行结果:

680316f98be74e3b87871dd28422fce7.png

游戏继续

2b8374466f214e518442e997adfede17.png


6.判断胜利条件


实现判断胜利的函数是is_win(), 前面玩家和电脑赢的为啥会返回一个'*'和'#', 以下举例解释:

3910a131d2264fa3aad8ee5d57dff9f9.png

其实就是3种情况,就是判断行、列和对角线

测试和头文件部分:

char board[ROW][COL];
char ret = 0;
ret = is_win(board, ROW, COL);


代码实现:

char is_win(char board[ROW][COL], int row, int col)
{
  int  i = 0;
  //判断三行 
  for (i = 0; i < row; i++)
  {
    if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0]!=' ')
    {
      return board[i][0];
    }
  }
  //判断三列
  for (i = 0; i < col; i++)
  {
    if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
      return board[0][i];
  }
  //对角线
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
  {
    return board[0][0];
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
  {
    return board[2][0];
  }
  //平局 
  if (is_full(board, row, col) == 1)
  {
    return 'Q';
  }
  //继续
  //没有玩家或者电脑赢,也没有平局,游戏继续
  return 'C';
}


玩家胜利条件:

830a2dc9b8f74d07924681d1660930a0.png

电脑胜利条件:

a954d03551834fc1a1f1f103895d139b.png

相关文章
|
8月前
|
定位技术 C语言
c语言及数据结构实现简单贪吃蛇小游戏
c语言及数据结构实现简单贪吃蛇小游戏
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
C语言实现2048小游戏---粤嵌GE6818嵌入式系统实训
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
220 1
C语言——实现贪吃蛇小游戏
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
164 1
C 语言——实现扫雷小游戏
|
12月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
182 1
|
12月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
12月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
12月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
12月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
12月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
122 0