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

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

一. 问题描述



用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


相关文章
|
11月前
|
C语言
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
三子棋真是太神奇啦~~~C语言三子棋小游戏详解,具体到每一步操作的解释说明,不信你学不会!
58 2
|
6月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
76 1
|
6月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
66 1
|
6月前
|
C语言
C语言初阶⑤(数组)扫雷游戏(分步实现+效果图)
C语言初阶⑤(数组)扫雷游戏(分步实现+效果图)
38 1
|
6月前
|
C语言
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
|
编译器 C语言
三子棋游戏的简单实现(C语言后附完整代码)(上)
三子棋游戏的简单实现(C语言后附完整代码)(上)
|
11月前
|
人机交互 C语言
c语言实现三子棋(思路+项目展示+源代码)
c语言实现三子棋(思路+项目展示+源代码)
76 0
|
C语言
C语言数组第十课---------------三子棋-------数组经典练手题
C语言数组第十课---------------三子棋-------数组经典练手题
|
编译器 程序员 C语言
【C语言】 数组的应用实例:三子棋游戏
三子棋规则 将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了 三子棋游戏运行步骤,进入游戏界面,选择进入游戏或者退出游戏,输入1或者0来实现进入游戏或者退出游戏,棋盘进行初始化处理,打印空棋盘,玩家进行下棋,电脑下棋,判断输赢 判断输赢分为: 玩家赢 电脑赢 棋盘无空位(双方平局) 继续下棋(返回第6步)
125 0
【C语言】 数组的应用实例:三子棋游戏
超详细三子棋讲解,体会分模块写法(下)
超详细三子棋讲解,体会分模块写法(下)