三子棋小游戏(万字详解)可以自定义棋盘大小(上)

简介: 三子棋小游戏(万字详解)可以自定义棋盘大小(上)

我想对于五子棋,大多数游戏玩家早已经不陌生,毕竟陪伴了大家的同年时光,想想那五个一排的对齐顺序(上下五个一排,对角线五个一排的对齐方式)即充满了愉快,有考验着玩家的机智与实力,忍耐力............


笔者儿时对于游戏早已向往已久,可惜现在已经过了玩游戏的年龄,不再喜欢上了游戏,而是对于游戏开发.....想要有着浅浅的认知,打算用游戏开发来替代玩游戏的梦想!


梦想还是要有的,万一实现了呢???


少年强,则国强,那么少年的智力,就用小小的游戏来测试一下吧!


话不多说,下面来进入我们的正题:如何实现三子棋小游戏??


或许刚开始的小白有着一脸的茫然,不知道该怎么去下手!但是对于三子棋,没有多大的难度,只不过就是借用了函数,数组,for循环,while循环,switch...case结构等基础知识,来进行书写出来的简单游戏代码!


下面请看:笔者带领大家去体验一下三子棋小游戏的书写过程!


若是读者觉得合适,还请热度给予笔者,让笔者更有动力去书写更多的游戏代码!


首先:我们需要有着自己的构思:在vs2019,或者vs2022中创建三个文件,分别实现:


test.c文件进行测试三子棋小游戏!


game.h文件进行对三子棋小游戏的函数声明!


game.c文件对三子棋小游戏的实现!


下面就是进入正文部分!


要想进行玩游戏,首先,我们需要有一个菜单,来进行对我们是否玩游戏的一个体验部分


输入1,进行玩游戏,输入0:退出游戏!


下面请看笔者代码片段:


//打印三子棋的菜单
#include <stdio.h>
void menu()
{
  printf("**********************************\n");
  printf("********     1.play    ***********\n");
  printf("********     0.exit    ***********\n");
  printf("**********************************\n");
}
void game()
{
  printf("三子棋游戏\n");
}
int main()
{
  int input = 0;
  do
  {
  menu();
  printf("请输入选择:》\n");
  scanf_s("%d", &input);
  switch(input)
  {
  case 1:
    game();
    break;
  case 0:
    printf("退出游戏\n");
    break;
  default :
    printf("输入错误,请重新选择\n");
    break;
  }
  } while (input);
}


在这个菜单menu部分,并没有多大的难度,也相信读者一看也就能看明白,只不过就是思维的欠缺!在这里面,实现了多次输入判断,在C语言中,系统默认0为假,非0为真(1和其他非0数是真)。


在do.....while循环中,用从键盘输入值input的数字大小来判断是否玩游戏,如果是非0,则输入错误,请重新选择,如果是1,则进行三子棋小游戏,如果是0,则退出游戏,符合C语言语法,而且还符合三子棋小游戏的代码!并且还能实现多组输入,直到输入0时,退出游戏!


在switch.....case:      ;break;结构,实现了对输入的input进行选择判断,从而有着不同的printf输出结果.


菜单的运转结果如下所示:


0a2653c851af460fa595bd959398a8f1.png


第一步:三子棋小游戏的菜单已经搭建完成,并且是我们想要的,因此我们需要进入第二步:棋盘的搭建


在搭建棋盘中,我们肯定不能搭建的跟现实中的棋盘一模一样,毕竟.......嗯,实力不允许!


文章定名为三子棋小游戏,那就以打印3*3棋盘为列,来给大家分析一下棋盘的代码写法


在上述代码段中,我们大家需要知道:


void game()
{
  printf("三子棋游戏\n");
}

在这个里面不会只有printf("三子棋游戏\n");在里面,毕竟这个是不现实的,因为我们需要借用这个来实现对菜单menu的调试,判断是否合适,是否为我们想要的菜单,下面就需要我们对其进行更改!


笔者想要的是这种棋盘,看着简短清晰:


0a2653c851af460fa595bd959398a8f1.png


下面请看这种棋盘的创建思路:


6de278e6d6694ce5bb08e7e842b7e74b.png


要实现对这种棋盘的实现,并且能将玩家跟电脑的下棋给记录下来,因此,我们需要借助数组,来实现这个功能,但是,创建什么类型的数组呢??是int类型,还是char类型??但是参考上面,发现由‘*’与‘#’组成,因此用char类型的数组比较合适!


因此我们需要定义一共3*3的数组,定义并初始化数组char board[3][3]={0};但是看一下棋盘的格式,里面都是看不见的内容.......是空格,因此这样给数组进行初始化,就出现了误差!


因此打印棋盘时候,显得有点难度,但是我们仅仅是对于3*3棋盘而言,对于其他类型的棋盘,我们又应该怎样去定义?


因此,我们需要用到自定义函数  #define  ,用来自定义函数的大小,


void display_board(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
  //数据
  printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
  //---|---|---
  if(i<row-1)
    printf("---|---|---\n");
  }
}

在这段代码里面,ROW为行COL为列,这样一个3*3简单棋盘就给打印出来,大家注意printf函数里面输出的部分,及其for循环的逻辑,这段代码看着没有什么错误地方,但是运转出来的结果却是.....


0a2653c851af460fa595bd959398a8f1.png


但是最后的结果却是出现了一丢丢小小的误差!尴尬,我想读者也能看出来,如此不明显的对齐方式,其实这个没有对齐的差距主要体现在,数组在定义并初始化数组char board[3][3]={0}....出现了问题....


大是还有一个错误,那就是体现在,仅仅改变行,但是对于列:我们却把这个程序给写死了,根本改变不了列的大小,简单来说就是,不管列输入的值是多少,到最后打印出来的结果都是三列,因为......


printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);

在这个代码块中,我们写的代码出现了错误,将列的那几次循环出现了写死的现象,在该代码中是不允许出现的情况!


下面来看笔者对于错误的分析过程:其实这个原因并不是笔者之前的代码出现错误,而是.....


我们需要借助一个函数来实现对棋盘的对齐!


因此:笔者更改后的代码为:


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


经过这样过程,运转出来的结果为:


0a2653c851af460fa595bd959398a8f1.png


虽然跟先前的那个乱棋盘相比较显得好看了不少,但是还有一点稍微的瑕疵在里面,:最后一个棋盘,下面出现了多余的部分,这并不是我们想要的,因此,需要借用if语句表判断来用!


更改后的代码结果为:


void display_board(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)          //外层决定了我们需要打印多少行
  {
  //数据
  //printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
  int j = 0;
  for (j = 0; j < col; j++)       //内层决定了我们每一行需要打印多少次
  {
    printf(" %c ", board[i][j]);
    if (j < col - 1)
    printf("|");
  }
  printf("\n");
  //---|---|---
  if (i < row - 1)
  {
    //printf("---|---|---\n");
    for (j = 0; j < col; j++)
    {
    printf("---");
    if (j < col - 1)
      printf("|");
    }
    printf("\n");
  }
  }
}


其实对比上一个代码段的区别,主要在于if语句里面的内容,if语句主要控制,最后一组里面的内容打印过程


到此,棋盘已经打印好!观看下图,发现这个才是我们想要的棋盘,符合我们的预期。


3*3棋盘如图所示:


12c3b7f3f8814309a195c64f051d4445.png


5*5棋盘如图所示:

34e8d716411043c08c7ffba9fbba23de.png


对于棋盘,我们可以通过#define 来实现自我调节大小,通过只改变define后面一处数字的大小,就能实现棋盘的简单打印,因此,方便了许多!


因此总的来说,棋盘已经打印完成,下面开始进行对下一阶段的分析:


进入玩游戏的环节:怎样才能更好的玩游戏呢??


笔者所想的便是:玩家走一步,电脑也跟着走一步,就这样开始玩起来............


对于玩家下棋,怎样下棋??


其实对于玩家来说,下棋是下在数组里面!输入的是玩家想要下棋的坐标!在棋盘上打印的是‘‘*’(字符星号)(电脑下棋也一样,只不过是借用了时间戳来实现随机下棋,在棋盘上打印的是‘#’(字符井号))!


但是对于玩家,需要又一下几点要求:


1.判断玩家输入的坐标是否合法(主要体现在是否超过棋盘的大小范围)


判断和解决问题方法:


用if语句来实现 对输入坐标的大小,与棋盘的大小进行比较


2.坐标是否被占用,毕竟电脑下棋,玩家下棋,万一放到了一样的坐标里面,将会...............


判断和解决问题方法:


对于坐标是否被占用,在这里需要我们进行手动判断,用if语句表判断,只有被输入的坐标位置是‘   ’,空格,我们才能下棋,否则将会出现提示!


3.借助数组来下棋(二维数组的第一个下标为:[0][0],但是玩家并不一定知道,大部分玩家默认的第一行一列的坐标为:[1][1],因此,我们需要对数组的坐标进行些许调整!)并且玩家输入的坐标大小还不能超过棋盘的每一行每一列,这样才能实现三子棋的正确运行!


判断和解决问题方法:


对于下棋输入坐标,我们需要进行,将玩家输入的行  列坐标分别都进行-1(减1)处理,这样就能将玩家输入的坐标转化为数组的坐标,因此便于来实现下棋的落子问题!


因此笔者进行代码的添加更改以后,总结出下面代码段,来供大家参考借鉴:


void player_move(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家下棋:>\n");
  while (1)
  {
  printf("请输入要下棋的坐标:>");
  scanf("%d %d", &x, &y);
  //1.坐标的合法性
  //2.坐标是否被占用
  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");
  }
  }
}
相关文章
|
6月前
|
存储
三子棋游戏的实现
三子棋游戏的实现
58 0
三子棋小游戏思路及代码实现的详解
三子棋小游戏思路及代码实现的详解
63 0
|
5月前
小游戏:三子棋的代码实现
小游戏:三子棋的代码实现
33 3
|
6月前
|
C语言
三子棋游戏(详解+代码)
三子棋游戏(详解+代码)
72 2
|
C语言
C/关于扫雷小游戏的创建
C/关于扫雷小游戏的创建
|
6月前
|
人工智能 C语言
三子棋小游戏
三子棋小游戏
|
6月前
|
算法 C语言
三子棋小游戏(可改棋盘大小)
三子棋小游戏(可改棋盘大小)
76 0
三子棋游戏
三子棋游戏
73 0
|
算法
设计一个三子棋游戏(上)
设计一个三子棋游戏(上)