C语言学习 Day12(实现三子棋)

今天学习了如何用C语言实现三子棋,以下为学习分享。

首先,我们可以将目标的实现成三个模块,一个game.h放在头文件,用来声明和定义,test.c用来实现整体的逻辑,game.c用来实现游戏的具体内容。那么现在就可以开始具体实现了。

首先在test.c里创建主函数,并使用test函数。

int main()
{
	test();
	return 0;
}

然后在test函数中实现是否玩游戏的选择,并利用循环确保每次进行完游戏和非法输入的情况能再次选择。

void test()
{
	while (1)
	{
		menu();
		int input = 0;
		scanf("%d", &input);
		if (input == 1)
		{
			system("cls");
			game();
		}
		else if (input == 0)
		{
			system("cls");
			printf("退出游戏\n");
			break;
		}
		else
		{
			system("cls");
			printf("非法输入,请重试\n");
			continue;
		}
	}
}

当然我们得有一个菜单提示选择

void menu()
{
	printf("**********************************\n");
	printf("*********     1.play       *******\n");
	printf("*********     0.exit       *******\n");
	printf("**********************************\n");
	printf("请输入一个数值:");
}

然后我们就可以创建game()函数了,其中所要调用的函数,我们在game.c这个源文件中实现,为此我们还得在game.h中先进行一系列的声明。

void game()
{
	int ret = 0;
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘
	print_board(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 0)
		{
			break;
		}
		//电脑下棋
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 0)
		{
			break;
		}
	}
	if (ret == 1)
	{
		printf("玩家赢\n");
	}
	else if (ret == 2)
	{
		printf("电脑赢\n");
	}
	else
	{
		printf("平局\n");
	}
}
//is_win返回0,继续游戏
//返回1,玩家赢
//返回2,电脑赢
//返回3,平局

其中game.h应如下

#define _CRT_SECURE_NO_WARNINGS

//头文件中声明函数,引库函数,宏的定义
#include 
#include 
#include 
#include 

//定义宏
#define ROW 3
#define COL 3

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

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

//玩家移动
void player_move(char board[ROW][COL], int row, int col);

//电脑移动
void computer_move(char board[ROW][COL], int row, int col);

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

为了使用这些函数,千万不要忘记先在game.c和test.c中首先引入头文件

#include "game.h"

然后便是初始化棋盘

void init_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++)
		{
			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++)
		{
			if (j < col - 1)
			{
				printf(" %c |", board[i][j]);
			}
			else
			{
				printf(" %c\n", board[i][j]);
			}
		}
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				if (j < col - 1)
				{
					printf("---|");
				}
				else
				{
					printf("---\n");
				}
			}
		}
	}
}

实现玩家移动

void player_move(char board[ROW][COL], int row, int col) 
{
	while (1)
	{
		int a = 0;//行
		int b = 0;//列
		printf("请输入要下的坐标:");
		scanf("%d %d", &a, &b);
		if (a <= row && a > 0 && b <= col && b > 0)
		{
			if (board[a-1][b-1] == ' ')
			{
				board[a-1][b-1] = '*';
				break;
			}
			else
			{
				printf("目标坐标已被占用,请重新输入。\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入。\n");
		}
	}
}

实现电脑移动

void computer_move(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	int a = 0;
	int b = 0;
	while (1)
	{
		a = rand() % 3;
		b = rand() % 3;
		{
			if (board[a][b] == ' ')
			{
				board[a][b] = '#';
				break;
			}
		}
	}
}

其中为了保证随机数的生成我们选择返回到test()函数中添加srand()函数

void test()
{
	srand((unsigned int)time(NULL));
	while (1)
	{
		menu();
		int input = 0;
		scanf("%d", &input);
		if (input == 1)
		{
			system("cls");
			game();
		}
		else if (input == 0)
		{
			system("cls");
			printf("退出游戏\n");
			break;
		}
		else
		{
			system("cls");
			printf("非法输入,请重试\n");
			continue;
		}
	}
}

实现输赢判断或者继续游戏

int is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//玩家赢 *
	for (i = 0;i < row; i++)//判断一行是否有三个相同
	{
		int a = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == '*')
			{
				a++;
			}
			if (a == ROW)
			{
				return 1;
			}
		}
	}
	for (j = 0; j < row; j++)//判断一列是否有三个相同
	{
		int a = 0;
		for (i = 0;i < col; i++)
		{
			if (board[j][i] == '*')
			{
				a++;
			}
			if (a == ROW)
			{
				return 1;
			}
		}
	}
	//判断对角线是否有三个相同
	//1. "\"型
	for (int a = 0 ,i = 0, j = 0; i < row && j < col; i++, j++)
	{
		if (board[i][j]== '*')
		{
			a++;
		}
		if (a == ROW)
		{
			return 1;
		}
	}
	//2."/"型
	for (int a = 0,i = 0, j = col - 1; i < row && j >= 0; i++, j--)
	{
		if (board[i][j] == '*')
		{
			a++;
		}
		if (a == ROW)
		{
			return 1;
		}
	}

		
	
	//电脑赢 #
	for (i = 0; i < row; i++)//判断一行是否有三个相同
	{
		int a = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == '#')
			{
				a++;
			}
			if (a == ROW)
			{
				return 2;
			}
		}
	}
	for (j = 0; j < row; j++)//判断一列是否有三个相同
	{
		int a = 0;
		for (i = 0; i < col; i++)
		{
			if (board[j][i] == '#')
			{
				a++;
			}
			if (a == ROW)
			{
				return 2;
			}
		}
	}
	//判断对角线是否有三个相同
	//1. "\"型
	for (int a = 0, i = 0, j = 0; i < row && j < col; i++, j++)
	{
		if (board[i][j] == '#')
		{
			a++;
		}
		if (a == ROW)
		{
			return 2;
		}
	}
	//2."/"型
	for (int a = 0, i = 0, j = col - 1; i < row && j >= 0; i++, j--)
	{
		if (board[i][j] == '#')
		{
			a++;
		}
		if (a == ROW)
		{
			return 2;
		}
	}
	//平局 即格子全填满了但没有三个相连
	for (int a = 0,i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] != ' ')
			{
				a++;
			}
			if (a == ROW * COL)
			{
				return 3;
			}
		}
	}
	//继续游戏
	return 0;
}

这样,我们就可以实现三子棋了。

以上就是今天学习内容的分享了,感谢您的阅读,如有发现错误也欢迎指出!

你可能感兴趣的:(学习)