抽丝剥茧C语言(中阶)三子棋(下)

简介: 抽丝剥茧C语言(中阶)三子棋

6. 完整代码

这里我们的代码已经写完了,这是完整版的参考代码:

函数声明和头文件包括自定义常量标识符:

//game.h
#define ROW 3
#define COL 3
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void chessboard(char arr[ROW][COL], int row, int col);//初始化棋盘
void print_chessboard(char arr[ROW][COL], int row, int col);//打印棋盘
void player(char arr[ROW][COL], int row, int col);//玩家走
void computer(char arr[ROW][COL], int row, int col);//电脑走
char verdict(char arr[ROW][COL], int row, int col);//判断输赢

main主体加游戏菜单:

//test.c文件
#include "game.h"
void menu()
{
  printf("************************\n");
  printf("******1.三子棋游戏******\n");
  printf("******0.游戏结束  ******\n");
  printf("************************\n");
}
void game()
{
  char arr[ROW][COL];//棋盘
  char c;
  chessboard(arr,ROW, COL);//初始化棋盘
  print_chessboard(arr, ROW, COL);//打印棋盘
  while (1) 
  {
    player(arr, ROW, COL);//玩家走
    print_chessboard(arr, ROW, COL);//打印棋盘
    c = verdict(arr, ROW, COL);//判断玩家输赢
    if (c == '*')
    {
      printf("玩家赢了\n");
      break;
    }
    if (c == 'C')
    {
      printf("平局\n");
      break;
    }
    computer(arr, ROW, COL);//电脑走
    print_chessboard(arr, ROW, COL);//打印棋盘
    c = verdict(arr, ROW, COL);//判断电脑输赢
    if (c == '#')
    {
      printf("电脑赢了\n");
      break;
    }
    if (c == 'C')
    {
      printf("平局\n");
      break;
    }
  }
}
int main()
{
  int option = 0;
  srand((unsigned int)time(NULL));//随机数的起点
  do
  {
    menu();
    scanf("%d", &option);
    if (option == 1)
    {
      printf("游戏开始\n");
      game();
    }
    else if (option == 0)
    {
      printf("游戏结束\n");
      break;
    }
    else
    {
      printf("选择错误,请重新选择\n");
    }
  } while (1);
  return 0;
}

游戏实现的主要部分:

//game.c文件
#include "game.h"
int dogfall(char arr[ROW][COL], int row, int col)//判断是否平局的函数
{
  int i, j;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (arr[i][j] == ' ')//判断棋盘是否还有空位
        return 0;//如果有返回0
    }
  }
  return 1;//没有返回1
}
void chessboard(char arr[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      arr[i][j] = ' ';//棋盘初始化
    }
  }
}
void print_chessboard(char arr[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
  int a = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      printf(" %c ", arr[i][j]);//打印空白字符
      if (j < col - 1)
        printf("|");//打印分割线,列
    }
    printf("\n");//换行
    if (i < row - 1) 
    {
      for (a = 0; a < col; a++)
      {
        printf("---");//打印分割线,行
        if (a < col - 1)
          printf("|");//打印分割线,列
      }
    }
    printf("\n");//换行
  }
}
void player(char arr[ROW][COL], int row, int col)
{
  int i, j;
  printf("玩家下棋\n");
  while (1)
  {
    printf("请输入坐标>");
    scanf("%d %d", &i, &j);
    if (i >= 1 && i <= row && j >= 1 && j <= col)//判断是否坐标合法
    {
      if (arr[i - 1][j - 1] == ' ')//判断位置是否有棋子
      {
        arr[i - 1][j - 1] = '*';//玩家落子
        break;
      }
      else
      {
        printf("坐标已被占用,请重新输入\n");
      }
    }
    else
    {
      printf("坐标非法请重新输入\n");
    }
  }
}
void computer(char arr[ROW][COL], int row, int col)
{
  printf("电脑下棋\n");
  while (1)
  {
    int x = rand() % row;//随机生成1到3的数
    int y = rand() % col;
    if (arr[x][y] == ' ')//判断位置是否有棋子
    {
      arr[x][y] = '#';//电脑落子
      break;
    }
  }
}
char verdict(char arr[ROW][COL], int row, int col)
{
  int i;
  for (i = 0; i < row; i++)
  {
    if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != ' ')//判断一行是否有三个棋子相等
    {
      return arr[i][1];//返回arr[i][1]这个元素
    }
  }
  for (i = 0; i < col; i++)
  {
    if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != ' ')//判断一列是否有三个棋子相等
    {
      return arr[1][i];//返回arr[1][i]这个元素
    }
  }
  if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')//判断X这种位置是否有三个棋子相同
  {
    return arr[1][1];//这里返回的是arr[1][1]这个元素
  }
  if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')//同上
  {
    return arr[1][1];
  }
  int b = dogfall(arr, row, col);
  if (b == 1)//判断是否相等
    return 'C';
}

我们来运行一下代码。

这是代码运行结果:

代码运行没问题。

到这里我们C语言实现的三子棋就完成了。

结束语

这些代码是我自己一点一点写出来的,一边写代码一边写博客,这样能写出来更多的细节,麻烦家人们三连,请大佬们纠正错误和指点不足。

谢谢!!!

相关文章
|
6月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
33 1
|
7月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
84 1
|
7月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
100 1
|
7月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
59 0
【C语言入门小游戏】三子棋
|
6月前
|
存储 C语言
三子棋(C语言版)
三子棋(C语言版)
|
6月前
|
程序员 C语言 索引
【️C语言-游戏设置】---三子棋(N满)
【️C语言-游戏设置】---三子棋(N满)
|
7月前
|
人工智能 算法 数据可视化
C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
|
7月前
|
存储 C语言
C语言实现三子棋
C语言实现三子棋
37 0
|
7月前
|
C语言
C语言实现三子棋
C语言实现三子棋
38 0
|
7月前
|
C语言
C语言:三子棋的实现。
C语言:三子棋的实现。
37 0

相关实验场景

更多