五分钟带你看完C语言三子棋——简单的“雅痞”

C语言实现三子棋

  • 三子棋整体框架
  • 三子棋游戏实现(game(); )
    • 三子棋的棋盘
    • 三子棋下棋(玩家)
    • 三子棋下棋(电脑)
    • 三子棋判断输赢
    • 三子棋源代码

三子棋整体框架

不管怎么样我们先进入三子棋游戏的菜单
我们使用do while循环结构,不管如何先执行一次

//打印主界面
void menu()
{
	printf("***************************\n");
	printf("******1.play   0.exit******\n");
	printf("***************************\n");
}
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择是否游戏>:");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
			printf("进入游戏")//game();
				break;
			case 0:
				printf("成功退出!!\n");
				break;
			default:
				printf("选择错误,请重新选择>:\n");
				break;
		}
	} while (input);
	return 0;
}

当我们输入1,就执行游戏
当我们输入0,就退出游戏

三子棋游戏实现(game(); )

三子棋的棋盘

我们使用二维字符数组来存放我们下的棋子

#define ROW 3
#define COL 3
	char board[ROW][COL];

我们在用define来实现数字的替换,这方便我们后面可以将三子棋改为四子棋五子棋

	//初始化棋子
	Initialize_pieces(board, ROW, COL);
	//打印棋盘
	print_board(board, ROW, COL);

我们在打印棋盘的一开始也需要对存放棋子的数组进行初始化我们用空格来代替,方便后续我们下子

下面是初始化数组的函数定义以及打印棋盘的函数定义:

//初始化棋子
void Initialize_pieces(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 print_board(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++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0;j < col;j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

我们使用ROW和COL来实现可以更方便我们将棋盘改为四子棋盘五子棋盘
如果不想用则可以直接用数字替换ROW代表行数(3)COL代表列数(3)

三子棋下棋(玩家)

我们用二维数组坐标来表示下子的地方

下面是玩家下棋的函数:

//判断这里是否有棋子(玩家)
int judge1(char board[ROW][COL], int x, int y)
{
	if (board[x - 1][y - 1] == ' ')//如果存放的是空格则代表这里没有被下过棋
		return 1;
	else
		return 0;
}
//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:\n");
	while (1)
	{
		printf("请输入你要下棋的坐标>:");
		scanf("%d %d",&x, &y);
		//先判断输入的数字是否合法
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			//先判断这里是否已经有棋子
			int ret = judge1(board, x, y);
			//如果返回1则表示可以下棋
			if (ret == 1)
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已有棋子请重新选择!\n");
			}
		}
		else
		{
			printf("输入坐标不合法,请重新输入!\n");
		}
	}
}

我们在下棋前需要先判断我们输入的坐标是否在数组范围内,不能造成数组越界
我们还需要判断输入的坐标里面是否已经有了棋子

三子棋下棋(电脑)

我们电脑下棋没有用多么复杂的算法,就是用的简单的生成随机的坐标
我们使用生成随机数来实现:

	srand((unsigned int)time(NULL));
		int x = rand() % row;//我们可以生成0——row-1的数
		int y = rand() % col;//我们可以生成0——col-1的数

我们使用rand函数来生成随机数,来最终实现随机坐标

电脑下棋函数:

//判断是否有棋子(电脑)
int judge2(char board[ROW][COL], int x, int y)
{
	if (board[x][y] == ' ')
		return 1;
	else
		return 0;
}
//电脑下棋
void com_board(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋>:\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
			//判断是否有位置
			int ret = judge2(board, x, y);
			//如果返回1则表示可以下棋
			if (ret == 1)
			{
				board[x][y] = '#';
				break;
			}
	}
}

跟玩家下棋的流程大同小异,先判断该坐标是否有棋子,再确定下棋

三子棋判断输赢

我们已经理解如何下棋了,接下来就是判断输赢

while(1)
 {
	....
	ch = win_board(board, ROW, COL);
	if(ch!='w')
	break;
	....
 }
		if (ch == '*')
		   {
			printf("\n<<<玩家获胜>>>\n");
		   }
		if (ch == '#')
		   {
		 	printf("\n<<<电脑获胜>>>\n");
		   }
		if (ch == 'F')
		   {
			printf("\n<<<!平局!>>>\n");
		   }

我们通过一个函数的返回值来判断输赢
‘w’表示继续下棋
‘*’表示玩家获胜
‘#’表示电脑获胜
‘F’表示棋盘下满了平局

下面是判断的函数:

//判断棋盘是否满了(满了返回1没满返回0)
int Full_board(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}
//判断输赢
char win_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断行赢
	for (i = 0;i < row;i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0;j < col-1;j++)
		{
			if (board[i][j] != ' ')
			{
				if (board[i][j] == board[i][j + 1])
				{
					count++;
				}
			}
		}
		if (count == row-1)
			return board[i][j];
	}
	//判断列赢
	for (i = 0;i < row;i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0;j < col - 1;j++)
		{
			if (board[j][i] != ' ')
			{
				if (board[j][i] == board[j+1][i])
				{
					count++;
				}
			}
		}
		if (count == col-1)
			return board[j][i];
	}
	//判断对角线赢
	int count = 0;
	for (i = 0;i < row-1;i++)
	{
		if (board[i][i] != ' ')
		{
			if (board[i][i] == board[i + 1][i + 1])
			{
				count++;
			}
		}
	}
	if (count == row - 1)
	{
		return board[i][i];
	}
	count = 0;
	for (i = 0;i < row-1;i++)
	{
		if (board[0][col - 1] != ' ')
		{
			char tmp = board[0][col - 1];
			int j = 0;
			if (board[i+1][col - 2 - i] == tmp)
			{
				count++;
			}
		}
	}
	if (count == col - 1)
	{
		return board[0][col - 1];
	}
	//判断棋盘是否满,能否继续
	int ret = Full_board(board, ROW, COL);
	if (ret == 0)
		return 'w';
	else
		return 'F';
}

三子棋源代码

头文件game.h

#include 
#include 
#include 

#define ROW 3
#define COL 3

//初始化棋子
void Initialize_pieces(char board[ROW][COL], int row , int col);

//打印棋盘
void print_board(char board[ROW][COL],int row,int col);

//玩家下棋
void play_board(char board[ROW][COL], int row, int col);

//判断是否有棋子
int judge1(char board[ROW][COL], int x, int y);
int judge2(char board[ROW][COL], int x, int y);

//电脑下棋
void com_board(char board[ROW][COL], int row, int col);

//判断输赢
char win_board(char board[ROW][COL], int row, int col);

//判断棋盘是否满
 int Full_board(char board[ROW][COL], int row, int col);

主函数文件test.c

#include "game.h"

void menu()
{
	printf("***************************\n");
	printf("******1.play   0.exit******\n");
	printf("***************************\n");
}

void game()
{
		char ch = 0;
		//棋子数组
		char board[ROW][COL];
		//初始化棋子
		Initialize_pieces(board, ROW, COL);
		//打印棋盘
		print_board(board, ROW, COL);
		while (1)
		{
			//玩家下棋
			play_board(board, ROW, COL);
			//判断输赢
			ch = win_board(board, ROW, COL);
			if (ch != 'w')
			{
				break;
			}
			//下完棋打印棋盘
			print_board(board, ROW, COL);
			//电脑下棋
			com_board(board, ROW, COL);
			//判断输赢
			ch = win_board(board, ROW, COL);
			if (ch != 'w')
			{
				break;
			}
			//下完棋打印棋盘
			print_board(board, ROW, COL);
		}
		if (ch == '*')
		{
			printf("\n<<<玩家获胜>>>\n");
		}
		if (ch == '#')
		{
			printf("\n<<<电脑获胜>>>\n");
		}
		if (ch == 'F')
		{
			printf("\n<<<!平局!>>>\n");
		}
		//最后再打印一下
		print_board(board, ROW, COL);
}
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("成功退出!!\n");
				break;
			default:
				printf("选择错误,请重新选择>:\n");
				break;
		}
	} while (input);
	return 0;
}

游戏实现文件game.c

#include "game.h"

//初始化棋子
void Initialize_pieces(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 print_board(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++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0;j < col;j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

//判断是否有棋子(玩家)
int judge1(char board[ROW][COL], int x, int y)
{
	if (board[x - 1][y - 1] == ' ')
		return 1;
	else
		return 0;
}
//判断是否有棋子(电脑)
int judge2(char board[ROW][COL], int x, int y)
{
	if (board[x][y] == ' ')
		return 1;
	else
		return 0;
}

//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:\n");
	while (1)
	{
		printf("请输入你要下棋的坐标>:");
		scanf("%d %d",&x, &y);
		//先判断输入的数字是否合法
		if (x > 0 && x <= row && y > 0 && y <= col)
		{
			//先判断这里是否已经有棋子
			int ret = judge1(board, x, y);
			//如果返回1则表示可以下棋
			if (ret == 1)
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("该位置已有棋子请重新选择!\n");
			}
		}
		else
		{
			printf("输入坐标不合法,请重新输入!\n");
		}
	}
}

//电脑下棋
void com_board(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋>:\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
			//判断是否有位置
			int ret = judge2(board, x, y);
			//如果返回1则表示可以下棋
			if (ret == 1)
			{
				board[x][y] = '#';
				break;
			}
	}
}

//判断棋盘是否满了(满了返回1没满返回0)
int Full_board(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 1;
}

//判断输赢
char win_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断行赢
	for (i = 0;i < row;i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0;j < col-1;j++)
		{
			if (board[i][j] != ' ')
			{
				if (board[i][j] == board[i][j + 1])
				{
					count++;
				}
			}
		}
		if (count == row-1)
			return board[i][j];
	}
	//判断列赢
	for (i = 0;i < row;i++)
	{
		int j = 0;
		int count = 0;
		for (j = 0;j < col - 1;j++)
		{
			if (board[j][i] != ' ')
			{
				if (board[j][i] == board[j+1][i])
				{
					count++;
				}
			}
		}
		if (count == col-1)
			return board[j][i];
	}
	//判断对角线赢
	int count = 0;
	for (i = 0;i < row-1;i++)
	{
		if (board[i][i] != ' ')
		{
			if (board[i][i] == board[i + 1][i + 1])
			{
				count++;
			}
		}
	}
	if (count == row - 1)
	{
		return board[i][i];
	}
	count = 0;
	for (i = 0;i < row-1;i++)
	{
		if (board[0][col - 1] != ' ')
		{
			char tmp = board[0][col - 1];
			int j = 0;
			if (board[i+1][col - 2 - i] == tmp)
			{
				count++;
			}
		}
	}
	if (count == col - 1)
	{
		return board[0][col - 1];
	}
	//判断游戏能否继续
	int ret = Full_board(board, ROW, COL);
	if (ret == 0)
		return 'w';
	else
		return 'F';
}

你可能感兴趣的:(c语言)