三子棋游戏的简单实现(C语言后附完整代码)(上)

简介: 三子棋游戏的简单实现(C语言后附完整代码)(上)

三子棋又叫井字棋,规则为在一个3*3的棋盘里对弈,最后三子一线则为赢。而接下来我们将用C语言来简单实现它。实现结果展示大概为这样,具体实现请看下文



博主使用的是VS2019进行编译,有对该编译器感兴趣或想要下载链接的可以私信博主

首先呢我们先创建一个工程,在此工程中创建三个文件为



game.h 为我们所创建的头文件,里面有我们所需要的所有函数声明

game.c 为我们三子棋游戏的具体实现

test.c 为我们的主函数所在,和实现

写一个代码,我们从它的主函数开始写起,那么我们这个主函数该怎么写呢;我们写一个游戏,首先是不是得有一个游戏界面,得让使用者知道要干些什么;而且得让他有的选择;其次呢万一玩家完了之后还要继续玩呢?当我们知道这些后就可开始test.c的实现了;


void menu()
{
  printf("********  三子棋游戏  ********\n");
  printf("******** 1 .  玩游戏   *******\n");
  printf("******** 2 . 退出游戏  *******\n");
  printf("**规则:一次一子,三子相连为赢\n");
  printf("******************************\n");
}

首先我们创建一个menu()的函数来实现菜单的打印

int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));//产生随机数,与rand()搭配使用,在game()中会用到
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);//进行选择
    switch (input)
    {
    case 1:
      game();//game()的实现后续会讲到
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,重新选择!\n");
      break;
    }
    getchar();//两个getchar(),是为了吃掉回车,后续会讲到具体用处
    getchar();
    system("cls");//清空前面输出的棋盘,使页面更加整洁(每一局结束后清理)
  } while (input);
  return 0;
}


这就是我们的主函数,因为博主觉得菜单不算game()函数的具体实现,便放在了test.c里

我们来看一下博主写的test.c


#include "game.h"//我们自己创建的头文件
void menu()
{
  printf("********  三子棋游戏  ********\n");
  printf("******** 1 .  玩游戏   *******\n");
  printf("******** 2 . 退出游戏  *******\n");
  printf("**规则:一次一子,三子相连为赢\n");
  printf("******************************\n");
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("选择错误,重新选择!\n");
      break;
    }
    getchar();
    getchar();
    system("cls");
  } while (input);
  return 0;
}


接下来我们来到最难的game()函数的实现了,这里我们采用二维数组来实现

首先我们得对数组初始化,其次呢我们得有个棋盘,然后呢就是下棋过程,分为玩家下棋,和电脑下棋,而每一轮下完棋后,又需要进行判断输赢情况。

那么我们就有了思路,可分为以下几个模块来写:

       1.数组的初始化

       2.打印棋盘

       3.选手输入

       4.电脑输入

       5.判断输赢

在函数篇讲到函数:先声明后使用

则在头文件game.h里的函数声明如下


#pragma once
#include<stdio.h>
#include<time.h>
#include<windows.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);


那接下来我们就开始game()函数的实现部分;


1.数组的初始化


在这里我们从最开始结果展示可以发现,最开始是什么都没有·,所以都初始化为空格,数组初始化不懂得可以看看博主对数组篇得讲解


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


 2.打印棋盘

我们先来看一下我们所需要得棋盘长什么样子?



接下来我们看一下具体得代码实现


void DisplayBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)//行
  {
    int j = 0;
    for (j = 0; j < col; j++)//列
    {
      printf(" %c ", board[i][j]);//棋盘为了美观,在每一个字符前后都打印了空格
      if (j < col - 1)//为了能看出棋盘得样子和隔开每一个字符,所以在字符后加入'|'
        printf("|");//因为最后一个字符不用打印'|',所一只用打印col-1次
    }
    printf("\n");
    for (j = 0; j < row; j++)
    {
      if (i < row - 1)//同理,后一行不打印
      {
        printf("---");//产生棋盘的分割线
        if (j < col - 1)//与上面相同,最后一个不用打印
          printf("|");
      }
    }
    printf("\n");
  }
}


关于每一步得思路和注释已经写在了代码里,有需要得宝子可以看一下


3.选手输入


选手输入时不但要做出提示,还得对输入的位置进行判断,此处是否能落子,实现代码如下


void PlayerMove(char board[ROW][COL], int row, int col)
{
  printf("玩家输入\n");
  printf("请输入一个坐标,中间用空格隔开>:");
  int x = 0;
  int y = 0;
  while (1)//若不对可循环输入
  {
    scanf("%d%d", &x, &y);
    if ((x<1 && x>row) || (x<1 && x>col))
      printf("非法输入,请重新输入\n");
    if (board[x - 1][y - 1] == ' ')//玩家输入的坐标都是从一开始的,而数组的下标是从0开始的,
    {                              //所以需要减一
      board[x - 1][y - 1] = '*';//我们让玩家下的棋子为'*';
      break;//输入正确跳出循环
    }
    else printf("此处已被占用,请重新输入\n");
  }
}


测试一下,实现成功


相关文章
|
7天前
|
安全 C语言
在C语言中,正确使用运算符能提升代码的可读性和效率
在C语言中,运算符的使用需要注意优先级、结合性、自增自减的形式、逻辑运算的短路特性、位运算的类型、条件运算的可读性、类型转换以及使用括号来明确运算顺序。掌握这些注意事项可以帮助编写出更安全和高效的代码。
20 4
|
24天前
|
存储 算法 C语言
C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解
这份二叉排序树习题集涵盖了二叉搜索树(BST)的基本操作,包括构建、查找、删除等核心功能。通过多个具体示例,如构建BST、查找节点所在层数、删除特定节点及查找小于某个关键字的所有节点等,帮助读者深入理解二叉排序树的工作原理与应用技巧。此外,还介绍了如何将一棵二叉树分解为两棵满足特定条件的BST,以及删除所有关键字小于指定值的节点等高级操作。每个题目均配有详细解释与代码实现,便于学习与实践。
|
24天前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
24天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
24天前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。
|
21天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
24天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
24天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
1月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
1月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。