用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);

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

棋盘

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

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


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

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");
	}
}

棋盘照片

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

玩家下棋

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

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语言的新手,如果有什么不对的希望大家能够指正,谢谢大家!

  • 36
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一个很好的五子棋c语言源程序代码,最重要的是能运行正确!!! #include #include #include #include #include #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #define CROSSRD 0xd9 /*右下角点*/ #define CROSSL 0xc3 /*左边*/ #define CROSSR 0xb4 /*右边*/ #define CROSSU 0xc2 /*上边*/ #define CROSSD 0xc1 /*下边*/ #define CROSS 0xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义1号玩家的操作键键码*/ #define PLAY1UP 0x1157/*上移--'W'*/ #define PLAY1DOWN 0x1f53/*下移--'S'*/ #define PLAY1LEFT 0x1e41/*左移--'A'*/ #define PLAY1RIGHT 0x2044/*右移--'D'*/ #define PLAY1DO 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #define PLAY2UP 0x4800/*上移--方向键up*/ #define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/ #define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL 0 /*没有棋子*/ #define CHESS1 'O'/*一号玩家的棋子*/ #define CHESS2 'X'/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ 下载可看到完整的...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值