赞
踩
顾名思义,三子棋,是一种游戏吧,而当我们进入游戏时,往往是能看见一个游戏菜单的。所以,我们的第一步就是制作一个游戏菜单。让我们先来设计一个游戏菜单。
1.游戏菜单
应用库函数自带的printf函数打印游戏菜单,自定义的menu函数没有返回值,故用void的类型。不过这个游戏菜单可以根据各位老铁的喜好,自行调整。
但光有一个菜单空壳,我们没法进入游戏哈,所以我们该咋办呢?
当然是给我们上面菜单的两个选项对接接下来的操作啦。
我们可以输入“1”来开始游戏,或者“0”退出游戏,还有些老铁很调皮就是不输入“1”或者“0”,输入一些其他的数字。
我们瞧,我们有这三个选项,所以我们可以用快乐的选择语句。if语句当然可以,不过我更喜欢switch语句。不过如果有些老铁输错了数字,我们总得给这些老铁一次机会吧,让他们重新试一次,那我们就在switch语句再来个循环语句。当然我们肯定得先输入数字,再判断老铁要不要再输入一次,所以我们选择先执行后判断的do-while语句。
游戏菜单做好了,接下来让我们进入游戏 。
想必老铁们肯定注意到了上面的game()了吧,那就是我们进入游戏的端口了。
2.棋盘的相关设计
当然,三子棋,三子棋,我们肯定得有棋子啦。所以我们的第一步就是做出几个棋子了。
不过我们总不可能去店里买几个棋子塞进电脑里吧,那该咋办呢?
棋子是放在棋盘上的,像不像我们把值放在数组里呢,要不我们试试用数组里的值来当棋子呢?先试试再说。
我们想想啊,三子棋需要几个棋子呢?3×3=9。棋子数=行数×列数;而行数和列数我们是经常用到的,我们不妨定义列数和行数的标识符常量。
我就用“*”作为自己的棋子,用“#”作为电脑的棋子。
那现在让我们来定义一个char类型的二维棋盘数组
而接下来,让我们来初始化数组来设置棋子。
定义一个棋盘数组初始化函数
因为我们还没落子嘛,所以我们先把棋子初始化成“ ”,当我们或电脑落子时,用“*”或者“#”替换“ ”
因为我们需要利用到棋盘数组,以及棋盘的行数和列数,故我们引入这三个值作为形参(之后定义的函数也是如此),且我们不返回值,故函数类型为void类型。再利用两次for循环,将棋盘数组初始化。
棋子已经做好了,接下来就是画棋盘了
这就是三子棋的棋盘了,一个九宫格。
我们的棋子,也就是数组里的值就放在这里。可以看出我们棋盘的分界线都是出现的第1,2行和第1,2列后面,或者说是第1,2,row-1行和第1,2,col列后面。我们从第一行开始演示,我们可以先用printf(“ %c ”,board[1][1])在左上角的位置落子,然后用printf(“|”)打印后面的分界线,然后再用printf(“ %c ”,board[1][2])在下一个位置落子,然后用printf(“|”)打印后面的分界线,之后是用printf(“ %c ”,board[1][2])在下一个位置落子。再利用printf(”\n“)换行,同理,我们用"---"替换上述的数组,其他操作不变,打印处行的分界线。所以我们就可以得到
现在我们已经把棋盘和棋子做好了,现在该我们上场表演了。
3.玩家操作设置
我们落子肯定需要一个坐标(x,y),而我们的棋盘是二维的,所以我们需要输入两个数字进行定位。
可万一我们的老铁输入的坐标(x,y)超出我们的棋盘,又或者是上面已经有棋子咋办呢?
我们可以通过if语句对x和y的范围进行判断,看看老铁们的坐标是否超出我们的棋盘。
那如果对应位置上已经有棋子了怎么办?
老铁们,还记得我们对棋盘进行初始化吗?
倘若没人在上面落子,则该位置的值应为" "。如果该位置的值不为" ",则说明该位置已有人落子。
所以我们可以得到
我们设置完玩家操作以后,继续设置电脑操作。
4.电脑操作设置
这是我第一次编程三子棋,且对编程的技术不太了解,我试着将两个随机数作为电脑落子的坐标。要获取随机数,我们需要rand函数。
但要注意的是,引用rand函数的前置条件是引用srand函数,而引用srand函数又需要引用一个随机的无符号整形,如果无符号整形不是随机的话,则每一盘游戏中,电脑获得的坐标获得的坐标都是一样,导致电脑操作过于呆板,让玩家有迹可循。这个时候我们就需要调用时间戳。格式如下
需要注意的是,时间戳只需要在主函数内调用一次便可,如果放在电脑操作函数内可能因玩家操作过快,导致电脑获得的随机数过于接近。
而获得两个随机数肯定是有大于棋盘范围的数存在的,这时我们可以采用求模运算,来获得棋盘范围内的随机数。其他操作与玩家操作相同。具体步骤如下
玩家操作和电脑操作都设置完以后,我们发现我们好像还缺点什么。
5.胜负判断设置
我们总不可能一直落子下去吧,肯定是有胜负关系的。
当率先三子练成一线的一方获得胜利。
倘若棋盘下满,却无人获得胜利,则双方达成平局。
因此,我们还需要一个判断胜负的函数。
数字连成一线可以是一行的三个棋子,也可以是一列的三个棋子,或者是主对角线或副对角线的三个棋子。我们可以通过返回棋子的值来判断该棋子属于玩家还是电脑。
判断(行)
判断(列)
判断(对角线)
而进行判断的前置条件则是棋盘没有下满,故我们还应先设置一个人判断棋盘是否下满的函数
倘若下满后则返回1,未下满则返回0;
故如果在判断胜负的函数内加入
倘若下满后,进入if语句,返回‘Q’,若未下满,则返回‘C’。
到这,我们已经把所有需要的前置工作干完了
6.相关函数的声明,以及对三子棋代码的逻辑排序
首先是对相关函数的声明,定义一个头文件,将相关声明放入。
其次是三子棋代码的逻辑排序首先是主函数
其次是game函数
就这样,一个简单的三子棋代码完成了。
我赢了,老铁们,你们呢?
这是我第一次编写三子棋,并对相关操作和思想进行解释,如果有什么不足或者有什么可以优化的地方,我在这向各位老铁求教,也谢谢各位老铁能看到这里。
https://gitee.com/LJX551126953/c-language(内附三子棋代码)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。