本人码龄仅100多天,在上课期间学习到了三子棋,便想设计一款五子棋,供我和女朋友在自习累的时候玩,(不是炫耀hehe~)
一、整体大纲
游戏一共分为:
1、游戏目录 (包括进入、退出选项)
2、游戏内容,包括一下内容:
2.1棋盘的初始化
2.2棋盘的打印
2.3玩家下棋
2.4判断胜负
二、大概思路
游戏分为三个部分,游戏本体的.c源文件,以及一份.h头文件,和一份供测试用的test.c文件。在整体介绍之前,先简单介绍一下game.h这个头文件。
#include <stdio.h>
#define ROW 10
#define COL 10
//初始化棋盘
void cleanboard(char board[ROW][COL],int row,int col);
//打印棋盘
void displayboard(char board[ROW][COL],int row,int col);
//玩家下棋
void playgame_player1(char board[ROW][COL],int row ,int col);
void playgame_player2(char board[ROW][COL],int row ,int col);
//判断对错
void judge(char board[ROW][COL],int*px);
1.在文件中我先定义了ROW和COL这两个量,定义这两个量的好处在于:方便后续对游戏整体规则的处理,以防去一个一个的查找修改。本次游戏选取了10行(因为太多的话,对于我这一个编程小白来说,测试就太为繁琐了.)
2.关于游戏流程的声明,分别声明了如上图所示的几个函数,包括:初始化棋盘,打印棋盘,玩家下棋(分为玩家一和玩家二),判断对错(这个函数中还包括了几个小函数,稍后指出)
接下来我将对游戏主题内容进行讲解!
3.游戏目录
void mnum()
{
printf("---------------------\n");
printf("----- 1.play -------\n");
printf("----- 2.exit -------\n");
printf("---------------------\n");
}
上图就是一个基本的由printf函数构成的目录,我把他写在了test.c中,没有什么好讲解的。
int main()
{
mnum();//游戏菜单
printf("请输入数字:");
int i = 0;
scanf("%d",&i);
do {
switch (i)
{
case 1:
game();
break;
case 2:
printf("已退出\n");
break;
default:
printf("输入错误,已退出!");
break;
}
} while (i != 2);//当输入2时,循环结束
return 0;
}
上图所示的是游戏的主体测试内容,首先导入游戏菜单,用scanf()函数,获取输入的数字。接下来使用do··while函数进行循环,输入1时,系统会进入game()函数,具体内容会在下面讲解。当输入2的时候,游戏会结束循环,否则就表示输入错误,进行重新输入。
4、游戏内容
4.1棋盘的初始化
void game()
{
char board[ROW][COL] = {0};
//初始化棋盘
cleanboard(board,ROW,COL);
首先在test.c文件中,写入game()函数,其中创建一个数组,用于存放棋子。其中ROW和COL在上文已经说明,在game.h的头文件中已经被定义。
//初始化棋盘
void cleanboard(char board[ROW][COL],int row,int col)
{
int i = 0;
for(i = 0;i < row;i++)
{
int j = 0;
for(j = 0;j < col;j++)
{
board[i][j] = ' ';
}
}
}
接下来是棋盘的初始化,其实非常简单,用双层for函数对这个二维数组进行遍历,将数组内的每一个值赋予’ ‘(空格)。这一部分是为了下一部分,棋盘的打印做好准备。因为假如不复制,则数组中每一个值均为0,棋盘打印后打观感不好。
4.2棋盘的打印
//打印棋盘
void displayboard(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i<row;i++)//每一次循环,打印一个字符行一个分割行
{
//打印字符行
for(j = 0;j<col;j++)
{
printf(" %c ", board[i][j]);//打印字符使用%c
if(j<col-1)//防止多打一次|
printf("|");
}
printf("\n");
//打印分割行
if(i<row-1)//防止多打一次分割行
{
int k = 0;
for ( k = 0; k < col; ++k)
{
printf("---");
if(k<col-1)//防止多打一次|
{
printf("|");
}
}
}
printf("\n");
}
}
这里使用了2次for循环,将棋盘输出,打印到屏幕上,打印的棋盘分为两种:字符行和分割行。第一层for循环,每一次循环,打印一层字符行和一层分割行。
字符行:首先一定要记住,打印字符使用%c,打印字符串使用%s。刚开始测试,花费了大半天不知道什么情况,一只在报错,然后看了好久,才发现我使用的是%s。呜呜呜~打印字符时采取字符两边是空格,每三个字符打印一个竖隔线(|),if语句是防止多打一次竖隔线(|),下面打印分割行也是同理。
分割行:分割行中的for循环中重新定义了一个k,但是本人现在看了觉得没有必要,还是可以使用j这个变量的。首先第一个if语句是防止多打印一层分割行,第二个if语句是防止在每一行分割层多打印一个竖隔符(|)
棋盘打印这个函数要着重处理,因为在游戏进程中要多次调用这个函数,使用要确保万无一失再进行接下来的代码编写。
4.3玩家下棋
//玩家下棋
void playgame_player1(char board[ROW][COL],int row ,int col)
{ //防止错误输入,做循环处理
while (1)
{
printf("一号玩家(#)下棋,请输入所要选择的坐标:(格式示例:1 1)");
int i = 0;
int j = 0;
//玩家输入坐标
scanf("%d %d", &i, &j);
if(i < 1 || i > row || j < 1 || j > col)//进行非法输入判断
{
printf("输入非法,请重新输入!\n");
continue;
}
else
{
if (board[i-1][j-1] == ' ')//对输入数字进行处理,-1,保持数组与外逻辑一致
{
board[i-1][j-1] = '#';
break;
}
else
{
printf("此位置已有棋子,请换位置下棋!\n");
continue;
}
}
}
}
void playgame_player2(char board[ROW][COL],int row ,int col)
{
while (1)
{
printf("二号玩家(*)下棋,请输入所要选择的坐标:(格式示例:1 1)");
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
if(i < 1 || i > row || j < 1 || j > col)//进行非法输入判断,||是或者的意思
{
printf("输入非法,请重新输入!\n");
continue;
}
else
{
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';
break;
}
else
{
printf("此位置已有棋子,请换位置下棋!\n");
continue;
}
}
}
}
现在是第一个主要部分,涉及到玩家下棋的步骤。本人只写了两人对战,没有像别的博主一样写了人机对战的部分。在这个部分我写了两个函数,分别对应玩家一(#)和玩家二(*)。内容是一致的,使用我就挑选其中的玩家一进行讲解。
首先,为了防止错误输出以及棋子的重复占用,在下棋阶段采取了一个死循环,当输入正确的时候break;退出循环。有一个小点需要注意,在外层游戏逻辑与内部数组的逻辑是不同的,一般人是不会觉得坐标是从0开始的,正常逻辑是从1开始,但是数组是从0开始的,所以这里有一个减去1的处理。
4.4判断胜负
判断胜负是这个程序中最重要也是最难的一点,本人是一个编程小白,所以在这一块也是花费了很多脑筋,查阅了很多资料,最终才完成了这一部分。
判断胜负这一部分主要分为四类:竖向判断、横向判断、左上到右下判断、右上到左下判断。我将分别探讨一下这四个部分。
void judge(char board[ROW][COL],int *px)
{
//和棋判断
judge_draw(board,ROW,COL,px);
//判断列
judge_row(board,ROW,COL,px);
//判断行
judge_col(board,ROW,COL,px);
//判断对角(左上到右下)
judge_diagonal_left(board,ROW,COL,px);
//判读对角(右上到左下)
judge_diagonal_right(board,ROW,COL,px);
}
如上图所示,我把这几个判断都单一拿出来进行书写,并且整合到了一个函数中,其中还有一个刚才没有提及到的函数———关于和棋的判断,这个我们最后再讲。
4.4.1判断列
//判断列(|)
void judge_col(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
int count = 0;
for(i = 0;i<row;i++)
{
for(j = 0;j<col;j++)
{
if(board[j][i] == board[j + 1][i] && board[j][i] != ' ' && board[j + 1][i] != ' ')
{
count++;
if(count == 4)
{
char arr = board[j][i];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
else
count = 0;
}
}
}
如上图所示,还是采取了两层for循环的思路,单独设立了一个变量count来记录重复的个数。
首先看到第一个if部分。当循环中出现当前board[i][j]与二维空间中的下一个元素相等时(我们知道二维数组其实不是真正的以二维空间排布的),我们将count加一,继续循环如果下一个元素与其下一个元素再相等时,count再加一。如果不想等,则将count重置为0。继续寻找。当寻找到count == 4时,表示已将找到了5个元素相等并且在同一列上,则进入if语句,创立一个字符变量,接收当前board[i][j]的值,以供后续判断是谁取得了胜利。
注:循环条件中,我已经将' '这个值去掉了,不然程序无法正常执行。
进入到下一个if语句,上面已经提到,当count == 4时,我们进入到判断部分。其中我们新建立的字符变量如果等于第一位玩家的棋子,则打印玩家一获胜。于此同时,我们在主函数中建立了一个整形变量,以供数据的输出。如下图所示。
//玩家下棋
while (1)//死循环构成
{
//一号玩家下棋
playgame_player1(board,ROW,COL);
//打印棋盘
displayboard(board,ROW,COL);
//判定胜负
int arr1 = 0;
judge(board,&arr1);
if(arr1 == 1 || arr1 ==2){
break;
}
else if(arr1 == 0)
{
printf("和棋");
break;
}
我们创建的整形变量主要是用于打破循环以及和棋的输出(稍后将到)。我们通过指针的输出,改变主函数中的变量,记住形式参数不等于实际参数,它只是实际参数的一个copy版本,所以想要改变实际参数,还是要在函数的定义时传入实际变量的指针。
4.4.2判断行
//判断行(——)
void judge_row(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
int count = 0;
for(i = 0;i<row;i++)
{
for(j = 0;j<col;j++)
{
if(board[i][j] == board[i][j + 1] && board[i][j] != ' ' && board[i][j + 1] != ' ')
//对内容进行判断
{
count++;
if(count == 4)//五子棋有4个等式即可
{
char arr = board[i][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;//指针传出数字,以供结束进程,可以是任意数字,这边方便对应所以选择了1和2.以下同理
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
else
count = 0;
}
}
}
判断行的代码与判断列的代码类似,可以根据上面判断列的逻辑来看这一段代码,我在此就不多说了。(少打一些字,偷工减料。)
4.4.3左上到右下的判断
//判断对角(左上到右下)
void judge_diagonal_left(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
for(i = 0;i<row-4;i++)
for(j = 0;j<col-4;j++)
{
if(board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i +2][j + 2] &&
board[i][j] == board[i +3][j + 3] && board[i][j] == board[i + 4][j + 4] &&
board[i][j] != ' ' && board[i + 1][j + 1] != ' ' && board[i + 2][j + 2] != ' ' &&
board[i + 3][j + 3] != ' ' && board[i + 4][j + 4] != ' ')
{
char arr = board[i][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;}
}
}
}
这一段代码可能是最难的地方,关于对角线的查找,我也是苦恼了好久,写了好多版本,但是最终还是屈服在了我的能力不高,在if语句中写死了代码,因此光if的条件写了足足四行。这段代码的主要逻辑就是一下判断一整个对角线上的五个元素,如果相等且不等于' ',我们则进行下一步的判断,在判断的逻辑上和前面的判断列的逻辑相同。这一段还有一点就在于在for循环中要控制i和j的范围,不要超过了二维数组的范围,因此我在循环的过程中将i和j都减少了4.(关于这一段的判定我也写了一个没有那么死的判断方法,逻辑看起来没有问题,但是最后没有实现该有的功能,我会在文章的最后贴出,希望各位大佬指点迷津。)
4.4.4右上到左下的判断
//判读对角(右上到左下)
void judge_diagonal_right(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
for(i = 0;i < row-4 ;i++)
for(j = col-1;j>4;j--)
{
if(board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] &&
board[i][j] == board[i +3][j - 3] && board[i][j] == board[i + 4][j - 4] && board[i][j] != ' ' &&
board[i + 1][j - 1] != ' ' && board[i + 2][j - 2] != ' ' && board[i + 3][j - 3] != ' ' &&
board[i + 4][j - 4] != ' ')
{
char arr = board[i][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
}
和上面的代码一样,这里主要问题可能会出现在两个for循环的条件上,因为我们是从右上角判断到左下角,所以对于i我们是从0开始的,会和上面的逻辑一致。但是对于j我们是从大到小进行循环的,且是要大于4的,防止超过范围,这点上需要多多思考一下,其余的逻辑就和刚刚讲的那个没有什么不同了。
4.4.5和棋部分(补充)
//和棋判断
void judge_draw(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
*px = 0;
for(i = 0;i < row;i++)
{
for(j = 0;j < col;j++)
{
if(board[i][j] == ' ' )
{
*px = 3;
break;
}
}
}
}
这一部分为什么叫补充,因为我忘记在大纲里列出来了,第一写博客,有点不熟悉的地方,希望大家多多包涵。
这一部分我们主要是利用在主函数中创建的变量arr1(这个名字没有什么特殊含义,可能是因为课看多了,所以就直接写上了~~)当判断开始时我们首先要給arr1赋值为0(就是*px = 0),接下来对数组进行遍历,当数组中发现了有' '存在时,我们将arr1赋值为3,结束循环。
接下来对工作主要在主函数中。
judge(board,&arr1);
if(arr1 == 1 || arr1 ==2){
break;
}
else if(arr1 == 0)
{
printf("和棋");
break;
}
如上图所示,假设arr1 == 0时,即在和棋判断时,对数组的遍历没有发现' '即可代表棋盘已经满了,所以此时arr1没有赋值为3,所以打印和棋,游戏结束,停止循环。
注:假如按照我的这个思路来写时,和棋的判断这个小函数一定要在判读胜负这个函数打函数的第一位,如下图所示
void judge(char board[ROW][COL],int *px)
{
//和棋判断
judge_draw(board,ROW,COL,px);
//判断列
judge_row(board,ROW,COL,px);
//判断行
judge_col(board,ROW,COL,px);
//判断对角(左上到右下)
judge_diagonal_left(board,ROW,COL,px);
//判读对角(右上到左下)
judge_diagonal_right(board,ROW,COL,px);
}
如果在下面会导致,某位玩家已经获胜,但是程序没有结束,因为此时在棋盘中还是会存在' ',所以先判断获胜时,系统会打印出某某玩家获胜,然后給arr1赋值为1或者2,但是到和棋判断时,我们首先会给arr1赋值为0,但是棋盘中是有' ',会给arr1重新赋值为3,所以程序不会结束。这一点可以说是我的这个整体程序的缺陷,希望在今后的学习中,可以把这个缺陷补上。
5.源码
5.1 test.c的源码
#include"game.h"
#include "game.c"
void mnum()
{
printf("---------------------\n");
printf("----- 1.play -------\n");
printf("----- 2.exit -------\n");
printf("---------------------\n");
}
void game()
{
char board[ROW][COL] = {0};
//初始化棋盘
cleanboard(board,ROW,COL);
//打印棋盘
displayboard(board,ROW,COL);
//玩家下棋
while (1)//死循环构成
{
//一号玩家下棋
playgame_player1(board,ROW,COL);
//打印棋盘
displayboard(board,ROW,COL);
//判定胜负
int arr1 = 0;
judge(board,&arr1);
if(arr1 == 1 || arr1 ==2){
break;
}
else if(arr1 == 0)
{
printf("和棋");
break;
}
//二号玩家下棋
playgame_player2(board,ROW,COL);
//打印棋盘
displayboard(board,ROW,COL);
//判断胜负
judge(board,&arr1);
if(arr1 == 1 || arr1 == 2){
break;
}
else if(arr1 == 0)
{
printf("和棋");
break;
}
}
}
int main()
{
mnum();//游戏菜单
printf("请输入数字:");
int i = 0;
scanf("%d",&i);
do {
switch (i)
{
case 1:
game();
break;
case 2:
printf("已退出\n");
break;
default:
printf("输入错误,已退出!");
break;
}
} while (i != 2);//当输入2时,循环结束
return 0;
}
5.2 game.c的源码
//
// Created by 石丹阳 on 2023/9/14.
//
#include "game.h"
//初始化棋盘
void cleanboard(char board[ROW][COL],int row,int col)
{
int i = 0;
for(i = 0;i < row;i++)
{
int j = 0;
for(j = 0;j < col;j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void displayboard(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
for (i = 0;i<row;i++)//每一次循环,打印一个字符行一个数字行
{
//打印字符行
for(j = 0;j<col;j++)
{
printf(" %c ", board[i][j]);//打印字符使用%c
if(j<col-1)//防止多打一次|
printf("|");
}
printf("\n");
//打印分割行
if(i<row-1)//防止多打一次分割行
{
int k = 0;
for ( k = 0; k < col; ++k)
{
printf("---");
if(k<col-1)//防止多打一次|
{
printf("|");
}
}
}
printf("\n");
}
}
//玩家下棋
void playgame_player1(char board[ROW][COL],int row ,int col)
{ //防止错误输入,做循环处理
while (1)
{
printf("一号玩家(#)下棋,请输入所要选择的坐标:(格式示例:1 1)");
int i = 0;
int j = 0;
//玩家输入坐标
scanf("%d %d", &i, &j);
if(i < 1 || i > row || j < 1 || j > col)//进行非法输入判断
{
printf("输入非法,请重新输入!\n");
continue;
}
else
{
if (board[i-1][j-1] == ' ')//对输入数字进行处理,-1,保持数组与外逻辑一致
{
board[i-1][j-1] = '#';
break;
}
else
{
printf("此位置已有棋子,请换位置下棋!\n");
continue;
}
}
}
}
void playgame_player2(char board[ROW][COL],int row ,int col)
{
while (1)
{
printf("二号玩家(*)下棋,请输入所要选择的坐标:(格式示例:1 1)");
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
if(i < 1 || i > row || j < 1 || j > col)//进行非法输入判断,||是或者的意思
{
printf("输入非法,请重新输入!\n");
continue;
}
else
{
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';
break;
}
else
{
printf("此位置已有棋子,请换位置下棋!\n");
continue;
}
}
}
}
//判断对错
//判断行(——)
void judge_row(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
int count = 0;
for(i = 0;i<row;i++)
{
for(j = 0;j<col;j++)
{
if(board[i][j] == board[i][j + 1] && board[i][j] != ' ' && board[i][j + 1] != ' ')
//对内容进行判断
{
count++;
if(count == 4)//五子棋有4个等式即可
{
char arr = board[i][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;//指针传出数字,以供结束进程,可以是任意数字,这边方便对应所以选择了1和2.以下同理
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
else
count = 0;
}
}
}
//判断列(|)
void judge_col(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
int count = 0;
for(i = 0;i<row;i++)
{
for(j = 0;j<col;j++)
{
if(board[j][i] == board[j + 1][i] && board[j][i] != ' ' && board[j + 1][i] != ' ')
{
count++;
if(count == 4)
{
char arr = board[j][i];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
else
count = 0;
}
}
}
//判断对角(左上到右下)
void judge_diagonal_left(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
for(i = 0;i<row-4;i++)
for(j = 0;j<col-4;j++)
{
if(board[i][j] == board[i + 1][j + 1] && board[i][j] == board[i +2][j + 2] &&
board[i][j] == board[i +3][j + 3] && board[i][j] == board[i + 4][j + 4] &&
board[i][j] != ' ' && board[i + 1][j + 1] != ' ' && board[i + 2][j + 2] != ' ' &&
board[i + 3][j + 3] != ' ' && board[i + 4][j + 4] != ' ')
{
char arr = board[i][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;}
}
}
}
//判读对角(右上到左下)
void judge_diagonal_right(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
for(i = 0;i < row-4 ;i++)
for(j = col-1;j>4;j--)
{
if(board[i][j] == board[i + 1][j - 1] && board[i][j] == board[i + 2][j - 2] &&
board[i][j] == board[i +3][j - 3] && board[i][j] == board[i + 4][j - 4] && board[i][j] != ' ' &&
board[i + 1][j - 1] != ' ' && board[i + 2][j - 2] != ' ' && board[i + 3][j - 3] != ' ' &&
board[i + 4][j - 4] != ' ')
{
char arr = board[i][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
}
//和棋判断
void judge_draw(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
*px = 0;
for(i = 0;i < row;i++)
{
for(j = 0;j < col;j++)
{
if(board[i][j] == ' ' )
{
*px = 3;
break;
}
}
}
}
void judge(char board[ROW][COL],int *px)
{
//和棋判断
judge_draw(board,ROW,COL,px);
//判断列
judge_row(board,ROW,COL,px);
//判断行
judge_col(board,ROW,COL,px);
//判断对角(左上到右下)
judge_diagonal_left(board,ROW,COL,px);
//判读对角(右上到左下)
judge_diagonal_right(board,ROW,COL,px);
}
5.3 game.h的源码
#include <stdio.h>
#define ROW 10
#define COL 10
//初始化棋盘
void cleanboard(char board[ROW][COL],int row,int col);
//打印棋盘
void displayboard(char board[ROW][COL],int row,int col);
//玩家下棋
void playgame_player1(char board[ROW][COL],int row ,int col);
void playgame_player2(char board[ROW][COL],int row ,int col);
//判断对错
void judge(char board[ROW][COL],int*px);
6.最后
非常感谢各位能够观看我的第一篇博客,希望可以对我进行批评指正。我是一位大三的来自食品科学系的学生,因为准备跨考到计算机,所以学习了计算机的相关课程。我是因为喜欢所以才会选择这个专业,当然工资待遇也不低,我也知道这个专业很卷。路漫漫其修远。让我们一起努力。最后在此感谢各位可以阅读我的文章,感谢各位批评指正,有什么不妥的地方可以留言,我会后续进行更改~
7.附
文章中说到我关于对角线判断中,写了一个灵活性高一点的函数,但是没有成功执行,我贴在此处,希望有大佬分析解答一下。
//判断对角(左上到右下)
void judge_diagonal_left(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
int count = 0;
for(i = 0;i<row-1;i++)
for(j = 0;j<col-1;j++)
{
int k = i;
if(board[k][j] == board[k + 1][j + 1] && board[k][j] != ' ' && board[k +1][j + 1] != ' ')
{
count++;
k++;
if(count == 4)
{
char arr = board[k][j];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
else
count = 0;
}
}
//判读对角(右上到左下)
void judge_diagonal_right(char board[ROW][COL],int row,int col,int*px)
{
int i = 0;
int j = 0;
int count = 0;
for(i = 0;i<row;i++)
for(j = col-1;j>1;j--)
{
int k = i;
if(board[k][j] == board[k + 1][j - 1] && board[k][j] != ' ' && board[k + 1][j - 1] != ' ')
{
count++;
k++;
if(count == 4)
{
char arr = board[j][i];
if(arr == '#'){
printf("玩家一获胜!\n");
*px = 1;
}
else if(arr == '*'){
printf("玩家二胜利!\n");
*px = 2;
}
}
}
else
count = 0;
}
}