超详细三子棋讲解,体会分模块写法(上)

简介: 超详细三子棋讲解,体会分模块写法(上)

一. 问题描述



用C语言分模块写出三子棋代码
游戏头文件  game.h
游戏源文件  game.c
主源文件  test.c


二. 三子棋简单描述



我们要实现一个如下三子棋(简单逻辑):
    1.游戏开始,进入游戏界面,玩家自行选择是否开始游戏
    2.创建一个空棋盘,让玩家可以下棋
    3.创建过后,打印棋盘让玩家可以观察棋盘大小
    4.玩家进行落子(以坐标形式进行落子)--(x y)
      其中x(1<=x<=3)  y(1<=y<=3)
    5.玩家进行落子后,须判断玩家落子是否正确
    6.电脑下棋
    7.每一轮落子过后判断是否游戏输赢决定是否结束游戏或继续下棋


三. 三子棋步骤详解



1.菜单


1.玩家需要一个可视化的菜单
        菜单应该实现可以让玩家自行选择是否游戏
    在主源文件 test.c 中 代码如下:


void menu() //菜单界面
{
  printf("***********************\n");
  printf("**1.play***0.退出游戏**\n");
  printf("***********************\n");
}
#include<stdio.h>
int main()
{
  int input = 0;//存储玩家的选择输入
  printf("  欢迎来到三子棋\n");
  menu();
  scanf("%d", input);//玩家进行选择
}
该处菜单代码可根据自行要求美化
效果展示  

image.png


2.创建棋盘


 菜单完成后,考虑玩家的选择,若玩家选择 1. 进行游戏则进入游戏代码模块
 若选择 2.则选择退出游戏结束进程。考虑到这个游戏至少需要完成一次,因此我们写一个do while();循环来完成。由于棋盘是一个三行三列的数组,因此我们创建一个二维数组棋盘。
 在主源文件 test.c 中 代码如下:


void game()
{
  //创建棋盘
  char board[ROW][COL] = { 0 };//存储棋盘
}
int main()
{
  int input = 0;
  srand((unsigned)time(NULL));
  do
  {
    printf("  欢迎来到三子棋游戏\n");
    menu();
    printf("请选择:\n");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      printf("三子棋游戏开始\n");
      game();
      break;
    case 0:
      printf("即将退出游戏\n");
      break;
    default:
      printf("选择错误,请重新选择!\n");
      break;
    }
  } while (input);
  return 0;
}


其中,合理运用玩家的输入input的值来控制了这个循环。可以达到玩家输错后为一个非0的数字也可以继续选择,同时结束一局游戏后,又可以选择继续重新开始。


代码展示


image.png


在game.h中 定义行列大小

#define ROW 3  //三行
#define COL 3  //三列


在这使用自定义的行列有如下好处

1.提高代码可读性,防止与后续代码中出现的值歧义

2.方便后续创建一个新棋盘,更改自定义大小即可获得一个几行几列的数组


3.初始化棋盘


在创建了一个三行三列的数组后,这个棋盘里应该没有任何东西,因此须将棋盘进行初始化。

由于棋盘的初始化属于游戏模块,因此将其分装到 game.h 的头文件中进行声明,在 game.c 中进行实现(下述游戏模块的函数均如此分装不在赘述)


test.c 中代码如下:

void game()
{
  //创建棋盘
  char board[ROW][COL] = { 0 };//存储棋盘
  //棋盘初始化
  Initboard(board, ROW, COL);
}


4.打印棋盘


在进行初始化后,玩家无法看见棋盘,因此我们需要写一个函数将棋盘打印出来,让玩家观察棋盘


test.c中代码如下:

void game()
{
  //创建棋盘
  char board[ROW][COL] = { 0 };//存储棋盘
  //棋盘初始化
  Initboard(board, ROW, COL);
  //打印初始化后的棋盘
  print_board(board, ROW, COL);
}


game.h中代码如下:

#define ROW 3  //三行
#define COL 3  //三列
//初始化棋盘
void Initboard(char board[ROW][COL], int row, int col);
//打印棋盘
print_board(char board[ROW][COL], int row, int col);


在实现这个打印棋盘的函数时,进行逻辑分析

我们想要获得一下形式的棋盘

086deb7a14c74a95a8e917ecd7e79e92.png


观察这个棋盘,我们可以将其分为:

a17e588a6a554b7bab35806266a956d6.png


1.数据行:玩家以及电脑落子后每一行中的数据

让每一组数据都落在中间那个空格上


2.每一行的分割行 数据 + | 第三行时没有分割行

13f0b0abe56547269a4750897c3ce311.png


3.每一列的分割行 _ _ _ 第三列没有分割行 _ _ _

07df9e33bc7f4cb0b54e4b342bd43825.png


game.c中代码如下:

print_board(char board[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      printf(" %c ", board[i][j]);//打印每一行的数据
      if (j < col - 1)//控制第三行没有分割行 | 
      {
        printf("|");//打印每一列的分割列
      }
    }
    printf("\n"); //打印完每一行后进行换行
    if (i < row - 1)//控制第三列没有分割行 _ _ _ 
    {
      int j = 0;
      for (j = 0; j < col; j++)
        printf("--- ");
    }
    printf("\n");//打印每一列数据后换行
  }
}


由于test.c 以及game.c 中都需要引用一些头文件,为更方便和简介,将这些头文件都放入game.h中,test.c 以及 game.c只需 #include“game.h” 即可使用

//函数体申明
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


效果展示:

14276a87f5874516ad532f329e76d610.png


相关文章
|
C语言
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
74 2
三子棋小游戏思路及代码实现的详解
三子棋小游戏思路及代码实现的详解
87 0
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
52 19
|
1月前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
59 18
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
53 1
|
1月前
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】判断一个数是不是5和7的倍数(头歌实践教学平台习题)【合集】
本任务要求输入一个正整数,判断其是否同时是5和7的倍数,若是输出&quot;Yes&quot;,否则输出&quot;No&quot;。内容涵盖选择结构的基本概念、主要语句类型(if、if-else、switch)及条件判断逻辑,帮助理解编程中的分支执行与条件表达式。测试用例包括正数、负数及非倍数情况,确保代码逻辑严谨。通关代码示例如下: ```cpp #include &quot;stdio.h&quot; int main(){ int a; scanf(&quot;%d&quot;, &a); if (a &lt;= 0){ printf(&quo
48 0
|
9月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
116 1
|
9月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
92 1
|
编译器 C语言
三子棋游戏的简单实现(C语言后附完整代码)(上)
三子棋游戏的简单实现(C语言后附完整代码)(上)
|
人机交互 C语言
c语言实现三子棋(思路+项目展示+源代码)
c语言实现三子棋(思路+项目展示+源代码)
133 0