下面简介如何使用c语言的基础语法实现三子游戏的底层逻辑:
首先是菜单模块
使用switch语句进入游戏模块
前置交互完成,开始进入游戏函数。
第一部分棋盘创建,使用二维数组实现。
a.初始化棋盘
为什么要使用初始化棋盘
因为 char Board[ROW][COL] = { 0 };呈现的图像如下:
初始化后将该数组开栈,呈现效果如下:
每个空格内部均是char类型,有四个字节空间大小,不可认为只能存储一个字符。(使用for循环的过程可以视为是乘法,外层循环三次,内部循环三次,相乘就是九个单元啦!)
数组空间创建完成后就可以对其进行棋盘写入了。(for循环嵌套if语句进行实现)
因为实际上打印字符行和分割行是同时的,所以共用同一个外循环,因为分割行比字符行少一行,所以使用if语句限制。
呈现效果如下:
实现后棋盘之后就可以进行下棋啦!
下面实现玩家下棋的步骤:
代码如下
void player_move(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf("please enter you want:>");//提示用户开始输入;
scanf("%d,%d", &i, &j);//用户输入自己想要的坐标;
if (i >= 1 && i <= row && j >= 1 && j <= col)//限制条件:1.判断横坐标是否合法;2.判断纵坐标是否合法;
{
if (board[i - 1][j - 1] == ' ')//如果一二条件合理,进入条件三进行判断,该坐标是否为空,如果为空即可进行写入;
{
board[i - 1][j - 1] = '*';//写入玩家的坐标,写入时注意,语法规定数组的计数方式从0开始计入,而玩家录入数据时是从1开始计数,所以要对进行减一处理;
}
else
{
printf("This position is ocupptated!\n");//如果数据不为空则提示玩家该空格已被占用;
}
}
else
{
printf("The putting is null,please input agian:>\n");//如果不能满足条件一二,不会跳入嵌入的if语句,而是直接跳出。
}
至此玩家下棋过程完成,接下来就是电脑下棋。
-----------------------------------------------------分割行-----------------------------------------------------------
电脑下棋主要有两个步骤:1.随机生成合理坐标;2.赋值。
具体代码如下:
void computer_move(char board[ROW][COL], int row, int col)
{
int i, j;
printf("computer's turn!\n");//提示该环节为电脑回合;
while (1)
{
srand((unsigned int)(time(NULL)));//使用时间戳生成随机数用unsigned类型转化为非负数。
i = rand() % ROW;//确保横向坐标合理;
j = rand() % COL;//确保纵向坐标合理;
if (board[i][j] == ' ')判断生成坐标是否为空;
{
board[i][j] = '#';//在合法坐标录入棋子;
break;//确保坐标合法后跳出循环;
}if语句括号;
}//while循环括号;
}//函数大括号;
电脑下棋完成;
--------------------------------------------分割行-------------------------------------------------
在每轮对弈之后都应判断一次游戏是否结束,而三子棋的游戏规则是,某玩家的三颗棋子横向、纵向、或者对角线相同,且该字符不为空,由于这只是个简易的棋盘,我们只要对上述的规则需求进行简单抽象即可;
代码如下:
char judge_who_win(char board[ROW][COL], int row, int col)//判断胜负;//函数的返回类型设置为“char”,返回类型断定为字符型,“()”内部为数组传参;
{
int i = 0;
int j = 0;
for (i = 0; i < col; i++)//使用for循环对纵向坐标进行推进;
{
if (board[0][i] == board[1][i] &&board[1][i] == board[2][i] && board[0][i] !=' ')//采用枚举的方法罗列出横向坐标;
{
return board[0][i];//满足条件一横向棋子的类型均相同,返回该棋子类型,跳出判定环节;
}
}
for (j = 0; j < row; j++)//同理,使用for循环对纵列进行推进;
{
if (board[j][0] == board[j][1] && board[j][1] == board[j][2] && board[j][0] != ' ')//枚举纵向坐标,并且判断棋子类型是否相等;
{
return board[j][0];//返回字符;
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//由于侧向赢得的情况只有两种,且棋盘较为基础,进行数字枚举即可,不需使用数学方法进行归纳输出;(此类为由左上推进至右下;
{
return board[0][0];//返回字符类型;
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')//该种状态为由左下推进至右上;
{
return board[0][2];//返回类型;
}
int a = judge_full(board, row, col);//如果上述判断输赢的指定没有执行,即说明游戏没有结束或者结果为平局,嵌套一个函数来对以上逻辑进行机械翻译;
/*
int judge_full(char board[ROW][COL], int row, int col)//判断棋盘是否满了,即游戏是否平局;
{
int y = 0;
for (y = 0; y < row; y++)//依然嵌套两个for循环;
{
int x= 0;
for (x = 0; x < col; x++)
{
if (' ' != board[x][y])依次判定棋盘的每个坐标上是否为空;
{
return 0;//如果为空返回值就为0,所以这个函数的返回类型为整形;
}
}
}
return 1;//如果坐标全部不为空,即返回0;
} */
if (a == 0)
{
return 'C';
}
return 'Q';
}
//至此该游戏的核心逻辑已经用简单的c语言呈现啦!快来对其进行拼装吧!
-------------------------------------------分割行-------------------------------------------------------
//game函数内,各个模块代码的运行:
//代码呈现:
void game()
{
char Board[ROW][COL] = { 0 };//创建数组为开创棋盘提供空间;
int row = 0;
int col = 0;
init_board(Board, ROW, COL);//初始化棋盘。
creat_board(Board, ROW, COL);//打印棋盘。
char a;
while (1)
{
player_move(Board, ROW, COL);//玩家下棋;
creat_board(Board, ROW, COL);//呈现玩家下棋结果;
a = judge_who_win(Board, ROW, COL);
if (a != 'C')//判断游戏是否继续;
{
printf("Peaceful!");
break;
}
printf("\n");
computer_move(Board, ROW, COL);//如果游戏继续电脑进行下棋;
creat_board(Board, ROW, COL);//呈现电脑下棋结果;
printf("\n");
}
if (a == '#')
{
printf("Computer wins\n");
break;
}
if (a == '*')
{
printf("You are winner\n");
break;
}
if (a == 'Q')
{
printf(" No one win,No one lose\n");
break;
}
}//至此对游戏的分装也就结束了,让我们回到主函数对游戏进行包装!
代码如下呈现:
int main(void)
{
srand((unsigned int)(time(NULL)));//使用时间戳生成随机数用unsigned类型转化为非负数。
int input = 0;
char Board[ROW][COL] = { 0 };
//menu();
do//先玩一次再说;
{
menu();//呈现菜单,玩家决定是否进入游戏;
printf("Please enter your chiose:>\n");
scanf("%d", &input);
switch (input)
{
case 1://显示游戏开始;
printf("Begianing!\n");
game();//进入游戏核心过程;
break;
case 2://再见!
printf("GOOD GAME!\n");
break;
default:
printf("Please input again!\n");//这是一个有个性的玩家!
}
//break;
} while (input);
return 0;
}
自此我们使用了简单的代码语句完成了三子棋游戏的构造,c语言确实是一种神奇的语言!对逻辑的呈现,我相信你一定可以!让我们一起加油!
tips:开源代码存在gitee账户中,地址如下:工作台 - Gitee.com.
感谢阅读!