【C语言】简易三子棋游戏(人机互玩)

简介: 三子棋

 目录

一、介绍

二、游戏实现

       设计菜单

       设计游戏流程

初始化游戏

显示棋盘

下棋

判断结果

三、整体代码

common.h

Game.h

Game.c


一、介绍

三子棋,民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。如果两个人都掌握了技巧,那么一般来说就是平棋。一般来说,下在中间最有利,下在角上次之,下在边上再次之。最大的好处就是随便找个地方就可以玩这个简单而有趣的游戏了。

image.gif编辑

二、游戏实现

       设计菜单

       首先我们需要一个主函数main来设计游戏首页面菜单并来选择进入游戏或者退出游戏。在运行程序时可能玩家会输入错误,所以用while(1)来死循环游戏菜单页面。

#include"Game.h"
int main()
{
  //设置界面
  system("title 简易三子棋");
  system("mode con cols=32 lines=32");
  system("color F0");
  int select = 1;
  while (select)
  {
    printf("********************************\n");
    printf("*        简 易 三 子 棋        *\n");
    printf("********************************\n");
    printf("*     [1]开始      [0]退出     *\n");
    printf("********************************\n");
    printf("请选择:>");
    scanf("%d", &select);
    if (select == 0)
      break;
    if (select != 1)
    {
      printf("输入有误!\n");
      continue;
    }
    //开始游戏
    BeginGame();
  }
  printf("游戏结束,欢迎下次来玩!\n");
  return 0;
}

image.gif

image.gif编辑

image.gif编辑

        由运行截图可见,输入错误数字则会死循环,输入0则退出程序。

       设计游戏流程

      进入游戏后编写一个BeginGame函数来设计游戏流程,其中可以随机让电脑先下棋或者让玩家先下棋,和棋后判断你是否要重来。

int BeginGame()
{
  //1 初始化游戏
  InitializeGame();
  char winner;
  //2 随机下棋者
  int Return = RandomChessPlayer();
  if (Return == 0)
  {
        //3 进入游戏
    while (1)
    {
      //4 显示棋盘
      ShowChessBoard();
      //5 玩家下棋
      PlayerMove();
      //6 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
      //7 电脑下棋
      ComputerMove();
      //8 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
    }
  }
  else
  {
    while (1)
    {
      //4 电脑下棋
      ComputerMove();
      //5 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
      //6 显示棋盘
      ShowChessBoard();
      //7 玩家下棋
      PlayerMove();
      //8 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
    }
  }
  //9 宣布结果
  if (winner == 'x')
    printf("恭喜你,玩家胜利.\n");
  else if (winner == 'o')
    printf("很遗憾,电脑胜利.\n");
  else
  {
    printf("和棋,是否继续[y/n]:");
    while (1)
    {
      char a[1];
      scanf("%s", a);
      if (a[0] == 'y')
        BeginGame();
      else if (a[0] == 'n')
        break;
      else
        printf("输入有误,清重新输入:>");
    }
  }
  return 0;
}

image.gif

以下是对游戏流程的细化实现

初始化游戏

       我们可以用二维数组来确定一个3×3的版块,把3×3数组都初始化为空字符。

void InitializeGame()
{
  for (int i = 0; i<ROW; ++i)
  {
    for (int j = 0; j<COL; ++j)
    {
      board[i][j] = ' ';
    }
  }
}

image.gif

显示棋盘

      将3×3数组打印出来,一个简易的棋盘就做好了

image.gif编辑

void ShowChessBoard()
{
  for (int i = 0; i<ROW; ++i)
  {
    printf("           %c | %c | %c            \n", board[i][0],board[i][1],board[i][2]);
    if (i != ROW - 1)
      printf("          --- --- ---           \n");
  }
}

image.gif

下棋

       设立玩家下棋为字符‘x’,电脑下棋为字符‘o’;玩家来通过坐标实现下棋,电脑先确定是否玩家下一步可能获胜,如果可能获胜,则下到玩家可能获胜的位置,否则随机下棋。

void PlayerMove()
{
  printf("请玩家落子:\n");
  int row, col;
  while (1)
  {
    printf("请输入棋子的坐标(row:col):>");
    scanf("%d %d", &row, &col); 
    if (board[row - 1][col - 1] != ' ')
    {
      printf("输入的位置已被占用,请重新输入....\n");
      continue;
    }
    board[row - 1][col - 1] = 'x';
    break;
  }
}
void ComputerMove()
{
  int row, col;
  srand(time(0));
  while (1)
  {
    //下玩家可能赢的位置
    if (board[0][0] == 'x' && board[0][1] == 'x' && board[0][2] == ' ')
    {
      board[0][2] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[0][1] == 'x' && board[0][0] == ' ')
    {
      board[0][0] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[0][0] == 'x' && board[0][1] == ' ')
    {
      board[0][1] = 'o';
      break;
    }
    else if (board[1][0] == 'x' && board[1][1] == 'x' && board[1][2] == ' ')
    {
      board[1][2] = 'o';
      break;
    }
    else if (board[1][2] == 'x' && board[1][1] == 'x' && board[1][0] == ' ')
    {
      board[1][0] = 'o';
      break;
    }
    else if (board[1][2] == 'x' && board[1][0] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[2][0] == 'x' && board[2][1] == 'x' && board[2][2] == ' ')
    {
      board[2][2] = 'o';
      break;
    }
    else if (board[2][2] == 'x' && board[2][1] == 'x' && board[2][0] == ' ')
    {
      board[2][0] = 'o';
      break;
    }
    else if (board[2][2] == 'x' && board[2][0] == 'x' && board[2][1] == ' ')
    {
      board[2][1] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[1][0] == 'x' && board[2][0] == ' ')
    {
      board[2][0] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[2][0] == 'x' && board[1][0] == ' ')
    {
      board[1][0] = 'o';
      break;
    }
    else if (board[1][0] == 'x' && board[2][0] == 'x' && board[0][0] == ' ')
    {
      board[0][0] = 'o';
      break;
    }
    else if (board[0][1] == 'x' && board[1][1] == 'x' && board[2][1] == ' ')
    {
      board[2][1] = 'o';
      break;
    }
    else if (board[0][1] == 'x' && board[2][1] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[1][1] == 'x' && board[2][1] == 'x' && board[0][1] == ' ')
    {
      board[0][1] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[1][2] == 'x' && board[2][2] == ' ')
    {
      board[2][2] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[2][2] == 'x' && board[1][2] == ' ')
    {
      board[1][2] = 'o';
      break;
    }
    else if (board[1][2] == 'x' && board[2][2] == 'x' && board[0][2] == ' ')
    {
      board[0][2] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[1][1] == 'x' && board[2][2] == ' ')
    {
      board[2][2] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[2][2] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[1][1] == 'x' && board[2][2] == 'x' && board[0][0] == ' ')
    {
      board[0][0] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[1][1] == 'x' && board[2][0] == ' ')
    {
      board[2][0] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[2][0] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[2][0] == 'x' && board[1][1] == 'x' && board[0][2] == ' ')
    {
      board[0][2] = 'o';
      break;
    }
    else
    {
      //随机产生位置
      row = rand() % ROW;
      col = rand() % COL;
      if (board[row][col] == ' ')
      {
        board[row][col] = 'o';
        break;
      }
    }
  }
}

image.gif

判断结果

       结果分为四种(玩家赢x,电脑赢o,和棋h,未下满继续c),当玩家或者电脑的棋子连成一行或者一列又或者连成对角线时,有一方获胜;当棋盘下满时,应判断为平局,所以判断输赢的函数就需要返回值。

image.gif编辑image.gif编辑image.gif编辑

三、整体代码

common.h

#include<stdio.h>
#include<time.h>
#include<stdbool.h>

image.gif

Game.h

#include"common.h"
//初始化游戏
void InitializeGame();
//显示棋盘
void ShowChessBoard();
//玩家下棋
void PlayerMove();
//电脑下棋
void ComputerMove();
//判断结果
char CheckResult();
//开始游戏
void StartGame();

image.gif

Game.c

#include"Game.h"
#define ROW 3
#define COL 3
static char board[ROW][COL];
void InitializeGame()
{
  for (int i = 0; i<ROW; ++i)
  {
    for (int j = 0; j<COL; ++j)
    {
      board[i][j] = ' ';
    }
  }
}
void ShowChessBoard()
{
  for (int i = 0; i<ROW; ++i)
  {
    printf("           %c | %c | %c            \n", board[i][0],board[i][1],board[i][2]);
    if (i != ROW - 1)
      printf("          --- --- ---           \n");
  }
}
int RandomChessPlayer()
{
  srand(time(0));
  return rand() % 2;
}
void PlayerMove()
{
  printf("请玩家落子:\n");
  int row, col;
  while (1)
  {
    printf("请输入棋子的坐标(row:col):>");
    scanf("%d %d", &row, &col); 
    if (board[row - 1][col - 1] != ' ')
    {
      printf("输入的位置已被占用,请重新输入....\n");
      continue;
    }
    board[row - 1][col - 1] = 'x';
    break;
  }
}
void ComputerMove()
{
  int row, col;
  srand(time(0));
  while (1)
  {
    //下玩家可能赢的位置
    if (board[0][0] == 'x' && board[0][1] == 'x' && board[0][2] == ' ')
    {
      board[0][2] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[0][1] == 'x' && board[0][0] == ' ')
    {
      board[0][0] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[0][0] == 'x' && board[0][1] == ' ')
    {
      board[0][1] = 'o';
      break;
    }
    else if (board[1][0] == 'x' && board[1][1] == 'x' && board[1][2] == ' ')
    {
      board[1][2] = 'o';
      break;
    }
    else if (board[1][2] == 'x' && board[1][1] == 'x' && board[1][0] == ' ')
    {
      board[1][0] = 'o';
      break;
    }
    else if (board[1][2] == 'x' && board[1][0] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[2][0] == 'x' && board[2][1] == 'x' && board[2][2] == ' ')
    {
      board[2][2] = 'o';
      break;
    }
    else if (board[2][2] == 'x' && board[2][1] == 'x' && board[2][0] == ' ')
    {
      board[2][0] = 'o';
      break;
    }
    else if (board[2][2] == 'x' && board[2][0] == 'x' && board[2][1] == ' ')
    {
      board[2][1] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[1][0] == 'x' && board[2][0] == ' ')
    {
      board[2][0] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[2][0] == 'x' && board[1][0] == ' ')
    {
      board[1][0] = 'o';
      break;
    }
    else if (board[1][0] == 'x' && board[2][0] == 'x' && board[0][0] == ' ')
    {
      board[0][0] = 'o';
      break;
    }
    else if (board[0][1] == 'x' && board[1][1] == 'x' && board[2][1] == ' ')
    {
      board[2][1] = 'o';
      break;
    }
    else if (board[0][1] == 'x' && board[2][1] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[1][1] == 'x' && board[2][1] == 'x' && board[0][1] == ' ')
    {
      board[0][1] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[1][2] == 'x' && board[2][2] == ' ')
    {
      board[2][2] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[2][2] == 'x' && board[1][2] == ' ')
    {
      board[1][2] = 'o';
      break;
    }
    else if (board[1][2] == 'x' && board[2][2] == 'x' && board[0][2] == ' ')
    {
      board[0][2] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[1][1] == 'x' && board[2][2] == ' ')
    {
      board[2][2] = 'o';
      break;
    }
    else if (board[0][0] == 'x' && board[2][2] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[1][1] == 'x' && board[2][2] == 'x' && board[0][0] == ' ')
    {
      board[0][0] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[1][1] == 'x' && board[2][0] == ' ')
    {
      board[2][0] = 'o';
      break;
    }
    else if (board[0][2] == 'x' && board[2][0] == 'x' && board[1][1] == ' ')
    {
      board[1][1] = 'o';
      break;
    }
    else if (board[2][0] == 'x' && board[1][1] == 'x' && board[0][2] == ' ')
    {
      board[0][2] = 'o';
      break;
    }
    else
    {
      //随机产生位置
      row = rand() % ROW;
      col = rand() % COL;
      if (board[row][col] == ' ')
      {
        board[row][col] = 'o';
        break;
      }
    }
  }
}
bool _IsFullChessBoard()
{
  for (int i = 0; i<ROW; ++i)
  {
    for (int j = 0; j<COL; ++j)
    {
      if (board[i][j] == ' ')
        return false;
    }
  }
  return true;
}
//x:玩家赢
//o:电脑赢
//h:和棋
//c:继续
char CheckResult()
{
  //检查行
  for (int i = 0; i<ROW; ++i)
  {
    if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][0] == board[i][2])
      return board[i][0];
  }
  //检查列
  for (int j = 0; j<COL; ++j)
  {
    if (board[0][j] != ' ' && board[0][j] == board[1][j] && board[0][j] == board[2][j])
      return board[0][j];
  }
  //判断斜线
  if (board[1][1] != ' ' && ((board[0][0] == board[1][1] && board[0][0] == board[2][2])
    || (board[0][2] == board[1][1] && board[0][2] == board[2][0])))
    return board[1][1];
  //是否和棋
  if (_IsFullChessBoard())
    return 'h';
  //继续下棋
  return 'c';
}
int BeginGame()
{
  //1 初始化游戏
  InitializeGame();
  char winner;
  //2 随机下棋者
  int Return = RandomChessPlayer();
  if (Return == 0)
  {
    //3 进入游戏
    while (1)
    {
      //4 显示棋盘
      ShowChessBoard();
      //5 玩家下棋
      PlayerMove();
      //6 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
      //7 电脑下棋
      ComputerMove();
      //8 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
    }
  }
  else
  {
    while (1)
    {
      //4 电脑下棋
      ComputerMove();
      //5 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
      //6 显示棋盘
      ShowChessBoard();
      //7 玩家下棋
      PlayerMove();
      //8 判断结果
      winner = CheckResult();
      if (winner != 'c')
        break;
    }
  }
  //9 宣布结果
  if (winner == 'x')
    printf("恭喜你,玩家胜利.\n");
  else if (winner == 'o')
    printf("很遗憾,电脑胜利.\n");
  else
  {
    printf("和棋,是否继续[y/n]:");
    while (1)
    {
      char a[1];
      scanf("%s", a);
      if (a[0] == 'y')
        BeginGame();
      else if (a[0] == 'n')
        break;
      else
        printf("输入有误,清重新输入:>");
    }
  }
  return 0;
}

image.gif

Main.c

#include"Game.h"
int main()
{
  //设置界面
  system("title 简易三子棋");
  system("mode con cols=32 lines=32");
  system("color F0");
  int select = 1;
  while (select)
  {
    printf("********************************\n");
    printf("*        简 易 三 子 棋        *\n");
    printf("********************************\n");
    printf("*     [1]开始      [0]退出     *\n");
    printf("********************************\n");
    printf("请选择:>");
    scanf("%d", &select);
    if (select == 0)
      break;
    if (select != 1)
    {
      printf("输入有误!\n");
      continue;
    }
    //开始游戏
    BeginGame();
  }
  printf("游戏结束,欢迎下次来玩!\n");
  return 0;
}

image.gif


相关文章
|
1月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
77 8
|
2月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
128 0
|
4月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
47 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
28天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
45 2
|
5月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
86 0
C语言实战 | Flappy Bird游戏
|
1月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
35 1
|
2月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
99 1
|
2月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
100 2
|
2月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
2月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)

相关实验场景

更多