经过好多天的编写,五子棋项目总算完成,作为一个学了不是很久的小白,我在编写过程中也遇到了许多困难,但还好都解决了,在此我建议和我一样,是小白的都应该写写五子棋或三子棋,当然,不是全抄别人的代码,也不是一遇到不会的就去找,先思考解决方法,多尝试,即使错了也没关系,实在遇到不会的就进行查询,但查询过后必须要知道原理,怎么写的,为什么这样写,为什么自己想不到,接下来进行代码讲解:
关于五子棋,其实就是个简单的游戏,那么作为游戏,就应该有个基础的框架,开始或结束,我们先来一个游戏框架:
void moshi()
{
printf(" ***-- - 2.玩家对战-- - ***\n");
printf(" ***-- - 3.人机对战-- - ***\n");
printf("PS:输入2进行两玩家间对决,输入其他整数进行人机对决\n");
}
void menu()
{
printf("***---1.开始游戏---***\n");
printf("***---0.退出游戏---***\n");
}
int main()
{
int input = 0;
int a = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
if (input == 1)
{
printf("请选择模式\n");
moshi();
scanf("%d", &a);
game(a);
break;
}
if (input == 0)
{
printf("已退出\n");
break;
}
else
{
printf("输入错误请重新输入\n");
}
} while (input);
return 0;
}
do while循环方便判断游戏是否进行和游戏结束后直接继续,不用再做一次选择
其中的moshi函数是选择模式人机或玩家。
框架搭好后就是引用头文件还有定义行与列
#define _CRT_SECURE_NO_WARNINGS
#define ROW 10
#define COL 10
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
行与列的定义方便修改棋盘,当然我你们也可以让玩家自己输入棋盘大小,将行与列撤出定义用scanf即可实现,下面的两个头文件是电脑走棋用的随机走的头文件,从这其实可以看出这个电脑是个‘傻子’毕竟我修为不够,无法给他设计算法。
做好这一切后接下来就定义game函数用于游戏地进行
void game(int a)//引a用于判断是人机还是玩家
{
char board[ROW][COL];
initboard(board, ROW, COL);//初始化棋盘
displayboard(board, ROW, COL);//打印棋盘
if (a == 2)
{
while (1)//玩家间对决
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);//每走一步打印一次棋盘才知道走了哪
full(board, ROW, COL);//平局判定
char ping = full(board, ROW, COL);
if (ping =='o');
break;
win(board, ROW, COL);//赢家判定
char winer = win(board, ROW, COL);
if (winer == 1)//玩家一获胜返回1
continue;//如果一赢就跳出下半段从while循环开始
printf("先行后列\n");
playertwomovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
if (ping == 'o');
break;
win(board, ROW, COL);
if (winer == 1)
continue;//同理
}
}
else
{
while (1)//人机对决
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
char ping = full(board, ROW, COL);
if (ping == 'o');
break;
pcwin(board, ROW, COL);
char pcwiner = pcwin(board, ROW, COL);
if (pcwiner == 3)
continue;
printf("先行后列\n");
computermovie(board, ROW, COL);
displayboard(board, ROW, COL);
full(board, ROW, COL);
if (ping == 'o');
break;
pcwin(board, ROW, COL);
if (pcwiner == 4)
continue;//与上述同理
}
}
}
大致以定好,当然不可能第一次就能写出完整步骤,根据自己所写对此函数进行补充,接下来就是棋盘,先初始化棋盘,而后对棋盘进行打印。
void initboard(char board[ROW][COL], int row, int clo)//棋盘初始化,防止打印的棋盘空格处出现乱码
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
void displayboard(char board[ROW][COL], int row, int col)//打印棋盘,先了解棋盘结构,采用for循环嵌套打印,嵌套两个小的for循环(两个小的for循环共同构成了棋盘中的一行
{
int lie = 0;
int hang = 0;
int i = 0;
int j = 0;
printf("0");
for (lie = 1; lie <= col; lie++)//打印每一列的序号
{
if (lie + 1 < 10)
printf(" %d ", lie);//此处为空格空格%d空格(依据棋盘每个格子占四列)
if (lie + 1 > 9)
printf(" %d", lie);//大于10时一个数占两格
}
printf("\n");//对以上整体进行换行,是它能在棋盘上方
for (i = 0; i < row; i++)
{
if (i + 1 < 10)
printf("0%d", i + 1);//打印每行序号因为大于10会出现格子错乱所以用01 02 这类形式
if (i + 1 > 9)
printf("%d", i + 1);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//初始化起作用,能准确定位,方便棋盘的打印
//if(j<col-1)
printf("|");//打印出棋盘第一行的一半
}
printf("\n");//此处换行是为在行的下标仍为0的情况下能使其与第一行的下一半组合,否则会全在这一行中
printf(" ");
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
//if(j<col-1) //两个if语句可有可无,主要看棋盘设计,无if更顺眼
printf("|");//打印出棋盘第一行的下半部分,棋盘第一行完成 且行下标为0,因为仍处于大for循环中i=0中
}
printf("\n");//继续换行,防止大的for循环进行下一次循环时与此次成一行
}
}
此处打印出的棋盘有行列对应的数字,但我的棋盘仅限于1-99,实际可以更多,但要对棋盘的行进行改动,如果非要防止这种改动,可以把行对应数打印在表格右侧,这样便能实现,我就不改了,要改的话就留给你们自己练习了,其实我一开始是考虑在整个棋盘不变的情况下做行对应数,但并未成功,所以在函数内部进行修改,知道怎么弄的大佬可以在评论区留下方法。
接下来就是玩家一,玩家二与电脑的移动了,玩家一我们用'*',玩家二与电脑我们用‘#’
void playeronemovie(char board[ROW][COL], int row, int col)
{
printf("玩家一请下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
{
if (board[x - 1][y - 1] == ' ')//说明此点未下棋
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("被占用,请重输\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
void playertwomovie(char board[ROW][COL], int row, int col)
{
printf("玩家二请下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
{
if (board[x - 1][y - 1] == ' ')//说明此点未下棋,减一是因为是下标,很容易忽略
{
board[x - 1][y - 1] = '#';
break;
}
else
{
printf("被占用,请重输\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
void computermovie(char board[ROW][COL],int row,int col)
{
printf("电脑下\n");
int x = rand()%10;
int y = rand()%10;//余数只能取到一到九,此处也是不会算法的锅
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
电脑下棋相比玩家要简单,只要棋盘有空处就会随机下,不会下到无空处或者是棋盘外。
判断输赢,我个人写的这个步骤较为繁琐,因为有两个模式(人机与玩家间),所以输赢写两个函数,但实际写一个就行,另一个照着第一个修改局部就行
char win(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++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //一列五个
board[i][j] == board[i+1][j]
&& board[i+1][j] == board[i+2][j]
&& board[i+2][j] == board[i+3][j]
&& board[i+3][j] == board[i+4][j]
&& board[i+4][j] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五个
board[i][j] == board[i+1][j + 1]
&& board[i+1][j + 1] == board[i+2][j + 2]
&& board[i+2][j + 2] == board[i+3][j + 3]
&& board[i+3][j + 3] == board[i+4][j + 4]
&& board[i+4][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五个
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}//玩家一获胜情况结束,玩家二也是如此 修改符号即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //一列五个
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五个
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五个
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}//玩家二获胜情况结束
}
}
}
char pcwin(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++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //一列五个
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五个
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五个
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}//玩家一获胜情况结束,玩家二也是如此 修改符号即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //一列五个
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五个
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五个
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}//电脑获胜情况结束
}
}
}
一方胜后要初始化棋盘,否则任然会在获胜的棋盘中进行下一轮,这个判断输赢的方法很繁琐,但很明显,因为暂时没想到其他方法。
有输有赢当然也有平局啦,所以我们要写一个判断平局的函数。
void game(int a)
{
char board[ROW][COL];
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
int ping = 0;
if (a == 2)
{
while (1)
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
win(board, ROW, COL);
char winer = win(board, ROW, COL);
if (winer == 1)
continue;
printf("先行后列\n");
playertwomovie(board, ROW, COL);
displayboard(board, ROW, COL);
win(board, ROW, COL);
if (winer == 1)
continue;
ping++;
if (ping == ROW * COL / 2)
{
printf("平局");
break;
}
}
}
else
{
while (1)
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
pcwin(board, ROW, COL);
char pcwiner = pcwin(board, ROW, COL);
if (pcwiner == 3)
continue;
printf("先行后列\n");
computermovie(board, ROW, COL);
displayboard(board, ROW, COL);
pcwin(board, ROW, COL);
if (pcwiner == 4)
continue;
ping++;
if (ping ==ROW*COL/2)
{
printf("平局");
break;
}
}
}
}
将平局套用进去棋盘中的棋格必定为偶数,所以双方下一轮判定一次,当到棋盘棋格数的一半轮数时棋盘下满。
所有的小部分都在这,接下来发整体。
#define _CRT_SECURE_NO_WARNINGS
#define ROW 10
#define COL 10
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
void initboard(char board[ROW][COL], int row, int clo)//棋盘初始化,防止打印的棋盘空格处出现乱码
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
void displayboard(char board[ROW][COL], int row, int col)//打印棋盘,先了解棋盘结构,采用for循环嵌套打印,嵌套两个小的for循环(两个小的for循环共同构成了棋盘中的一行
{
int lie = 0;
int hang = 0;
int i = 0;
int j = 0;
printf("0");
for (lie = 1; lie <= col; lie++)//打印每一列的序号
{
if (lie + 1 < 10)
printf(" %d ", lie);//此处为空格空格%d空格(依据棋盘每个格子占四列)
if (lie + 1 > 9)
printf(" %d", lie);//大于10时一个数占两格
}
printf("\n");//对以上整体进行换行,是它能在棋盘上方
for (i = 0; i < row; i++)
{
if (i + 1 < 10)
printf("0%d", i + 1);//打印每行序号因为大于10会出现格子错乱所以用01 02 这类形式
if (i + 1 > 9)
printf("%d", i + 1);
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);//初始化起作用,能准确定位,方便棋盘的打印
//if(j<col-1)
printf("|");//打印出棋盘第一行的一半
}
printf("\n");//此处换行是为在行的下标仍为0的情况下能使其与第一行的下一半组合,否则会全在这一行中
printf(" ");
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
//if(j<col-1) //两个if语句可有可无,主要看棋盘设计,无if更顺眼
printf("|");//打印出棋盘第一行的下半部分,棋盘第一行完成 且行下标为0,因为仍处于大for循环中i=0中
}
printf("\n");//继续换行,防止大的for循环进行下一次循环时与此次成一行
}
}
void playeronemovie(char board[ROW][COL], int row, int col)
{
printf("玩家一请下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
{
if (board[x - 1][y - 1] == ' ')//说明此点未下棋
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("被占用,请重输\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
void playertwomovie(char board[ROW][COL], int row, int col)
{
printf("玩家二请下");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性
{
if (board[x - 1][y - 1] == ' ')//说明此点未下棋,减一是因为是下标,很容易忽略
{
board[x - 1][y - 1] = '#';
break;
}
else
{
printf("被占用,请重输\n");
}
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
void computermovie(char board[ROW][COL],int row,int col)
{
printf("电脑下\n");
int x = rand()%10;
int y = rand()%10;
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
char win(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++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //一列五个
board[i][j] == board[i+1][j]
&& board[i+1][j] == board[i+2][j]
&& board[i+2][j] == board[i+3][j]
&& board[i+3][j] == board[i+4][j]
&& board[i+4][j] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五个
board[i][j] == board[i+1][j + 1]
&& board[i+1][j + 1] == board[i+2][j + 2]
&& board[i+2][j + 2] == board[i+3][j + 3]
&& board[i+3][j + 3] == board[i+4][j + 4]
&& board[i+4][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}
if ( //斜五个
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 1;
}//玩家一获胜情况结束,玩家二也是如此 修改符号即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //一列五个
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五个
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}
if ( //斜五个
board[i][j] == board[i - 1][j - 1]
&& board[i - 1][j - 1] == board[i - 2][j - 2]
&& board[i - 2][j - 2] == board[i - 3][j - 3]
&& board[i - 3][j - 3] == board[i - 4][j - 4]
&& board[i - 4][j - 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 2;
}//玩家二获胜情况结束
}
}
}
char pcwin(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++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //一列五个
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五个
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}
if ( //斜五个
board[i][j + 4] == board[i + 1][j + 3]
&& board[i + 1][j + 3] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 1]
&& board[i + 3][j + 1] == board[i + 4][j]
&& board[i + 4][j] == '*'
)
{
printf("玩家一获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 3;
}//玩家一获胜情况结束,玩家二也是如此 修改符号即可
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if ( //一行五个
board[i][j] == board[i][i + 1]
&& board[i][j + 1] == board[i][j + 2]
&& board[i][j + 2] == board[i][j + 3]
&& board[i][j + 3] == board[i][j + 4]
&& board[i][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //一列五个
board[i][j] == board[i + 1][j]
&& board[i + 1][j] == board[i + 2][j]
&& board[i + 2][j] == board[i + 3][j]
&& board[i + 3][j] == board[i + 4][j]
&& board[i + 4][j] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五个
board[i][j] == board[i + 1][j + 1]
&& board[i + 1][j + 1] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j + 3]
&& board[i + 3][j + 3] == board[i + 4][j + 4]
&& board[i + 4][j + 4] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}
if ( //斜五个
board[i][j+4] == board[i +1][j + 3]
&& board[i + 1][j - 3] == board[i + 2][j + 2]
&& board[i + 2][j + 2] == board[i + 3][j +1]
&& board[i + 3][j + 1] == board[i + 4][j ]
&& board[i + 4][j] == '#'
)
{
printf("玩家二获胜\n");
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
return 4;
}//电脑获胜情况结束
}
}
}
void game(int a)
{
char board[ROW][COL];
initboard(board, ROW, COL);
displayboard(board, ROW, COL);
int ping = 0;
if (a == 2)
{
while (1)
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
win(board, ROW, COL);
char winer = win(board, ROW, COL);
if (winer == 1)
continue;
printf("先行后列\n");
playertwomovie(board, ROW, COL);
displayboard(board, ROW, COL);
win(board, ROW, COL);
if (winer == 1)
continue;
ping++;
if (ping == ROW * COL / 2)
{
printf("平局");
break;
}
}
}
else
{
while (1)
{
printf("先行后列\n");
playeronemovie(board, ROW, COL);
displayboard(board, ROW, COL);
pcwin(board, ROW, COL);
char pcwiner = pcwin(board, ROW, COL);
if (pcwiner == 3)
continue;
printf("先行后列\n");
computermovie(board, ROW, COL);
displayboard(board, ROW, COL);
pcwin(board, ROW, COL);
if (pcwiner == 4)
continue;
ping++;
if (ping ==ROW*COL/2)
{
printf("平局");
break;
}
}
}
}
void moshi()
{
printf(" ***-- - 2.玩家对战-- - ***\n");
printf(" ***-- - 3.人机对战-- - ***\n");
printf("PS:输入2进行两玩家间对决,输入其他整数进行人机对决\n");
}
void menu()
{
printf("***---1.开始游戏---***\n");
printf("***---0.退出游戏---***\n");
}
int main()
{
int input = 0;
int a = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d", &input);
if (input == 1)
{
printf("请选择模式\n");
moshi();
scanf("%d", &a);
game(a);
break;
}
if (input == 0)
{
printf("已退出\n");
break;
}
else
{
printf("输入错误请重新输入\n");
}
} while (input);
return 0;
}
此代码共509行,由于技术不够,只能行数来凑,对于目前的我是个大工程,耗时也长,但做出来还是挺开心的,都看到这了,来个三连吧,求求了,后面可能还会写个扫雷,当然耗时也会很长。