基于C语言实现三子棋游戏

 更新时间:2021年08月19日 14:03:08   作者:今天我学习了!  
这篇文章主要为大家详细介绍了基于C语言实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

说到三子棋,我想大家一定不陌生吧,它也是我童年中的一部分,今天我们用C语言来实现一下简易版的三子棋。

首先,介绍一下游戏规则:

1.在一个九宫格上进行下棋;
2.玩家两名,双方先后落子;
3.若在一条直线上有三颗同一玩家的棋子,则该玩家赢,若棋盘下满也没有出现三颗棋子在一条直线上,则为平局。

设计思路如下:

1.用do…while循环可以保证玩完一把还能接着玩,玩家可以自行选择继续玩还是退出。
2.用一个3x3的二维数组来存放玩家和电脑下的棋子,再进行判断输赢。
3.进行游戏的棋盘如下:

代码如下:

头文件game.h:

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

#define ROW 3
#define COL 3

//棋盘初始化
void InitBoard(char board[ROW][COL], int row, int col);

// 打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//判断输赢
char IsWin(char board[ROW][COL], int row, int col);

//判断游戏输赢
//要返回4种不同的状态
//玩家赢 - '*'
//电脑赢 - '#'
//平局 -  ‘Q'
//继续 -   'C'

测试文件test.c:

#include"game.h"

void menu()
{
 printf("*****************************************\n");
 printf("************    1.play    ***************\n");
 printf("************    0.exit    ***************\n");
 printf("*****************************************\n");
}

void game()
{
 char board[ROW][COL];
 InitBoard(board, ROW, COL); //初始化棋盘
 DisplayBoard(board, ROW, COL); //打印棋盘

 char ret = 0;
 while (1)
 {
  PlayerMove(board, ROW, COL);
  DisplayBoard(board, ROW, COL);
  ret = IsWin(board, ROW, COL);
  if (ret != 'C')
  {
   break;
  }
  ComputerMove(board, ROW, COL);
  DisplayBoard(board, ROW, COL);
  ret = IsWin(board, ROW, COL);
  if (ret != 'C')
  {
   break;
  }
 }
 if (ret == '*')
 {
  printf("玩家赢\n");
 }
 else if (ret == '#')
 {
  printf("电脑赢\n");
 }
 else
 {
  printf("平局\n");
 }

}

int main()
{
 int input = 0;
 srand((unsigned)time(NULL));

 do
 {
  menu();
  printf("请输入:");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
   game();
   break;
  case 0:
   printf("退出游戏\n");
   break;
  default:
   printf("选择错误\n");
   break;
  }
 } while (input);

 return 0;
}

game函数里的函数,game.c文件:

#include"game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   board[i][j] = ' ';
  }
 }
}

void DisplayBoard(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  //打印数据
  for (int j = 0; j < col; j++)
  {
   printf(" %c ", board[i][j]);
   if (j < col - 1)
    printf("|");
  }
  printf("\n");
  //打印分割行
  if (i < row - 1)
  {
   for (int j = 0; j < col; j++)
   {
    printf("---");
    if (j < col - 1)
     printf("|");
   }
  }
  printf("\n");
 }
}

void PlayerMove(char board[ROW][COL], int row, int col)
{
 printf("玩家走:>\n");

 int x = 0;
 int y = 0;
 while (1)
 {
  printf("请输入坐标:>");
  scanf("%d%d", &x, &y);//2 1 表示第二行第一列
  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");
  }
 }
}

void ComputerMove(char board[ROW][COL], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("电脑走:>\n");

 while (1)
 {
  x = rand() % row;
  y = rand() % col;
  if (board[x][y] == ' ')
  {
   board[x][y] = '#';
   break;
  }
 }
}

int IsFull(char board[ROW][COL], int row, int col)
{
 for (int i = 0; i < row; i++)
 {
  for (int j = 0; j < col; j++)
  {
   if (board[i][j] == ' ')
   {
    return 0;//不满
   }
  }
 }
 return 1;//棋盘满
}

char IsWin(char board[ROW][COL], int row, int col)
{
 //行
 for (int 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 (int 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[1][1] != ' ')
  return board[1][1];

 if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  return board[1][1];

 //判断平局
 if (IsFull(board, row, col))
 {
  return 'Q';
 }
 //游戏继续
 return 'C';
}

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

相关文章

  • C语言一篇精通链表的各种操作

    C语言一篇精通链表的各种操作

    链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构,是根据需要开辟内存单元,链表这种数据结构,必须利用指针变量才能实现,即一个结点中应包含一个指针变量,用它存放下一结点的地址
    2022-04-04
  • C语言 自增自减运算的区别详解及实例

    C语言 自增自减运算的区别详解及实例

    这篇文章主要介绍了C语言中的++a和a++的区别详解及实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • C语言typedef与复杂函数声明问题的深入解析

    C语言typedef与复杂函数声明问题的深入解析

    以下是对C语言中的typedef与复杂函数声明问题进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • C++入门基础之命名空间、输入输出和缺省参数

    C++入门基础之命名空间、输入输出和缺省参数

    C++入门基础篇的内容为C++的基本特性,只有在掌握C++的基本特性后,是进入后面类和对象学习的基础,下面这篇文章主要给大家介绍了关于C++入门基础之命名空间、输入输出和缺省参数的相关资料,需要的朋友可以参考下
    2023-01-01
  • C++中的数据对齐示例详解

    C++中的数据对齐示例详解

    这篇文章主要介绍了C++中数据对齐的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C语言宏定义容易认不清的盲区梳理

    C语言宏定义容易认不清的盲区梳理

    宏定义是C提供的三种预处理(宏定义、文件包含、条件编译)的其中一种,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率
    2022-09-09
  • C++使用回溯法解决黄金矿工问题

    C++使用回溯法解决黄金矿工问题

    在矩阵中考察回溯算法,分为任意起点、左上角开始等情况。从而有不同的模板,其实区别就是直接开始还是每个坐标都去尝试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C语言全方位讲解指针的使用

    C语言全方位讲解指针的使用

    指针是C语言中一个非常重要的概念,也是C语言的特色之一。使用指针可以对复杂数据进行处理,能对计算机的内存分配进行控制,在函数调用中使用指针还可以返回多个值
    2022-04-04
  • 详解C++中typedef 和 #define 的区别

    详解C++中typedef 和 #define 的区别

    这篇文章主要介绍了C++中typedef 与 #define 的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言文件操作详情(一)

    C语言文件操作详情(一)

    这篇文章主要介绍了C语言文件操作详情,主要讨论的是数据文件,通过处理的磁盘上的文件展开主题内容介绍,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-04-04

最新评论