入门三个月不到的小白写的三子棋

三子棋游戏制作
在这里插入图片在这里插入图片描述描述

1,游戏开始

首先引用头文件<stdio.h>和#define _CRT_SECURE_NO_WARNINGS 1,最新的VS会对部分库函数报错,输入主函数,自定义函数game_star,来开始制作游戏菜单和游戏界面
在这里插入图片描述
2,游戏菜单制作

首先定义一个整形自变量inpunt,用于后续的输入操作,为了让游戏在结束之后可以在游玩一次,使用了do…while循环,放入游戏菜单,while循环后面放入了inpunt,但inpunt输入0的时候,跳出循环,游戏结束,输入别的数字则进行别的操作,使用多分支语句switch…case,定义输入1进入游戏,输入0则break跳出循环结束游戏,default则提示输入数字无效,提醒玩家重新输入,再一次进入循环
在这里插入图片描述
在这里插入图片描述
3,游戏系统制作

在前面的游戏菜单函数中的分支1选项中自定义game,这一部比较复杂,我拆分了几个步骤来细述,我认为用最简单的话来说就是:棋盘制作->游戏进行->判断输赢,我决定从这三个步骤开始讲起

在这里插入图片描述
3.1,棋盘制作

定义字符board,我们要打印的是一个3X3的棋盘,在上面定义一个define ROW和COL,设他们都为3,之所以这么做主要是为了后续的套用和修改,当然我觉得直接写一个3好像也不错,不过如果后续想用这个三子棋代码来衍生出五子棋的话用这个定义会方便很多,往board里面放入一个0活着是空格都可以,接下来开始定义函数来对棋盘初始化,就是给棋盘一个全部是空格的空间

可能我这么说比较抽象,换一个说法就是我现在要做这么一个棋盘:

在这里插入图片描述
那要用数组制作这么一个棋盘,首先就应该先给一个这么大的空间来放下这个棋盘,自定义函数DLY_Board,因为没有返回类型所以是void函数,函数后面不能直接套char board[ROW][COL],这只会套用这个数组中的第一个元素(我是这么理解的,如果有错请指正),所以要连着ROW和COL一起放进,所以那个自定义函数就应该是

void DLY_Board(char board[ROW][COL], int row, int col)

定义整形i和j,使用for循环,制作出一块3X3的空格空间在这里插入图片描述
接下来开始制作棋盘,更准确的来说应该是打印棋盘,定义函数void DLYs_board,放入的元素和上同步,定义两个整形i和j,因为要放入旗子,所以要打印出字符中的元素,根据自己的棋盘大小来设置每一个元素之间的竖杆|的间隔,我这里是元素两边各一个空格,使用两次循环,分别循环出行和列,为了美观可以取消掉最后一行的横线(col-1),换行因为每一个元素下面都会有一条横线,因此要再次使用循环打印,我的效果图里只有两条横线,因此我选了ROW和COL都减去1,如图

在这里插入图片描述
为什么说这里是打印棋盘,因为每一行我都会打印出一个%c,就是棋盘中的空格,如果我在这里放入一个子,就是下这一步,那么棋盘也会打印出来,所以就将这步称为打印棋盘

3.2,游戏进行

三子棋的玩法我们就将它定义为,玩家下一步,电脑下一步,玩家下一步…知道棋盘出现玩家获胜或者是电脑获胜,又或者是平局的情况才结束,我们先来定义第一步,玩家下棋

定义函数void Playermove(board, ROW, COL);,定义整形x和y为玩家要下的坐标,比如说九宫格的一个坐标为(1,1)第二个坐标为(1,2)…以此类推,使用scanf来打印出玩家要下的坐标

这里要考虑三种情况,坐标存在,坐标不存在,坐标被占用,如果一个空格上已经被下了子,那按照三子棋的规则是不可以在下子进去,同理坐标不存在也无法下子,九宫格中不存在(4,5)的坐标

使用while循环,设立条件if(我知道这个叫分支,但是我觉得这个叫做条件的话会更加形象点),如果board[x-1][y-1]这个位子上是空的,才可以放入子*,才可以跳出循环,之所以是board[x-1][y-1]是因为我们是用下标来确定玩家输入的坐标是在哪里,玩家输入的(1,1)实际是字符中的(0,0),因此都要减1
  在这里插入图片描述
接下来轮到电脑下,和玩家下同理,设整形x,y,因为是电脑下,我们要设立一个随机数来供电脑输入随机数,引入头文件和时间戳<stdlib.h>和<time.h>,在使用随机数rand的时候要先定义一个srand来设置一个随机起点,srand只需要设置一次,我这里就直接在一开始的游戏菜单中设置(可以返回前面菜单看),time是一个长整形,时间戳只能设置一次,后面需要定义一个指针,这里我们不需要定义,所以就是NULL空指针,定义unsigned int,设置成整形(这方面的知识我还没有学,入门代码还不足三个月,惭愧,只能写出自己的理解,还请指正),然后开始设置x和y
在这里插入图片描述
 x=rand()%ROW,这样就可以将数字限制在了012三个数字中,y也是一样,设置循环while,设置条件,如果board[x][y]的元素是空格才可以下入#号,否则一直循环,这样保证了电脑一定下在空格上

3.3判断输赢

三子棋获胜的条件分别为:行,列,对角线。三处为同一个子的时候则判断胜利,设整形i,循环,若第一行第一个元素等于第二个元素且等于第三个元素并且不是空格,则判断获胜,同理的列和对角线也是一样,如果所有子都占满都还没触发上面的条件,则触发平局,若还有子都没占满,又还没有分出胜负,则继续游戏,我们个这五种情况定义一个值  在这里插入图片描述

在这里插入图片描述
判断平局的条件稍微复杂了些,单独写出,但是和制作空棋盘的空间的道理是一样,定义一个函数,设i和j,for循环,只要有一处是空则跳出,若都满则输出结果,这里我采取的是0和1的条件判断,若1则平局,0则继续游戏
在这里插入图片描述
在每一次玩家下棋和电脑下棋都要进行这么一个判断,定义一个字符ret,让ret等于Iswin,输出值在进入一个新的判断函数(由刚刚的返回值我们来定义判断规则函数)
在这里插入图片描述

定义完成后,方可运行三子棋游戏

这是我程序员生涯的第一篇博客,后续我会坚持写博客的习惯,希望能认识更多的♂程序员朋友

请多指教

猜你喜欢

转载自blog.csdn.net/m0_54707823/article/details/112830284