一:三子棋
1.游戏的基本开始流程()
首先肯定是main函数的创建:
test.c:
1. int main() 2. { 3. test(); 4. return 0; 5. }
这里我们为了使其看起来简单就把后续的流程用test函数去接收
test.c:
//这是我们刚才的test函数 void test() { //这里我们创建input 来接收我们刚开始要去选择的值 int input = 0; //我们进来后就可以打印一个菜单,告诉玩家有哪些选项 menu(); //对于游戏开始,我们可以使用do while循环(先使用,后判断),因为只要玩家 //点击进来就一定要进行选择。 //这整个就是一个最初始的模板,大家一定要记住哈! //这样以后自己去写的话思路就很清晰,只有自己思路清晰了才能写出好的代码,当然出BUG的 //概率也会小很多哈!别一杯茶一支烟,一个BUG一整天哈哈!(前两天体验过了QAQ) do { printf("请选择:\n"); scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); game(); break; //这个case 0 为退出大家最好以后就这么规定,为什么看下面的补充 case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新选择\n"); break; } //接上,因为如果input==0,我们想要退出时输入0,上面会打印退出游戏, //但真正要退出游戏还是要看while()里面的值是否为0,但如果我们把input //传进while()里面,当我们输入0时 while循环判断为假,就真正的退出循环也就 //是退出游戏了哈!所以大家记住这两点哈,1是case: 0退出游戏 //2是while()里面放input。 } while (input); }
以上就是对于大部分游戏的基本流程,接下来我们来进行补充。
2.三子棋的实现
开始之前,我先为大家说明,当我们实现较为复杂的代码时,我们一般会创建三个项目,以我们这个游戏为例,我们就创建了 test.c game.c game.h,前面的是我们测试代码的地方,后面两个合起来为游戏的实现。
好的接下来我们正式开始:
有了上面的游戏基本流程,就到了游戏的实现,我们还是要先有一个思路,要知道我们要干什么,怎么干是后面的事情,重点思路还是要清晰。
这个三子棋的样子我先给大家展示:
可以知道我们游戏实现的思路大致为5点:
1.初始化棋盘
2.打印棋盘
3.玩家下棋
4.电脑下棋
5.判断
2.1第一步写出基本流程
test.c:
void test() { int input = 0; menu(); do { printf("请选择:\n"); scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新选择\n"); break; } } while (input); }
2.2第二步打印菜单
这个里面就自己设计就行,但是最好遵循我上面说的两点:
test.c:
void menu() { printf("**********************************\n"); printf("****** 1.play ******\n"); printf("****** 2.exit ******\n"); printf("**********************************\n"); }
2.3游戏的实现
这里提一点,我们用#define来定义 ROW(行)和COL(列),因为这样我们可以更好地去维护我们的代码,后期想要改成更大的棋盘直接改这两个值就可以了,而且对于写的较多代码的实现,我们尽可能去用有意义的值去定义他们,以便于提升代码的阅读能力。
test.c:
void game() { char Board[ROW][COL] = { 0 }; //初始化棋盘 InitBoard(Board, ROW, COL); //打印棋盘 DisplayBoard(Board, ROW, COL); //下棋 while (1) { //玩家下棋 * printf("玩家下棋:\n"); Player_move(Board, ROW, COL); DisplayBoard(Board, ROW, COL); //电脑下棋 # printf("电脑下棋\n"); Computer_move(Board, ROW, COL); DisplayBoard(Board, ROW, COL); }
当然写到这里了就少不了函数的声明,前面我们说了,我们要把函数的声明放在一个叫做game.h的头文件当中,这里我就直接把所有的代码发出来了防止大家代码太多搞混:
game.h:
#pragma once //上面这行大家不用管哈,等文件操作部分会讲,但是可以提一下这个的意思就是当有两个一样的 //头文件被声明时就只会保留一个就这个意思哈! #define ROW 3 #define COL 3 //这是刚刚定义的行和列 #include<stdio.h> #include<stdlib.h> #include<time.h> //对于函数的名称大家可以发现都是有特殊意义的,这是很重要的哈!不然写完了自己不知道写的什么 //别人也不知道那就尴尬了哈! //初始化棋盘声明 void InitBoard(char Board[ROW][COL],int row,int col); //打印棋盘声明 void DisplayBoard(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 Is_win(char Board[ROW][COL], int row, int col); //平局声明 int Is_full(char Board[ROW][COL], int row, int col);
然后提一下,这里我们传的参数都是数组和他的行数和列数
还有这路的row和col都是小写并不是大写是因为大写的已经被定义了,我们不能重复使用因为他们根本就不是一个东西,还有个很重要的原因就是接收的行参一定要是变量!这里的大写已经被定义为常量了所以一定不能传过去
再然后就是接收数组或者常数的时候在前面要加上类型名,后面用 “;” 结尾,还有不用写返回类型,因为是函数的声明(只告诉程序有这么个函数),返回类型在函数的定义里面写,然后函数的定义是写在game.c里面的。