
所谓三子棋游戏就是生成一个3*3的表格,共计9个格子,玩家/电脑轮流往格子里落子,当任意三个格子的棋能够连成一条直线时,判定为获胜,也就是说共有行、列、斜边三种获胜方式。那么我们怎样利用C/C++实现这个游戏呢?下面是我梳理的思路:
我将使用两个源文件和一个头文件实现这个代码,两个源文件分别为My_Three_chess.c、My_game.c,头文件是My_game.h。
(现在介绍的思路顺序对应着待会的代码顺序,方便查看)
My_Three_chess.c:这个源文件中包含了主函数main、游戏实现函数game,主函数main中包含了游戏实现函数game和游戏菜单打印函数menu,而游戏函数game中包含了数组定义char board、数组初始化Rec_board、棋盘打印Put_board、玩家落子Player_Move、电脑落子Computer_Move、判定胜负条件It_Win等函数,这一堆函数用于实现游戏运行的各种需求,值得一提的是main函数中还包含了一个随机数生成函数stran((unsigned int)time(NULL)),通过当前时间生成随机数帮助电脑落子。
My_game.c这个是游戏函数game中各种函数实现的源文件,里面包含了game中各种需求代码的具体实现方式,同时也是这个工程中代码量最多的地方
My_game.h这个头文件就像是一座桥,让My_Three_chess.c和My_game.c能够顺利联系,实现代码互通,让My_Three_chess.c能够成功调用到My_game.c中的各种函数,而且这个头文件还起到了声明的作用,能够轻而易举的定义或改变一个全局变量,各种函数就存放在其中。
## 下面就是具体的实现代码 My_Three_chess.c:#define _CRT_SECURE_NO_WARNINGS 1//一段神奇的代码,可以有效避免 “4996” scanf 问题
#include"My_game.h"
//调用My_game.h这个头文件,因为里面包含了stdio.h这个头文件,所以调用它就是在调用stdio.h,类似于嵌套调用
//三子棋
void game()
{
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|
}//游戏本体函数
int main() {
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
}
My_game.c:#define _CRT_SECURE_NO_WARNINGS 1//一段神奇的代码,可以有效避免 “4996” scanf 问题
#include"My_game.h"
void menu()
{
| 1 2 3 4 5 |
|
}//菜单函数的实现,简单打印一个选择页面
void Rec_board(char board[ROW][COL], int row, int col)
{
| 1 2 3 4 5 6 7 8 9 |
|
}//初始化数组的实现
void Put_board(char board[ROW][COL], int row, int col)
{
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
}//打印棋盘函数的实现
void Player_Move(char board[ROW][COL], int row, int col)
{
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
}//玩家回合落子实现
void Computer_Move(char board[ROW][COL], int row, int col)
{
| 1 2 3 4 5 6 7 8 9 10 11 12 |
|
}//电脑回合落子实现
int IsFull(char board[ROW][COL], int row, int col)
{
| 1 2 3 4 5 6 7 8 9 10 11 12 |
|
}//判断棋盘是否已满
char It_Win(char board[ROW][COL], int row, int col)
{
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
}
//是不是感觉很冗长,没错,我昨天写的时候也是这样想的
My_game.h:#pragma once//这个是创建这个头文件时自带的
#include
#define ROW 3//define直接进行定义,全局使用
#define COL 3//同上,主要用途就是更改棋盘的大小
#include
#include
void menu();//打印菜单
void Rec_board(char board[ROW][COL], int row, int col);//初始化棋盘
void Put_board(char board[ROW][COL], int row, int col);//打印棋盘
void Player_Move(char board[ROW][COL], int row, int col);//玩家回合
void Computer_Move(char board[ROW][COL], int row, int col);//电脑回合
char It_Win(char board[ROW][COL], int row, int col);//判断输赢
int IsFull(char board[ROW][COL], int row, int col);//判断满缺
以上就是所有代码的实现,肯定有很多同学跟我一样迫不及待想看效果,下面就是!
这个是选择菜单界面,只有1跟0有效,否则就会提示输入错误
这个是棋盘的打印,现在只是一个3*3的小棋盘,其实我们可以通过修改My_game.h这个头文件中的ROW和COL来分别控制输出行跟列,这就是我前面说的头文件可以轻而易举改变全局变量
下棋界面大概就是这么个样子
第一把大意了就输给了电脑......
一雪前耻,成功打败电脑(其实这个电脑不是很聪明,可以很容易就胜利)
这就是第三种情况,和棋(这个比让电脑赢还难)
写在最后三子棋这个小游戏本质上就是通过不断修改二维数组中的元素来达成胜利条件,代码量不是很大,很适合初学者,然后这个游戏的实现方式也能让初学者学到很多干货,for、if、switch、while多种循环都有体现,如果你想写出年轻人的第一个小游戏,选它就对了!
细心的读者不难发现,我在文中说过,可以通过更改ROW和COL实现各种尺寸棋盘的打印,那么我们是否可以不再局限于三子棋,尝试更高级的五子棋呢?答案是可以,但目前我这个代码无法实现,因为棋盘更改很容易,但我在三子棋中三子相连的判定条件不易更改,所以如果有需要的小伙伴可以尝试着去改变It_Win这个函数,实现下棋自由!
鸣谢感谢比特鹏哥的教导,让我学会了三子棋!
感谢比特波哥的纠正,解决了困扰我许久的小细节!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)