前言
提示:经过b站和视频学习后编程
提示:以下是本篇文章正文内容,下面案例可供参考
文章目录
五子棋
本篇博客主要写了关于c语言的五子棋代码
思路:
五子棋我们可以将代码分成棋盘和棋子两大部分,理所当然的,我们需要知道棋子下棋的位置和棋盘的大小。然后在五子棋中,我们是每下完一次棋便需要进行一次胜负的判定虽然在生活当中,在五子棋刚开始我们不会去思考胜负,但下到后面,我们仔细想想,我们是不是每下一次棋,便会思考胜负。当然,在回过头去想,对于编程来说,下棋的位置也需要进行思考
头文件
因为是一个小程序,所以我并没有写在头文件中,而是和源文件放在一起,方便修改
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define Player1 1//这里表示游戏的三种情况:玩家1胜,玩家2胜,游戏继续
#define Player2 2
#define next 3
#define ROW 11//棋盘大小
#define COL 11
因为 我已注释,便不过多赘述
展示棋盘(display)
我是选择先做棋盘的展示,这样才会方便我之后写代码进行验证
因为我是喜欢从1开始计算,所以我让x和y从1开始计数
⭐注意:这里的x,y并不是全局变量中的x,y。对于函数来说,当名字重复时,会优先使用本函数内的变量,而不是全局变量的x,y
然后对于玩家1则用&表示,而玩家2则用*表示
void display(int board[][COL],int row,int col){//此函数用来展示棋盘
int x;
printf("\t");
for (x = 1; x < row; x++) {
printf("%d\t", x);
}
printf("\n");
for (x = 1; x < row; x++) {
int y = 1;
printf("%d\t", x);
for (; y < row; y++) {
if (board[x][y] == Player1)
printf("&\t");
else if (board[x][y] == Player2)
printf("*\t");
else
printf("#\t");
}
printf("\n");
}
}
下棋(PlayMove)
在进行下棋代码前,我先展示了一下棋盘是否能成功,再进行下棋函数
我们需要把棋盘这个二维数组进行传入,然后who表示当前下棋的玩家,而who2是我为了避免棋盘上,若已有棋子,则无法在此位置上下棋
这里需要while进行循环,直到下棋成功(为了避免棋子越界或犯规)
void PlayMove(int board[][COL],int row,int col,int who,int who2) {
//第一个who是来表示当前下棋的人,第二个who是避免在已有棋子的位置下棋
while (1) {
printf("玩家%d走:", who);
scanf("%d%d", &x, &y);//这里的x,y是全局变量,用来获取下棋的位置
if (x >= 1 && x < row && y >= 1 && y < col) {//不能越界
if (board[x][y] != who && board[x][y] != who2) {
board[x][y] = who;
break;
}
else
printf("位置已占!\n");
}
else
printf("不在范围内!\n");
}
}
主体函数(game)
首先开辟棋盘的内存,并展示棋盘,然后在while循环内进行下棋,展示棋盘
由于每次下完棋后必须要进行胜负判断,所以紧接Isover函数,只有Isover返回Player1或Player2时,才可以退出循环,并显示结果
void game() {//game函数是主体函数
int board[ROW][COL];//定义棋盘大小
memset(board, ROW, COL);//给棋盘开创内存
int result = next;
display(board, ROW, COL);
while (1) {
PlayMove(board,ROW,COL,Player1,Player2);//先玩家1走,再展示棋盘,在进行胜负判定,最后再返回结果
display(board, ROW, COL);
result = Isover(board, ROW, COL, Player1);
if (result != next)//若result为next,则游戏继续,若不是next,则退出循环,返回结果
break;
PlayMove(board, ROW, COL, Player2,Player1);
display(board, ROW, COL);
result = Isover(board, ROW, COL, Player2);
if (result != next)
break;
}
printf("胜利者是Player%d",result);
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define Player1 1//这里表示游戏的三种情况:玩家1胜,玩家2胜,游戏继续
#define Player2 2
#define next 3
#define ROW 11//棋盘大小
#define COL 11
int x = 0;//全局变量x,y,用来确定当前下棋的位置
int y = 0;
void display(int board[][COL],int row,int col){//此函数用来展示棋盘
int x;
printf("\t");
for (x = 1; x < row; x++) {
printf("%d\t", x);
}
printf("\n");
for (x = 1; x < row; x++) {
int y = 1;
printf("%d\t", x);
for (; y < row; y++) {
if (board[x][y] == Player1)
printf("&\t");
else if (board[x][y] == Player2)
printf("*\t");
else
printf("#\t");
}
printf("\n");
}
}
int Isover(int board[][COL],int row,int col,int who) {//此函数用来判断胜负
int Place_x[8] = { 0,0,1,-1,-1,1,-1,1 };//Place_x和Place_y共同来表示当前棋子的八个方向
int Place_y[8] = { -1,1,0,0,-1,1,1,-1 };
int num[4] = { 1,1,1,1 };//num数组则用来计数4条直线上的棋子
for (int i = 0; i < 8; i++) {
if (x + Place_x[i] >= 1 && y + Place_y[i] >= 1 && x + Place_x[i] <= ROW && y + Place_y[i] <= COL) {
int _x = x;//每次for循环开始都需要重新回到当前棋子的位置
int _y = y;
for (int j = 0; j <= 4; j++) {
_x += Place_x[i];
_y += Place_y[i];
if (board[x][y] == board[_x][_y]) {//如果是同一个玩家下的棋,则num数组计数+1
num[i / 2] += 1;
}
else break;
}
}
}
for (int i = 0; i < 4; i++) {//当num数组总数,即某条直线上的棋子数有5颗或超过5颗,则返回胜者
if (num[i] >= 5) {
return who;
}
}
return next;//若上面的for函数未满足条件,则游戏继续
}
void PlayMove(int board[][COL],int row,int col,int who,int who2) {
//第一个who是来表示当前下棋的人,第二个who是避免在已有棋子的位置下棋
while (1) {
printf("玩家%d走:", who);
scanf("%d%d", &x, &y);//这里的x,y是全局变量,用来获取下棋的位置
if (x >= 1 && x < row && y >= 1 && y < col) {//不能越界
if (board[x][y] != who && board[x][y] != who2) {
board[x][y] = who;
break;
}
else
printf("位置已占!\n");
}
else
printf("不在范围内!\n");
}
}
void game() {//game函数是主体函数
int board[ROW][COL];//定义棋盘大小
memset(board, ROW, COL);//给棋盘开创内存
int result = next;
display(board, ROW, COL);
while (1) {
PlayMove(board,ROW,COL,Player1,Player2);//先玩家1走,再展示棋盘,在进行胜负判定,最后再返回结果
display(board, ROW, COL);
result = Isover(board, ROW, COL, Player1);
if (result != next)//若result为next,则游戏继续,若不是next,则退出循环,返回结果
break;
PlayMove(board, ROW, COL, Player2,Player1);
display(board, ROW, COL);
result = Isover(board, ROW, COL, Player2);
if (result != next)
break;
}
printf("胜利者是Player%d",result);
}
int main() {
int a = 1;
while(a){
game();
printf("继续请输1,退出请输0\n");
scanf("%d", &a);
}
return 0;
}
这篇代码是参照了b站up主SunistC的视频和比特蛋哥的五子棋代码所写,感谢各位观看,觉得有帮助的小伙伴希望可以点个赞啊,感谢各位