三子棋游戏的简单实现(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");
  }
}


测试一下,实现成功


相关文章
|
1月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
72 8
|
1月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
54 4
|
23天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
1月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
24天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
56 1
|
26天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
44 2
|
22天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
44 10
|
22天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
43 9
|
22天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
32 8
|
22天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
43 6