目录

用C语言实现简单的五子棋小游戏附上全代码以及思路讲解

用C语言实现简单的五子棋小游戏(附上全代码以及思路讲解)

目录(全代码在文末哦)

如果要实现五子棋,首先第一步要写一个菜单,让玩家可供选择,比如:输入’1‘,开始游戏,输入’0’,结束游戏。但是你不能只执行一次,所以要写一个do while循环,让他至少能循环一次。然后写一个switch语句,让系统来判断玩家选择的什么以此来做出相对应的动作。

void menu()
{
	printf("\n***************************\n");
	printf("********   1、PVP  ********\n");
	printf("******   0、结束游戏  *****\n");
	printf("***************************\n");

}

int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("选择错误,请重新输入");
break;
}
} while (input);
return 0;
}

主函数写好之后就可以开始写具体的 game()函数了。

棋子空格初始化

要想做出一个五子棋,首先要创建一个二维数组,然后初始化空格,让这些二维数组输出的都是空格。

void blank_space(char board[line][row],int lin,int ro)
{
int i = 0, j = 0;
for (i = 0; i < line; i++)
{
for (j = 0; j < row; j++)
board[i][j] = ' ';
}
}

char board[line][row] = { 0 };
blank_space(board,line,row);

初始化空格之后,就该创建我们的棋盘了。

棋盘

考虑到我们是五子棋,棋盘会比较大,所以有必要写一个横坐标和纵坐标,这样有利于玩家写坐标。这就产生一个问题,如果纵坐标有一位数变成两位数之后,数字占用的空间就大了,棋盘就乱了,所以我们不能把纵坐标放在左边,要放到右边。

横纵坐标解决了,就来看我们的棋盘。我们的棋盘通常是有   |  和 —  和 空格组成。一般是这样:

https://i-blog.csdnimg.cn/blog_migrate/e20dc390347f2cb501846acbb68de223.png


发现没有,我们一行通常是由列个“|   ”和列个“|—”组成的,再利用好空格,就能做好我们的棋盘。下面是棋盘函数代码。

void chessboard(char board[line][row], int lin, int ro)
{
int a = 0, b = 0;
for (a = 0; a < row; a++)
{
printf(" ");
printf("%d",a+1);
if (a <= 10)
{
printf(" ");
}
else if (a > 11)
{
printf(" ");
}
}
printf("\n");
for (b = 0; b < line; b++)
{
for (a = 0; a < row; a++)
{
printf("| %c ", board[b][a]);
if (a == row-1)
{
printf("%d", b + 1);
}
}
printf("\n");
for (a = 0; a < row; a++)
{
printf("|---");
}
printf("\n");
}
}

棋盘照片

https://i-blog.csdnimg.cn/blog_migrate/6023ed4e219f1afecb5c8a5debf92614.png

棋盘做好之后,我们就可以开始写玩家下棋的代码了。

玩家下棋

玩家下棋,首先要判断下的位置是否合法,如果位置不存在,那肯定不行,如果位置存在,那还要判断这个位置是否有棋子,就是是否是空格。如果不是,就返回,让玩家重新输入。

void playermove(char board[line][row], int Line, int Row)
{
int x = 0, y = 0;
while (1)
{
printf("请选择位置:");
scanf("%d %d", &x, &y);
if (x <= line && y <= row)
{
if (board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '_';
break;
}
else
printf("此位置已被占用,请重新输入\n");
}
else
printf("位置无效,请重新输入\n");
}
}

在玩家下好棋子之后,再打印一下棋盘,以便游戏玩家知道游戏进行到哪一步了。

printf("玩家 1 下棋\n");
playermove(board, line, row);
chessboard(board, line, row);

两个玩家对战的话,就是把上面的代码再复制一遍。

下棋结束了,下面就应该来判断输赢以及是否是平局了。

判断输赢

五子棋一方胜利的条件是横着的五个连续棋子或者竖着的五个连续棋子或者斜着的五个连续棋子,但是这些棋子都不能是空格,所以我们这样写:

char iswin(char board[line][row], int Line, int Row)
{
int a = 0, b = 0;
for (a = 0; a < line; a++)
{
for (b = 0; b < row; b++)
{
if (board[a][b] == board[a][b + 1] && board[a][b + 1] == board[a][b + 2] && board[a][b + 2] == board[a][b + 3] && board[a][b + 3] == board[a][b + 4] && board[a][b + 3] != ' ')
return board[a][b + 3];
else if (board[a][b] == board[a + 1][b] && board[a + 1][b] == board[a + 2][b] && board[a + 2][b] == board[a + 3][b] && board[a + 3][b] == board[a + 4][b] && board[a + 3][b] != ' ')
return board[a + 3][b];
else if (board[a][b] == board[a + 1][b + 1] && board[a + 1][b + 1] == board[a + 2][b + 2] && board[a + 2][b + 2] == board[a + 3][b + 3] && board[a + 3][b + 3] == board[a + 4][b + 4] && board[a + 3][b + 3] != ' ')
return board[a + 3][b + 3];
else if (board[a][b] == board[a - 1][b + 1] && board[a - 1][b + 1] == board[a - 2][b + 2] && board[a - 2][b + 2] == board[a - 3][b + 3] && board[a - 3][b + 3] == board[a - 4][b + 4] && board[a - 3][b + 3] != ' ')
return board[a - 3][b + 3];
}
}
}

如果有连续的五个相同棋子,让函数返回中间棋子的值,这样的话,我们就不用另外建立一个变量来判断输赢了。在这里我让玩家一下 _ 棋,让玩家二下 # 棋,然后返回的时候也让函数返回这些,我们就可以直接利用返回值是 _ 还是 # 来判断是玩家一赢还是玩家二赢。

char ret = iswin(board, line, row);
if (ret == '_')
{
printf("玩家 1 胜利\n");
break;
}
else if (cou==1);
{
printf("\n 平局");
break;
}

判断平局

最后我们来判断是否是平局。

如果双方都下完了所有的地方,但是都没有赢家,就需要我们输出平局来结束游戏了。我们可以设置一个变量,让每一个玩家下一次棋,这个变量加一次,等这个变量等于五子棋的行和列的时候,如果没有任何一方胜利,那么就是平局。

int isdraw(int count)
{
if (count == line * row)
return 1;
}

else if (cou == 1)
{
printf("\n 平局");
break;
}

全部代码

最后附上五子棋程序的全部代码

主函数

#include "game.h"

void menu()
{
printf("\n***************************\n");
printf("******** 1、PVP ********\n");
printf("****** 0、结束游戏 *****\n");
printf("***************************\n");

}

void game()
{
int count = 0;
//初始化空格
char board[line][row] = { 0 };
blank_space(board,line,row);
//初始化棋盘
chessboard(board, line, row);
while (1)
{
//玩家 1 下棋
printf("玩家 1 下棋\n");
playermove(board, line, row);
chessboard(board, line, row);
count++;
int cou = isdraw(count);

    	char ret = iswin(board, line, row);
    	if (ret == '*')
    	{
    		printf("玩家1胜利\n");
    		break;
    	}
    	else if (cou==1)
    	{
    		printf("\n平局");
    		break;
    	}
    	//玩家2下棋
    	printf("玩家2下棋\n");
    	playermove_1(board, line, row);
    	chessboard(board, line, row);
    	count++;
    	cou = isdraw(count);

    	//判断输赢
    	ret = iswin(board, line, row);
    	 if (ret == '#')
    	{
    		printf("玩家2胜利\n");
    		break;
    	}
    	else if (cou == 1)
    	{
    		printf("\n平局");
    		break;
    	}
    }

}

int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束");
break;
default:
printf("选择错误,请重新输入");
break;
}
} while (input);
return 0;
}

game.h

#include<stdio.h>

#define line 20
#define row 20

//初始化空格
void blank_space(char board[line][row], int Line, int Row);

//初始化棋盘
void chessboard(char board[line][row], int Line, int Row);

//玩家 1 下棋
void playermove(char board[line][row], int Line, int Row);

//玩家 2 下棋
void playermove_1(char board[line][row], int Line, int Row);

//判断输赢以及是否继续
char iswin(char board[line][row], int Line, int Row);

//判断是否平局
int isdraw(int count);

game.c

#include "game.h"

//初始化空格
void blank_space(char board[line][row],int lin,int ro)
{
int i = 0, j = 0;
for (i = 0; i < line; i++)
{
for (j = 0; j < row; j++)
board[i][j] = ' ';
}
}

//初始化棋盘
void chessboard(char board[line][row], int lin, int ro)
{
int a = 0, b = 0;
for (a = 0; a < row; a++)
{
printf(" ");
printf("%d",a+1);
if (a <= 10)
{
printf(" ");
}
else if (a > 11)
{
printf(" ");
}
}
printf("\n");
for (b = 0; b < line; b++)
{
for (a = 0; a < row; a++)
{
printf("| %c ", board[b][a]);
if (a == row-1)
{
printf("%d", b + 1);
}
}
printf("\n");
for (a = 0; a < row; a++)
{
printf("|---");
}
printf("\n");
}
}

//玩家 1 下棋
void playermove(char board[line][row], int Line, int Row)
{
int x = 0, y = 0;
while (1)
{
printf("请选择位置:");
scanf("%d %d", &x, &y);
if (x <= line && y <= row)
{
if (board[x-1][y-1] == ' ')
{
board[x-1][y-1] = '*';
break;
}
else
printf("此位置已被占用,请重新输入\n");
}
else
printf("位置无效,请重新输入\n");
}
}

//玩家 2 下棋
void playermove_1(char board[line][row], int Line, int Row)
{
int x = 0, y = 0;
while (1)
{

    	printf("请选择位置:");
    	scanf("%d %d", &x, &y);
    	if (x <= line && y <= row)
    	{
    		if (board[x - 1][y - 1] == ' ')
    		{
    			board[x - 1][y - 1] = '#';
    			break;
    		}
    		else
    			printf("此位置已被占用,请重新输入\n");
    	}
    	else
    		printf("位置无效,请重新输入\n");
    }

}

//判断输赢以及是否继续

char iswin(char board[line][row], int Line, int Row)
{
int a = 0, b = 0;
for (a = 0; a < line; a++)
{
for (b = 0; b < row; b++)
{
if (board[a][b] == board[a][b + 1] && board[a][b + 1] == board[a][b + 2] && board[a][b + 2] == board[a][b + 3] && board[a][b + 3] == board[a][b + 4] && board[a][b + 3] != ' ')
return board[a][b + 3];
else if (board[a][b] == board[a + 1][b] && board[a + 1][b] == board[a + 2][b] && board[a + 2][b] == board[a + 3][b] && board[a + 3][b] == board[a + 4][b] && board[a + 3][b] != ' ')
return board[a + 3][b];
else if (board[a][b] == board[a + 1][b + 1] && board[a + 1][b + 1] == board[a + 2][b + 2] && board[a + 2][b + 2] == board[a + 3][b + 3] && board[a + 3][b + 3] == board[a + 4][b + 4] && board[a + 3][b + 3] != ' ')
return board[a + 3][b + 3];
else if (board[a][b] == board[a - 1][b + 1] && board[a - 1][b + 1] == board[a - 2][b + 2] && board[a - 2][b + 2] == board[a - 3][b + 3] && board[a - 3][b + 3] == board[a - 4][b + 4] && board[a - 3][b + 3] != ' ')
return board[a - 3][b + 3];
}
}
}

//判断是否平局
int isdraw(int count)
{
if (count == line * row)
return 1;
}

最后很感谢大家能喜欢,我也是一个刚学 C 语言的新手,如果有什么不对的希望大家能够指正,谢谢大家!