C语言实现三子棋

一.问题的描述

用C语言实现三子棋

二.基本流程

1.书写游戏的基本框架流程
2.确定游戏的玩法和类型
3.实现以上方法即可

这仅仅是我个人思路,我在后面的讲解中,会分模块化的讲解。

三、步骤

我个人把游戏的制作分为以下几个模块:

1. 开始游戏的菜单打印
2. 棋盘的初始化
3. 打印棋盘
4. 玩家下棋的方式
5. 电脑下棋的方式
6. 输赢的判决

1.游戏开始菜单的打印

void menu() //开始菜单的方法
{
	printf("*********************************\n");
	printf("*******  1.play     *************\n");
	printf("*******  2.exit     *************\n");
	printf("*********************************\n");

}

int main() {
	int input = 0;
	do 
	{
		//1.开始游戏
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();//这个方法就是开始游戏的方法
			break;
		case 0:
			printf("退出游戏\n");
			break;

		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	
	} while (input);


	return 0;
}

2. 棋盘的初始化

这里棋盘的初始化,有点说发
因为三子棋的棋盘,众所周知,如下图所示
C语言实现三子棋_第1张图片
目前来说,代码不是很重要
重要的是思路,具体的思路
1.我们首先得准备一个一个3*3的数组
2.初始化数组,因为看图片,你可以知道,里面必须要装东西,我们这里打算放空格。

void initBoard(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] = ' ';
		}
	}
}

接下来,我们就要构建棋盘了
思路就是,我们先看图
可以看出,每一列可以分为三部分,如下图所示:
C语言实现三子棋_第2张图片
我们可以把这整体看成三部分
从总体看部分,部分我们又可以俩部分
分为数据和分隔符
1.总体我们用一个for循环控制行
2.一行我们又要打印数据和分隔符
3.你看每一个部分由俩个分隔符,然后,我们再从第二个分隔符下功夫,再把第二个分隔符,分为俩部分

void display_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) {//控制行输出的次数
			//printf("---|---|---\n");
			for (j = 0; j < col; j++) {//控制每列输出的结果
				printf("---");
				if (j < col - 1) {//控制分隔符
					printf("|");
				}
				

			}
			printf("\n");
		}
	}
}

3.打印棋盘

void display_board(char board[ROW][COL], int row, int col) {
	int i = 0;
	for (i = 0; i < row; i++) {//外层决定要打印多少行

		//先打印数据
		//printf(" %c | %c | %c \n",board[i][0],board[i][1], board[i][2]);
		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) {//控制行输出的次数
			//printf("---|---|---\n");
			for (j = 0; j < col; j++) {//控制每列输出的结果
				printf("---");
				if (j < col - 1) {//控制分隔符
					printf("|");
				}
				

			}
			printf("\n");
		}
	}
}

4. 玩家下棋的方式

void paly_move(char board[ROW][COL], int row, int col) {
	int x = 0;
	int y = 0; 

	printf("玩家下棋:>");
	
	//1.判断坐标的合法性
	//2.坐标是否被占用
	while (1) {
		printf("请输入要下棋的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col) {

			if (board[x-1][y-1]==' ') {
				board[x - 1][y - 1] = '*';
				break;
			
			}
			else {
			
				printf("该坐标被占用,请重新输入\n");
			}

		}
		else {
			printf("坐标非法,重新输入\n");
		}
	}

5.电脑下棋

这里有一个随机数的概念
要再main方法中引用这个代码
我会在主方法中加入
代码如下所示

srand((unsigned)time(NULL));
//电脑随机下棋;
	printf("电脑下棋:>\n");
	while (1) {
		//生成随机数
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' ') {
			board[x][y] = '#';
			break;
		}

	
	
	}

	
}

6. 输赢的判决

int is_full(char board[ROW][COL], int row, int col) {
//如果棋盘满了返回1,不满返回0
	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 is_win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断三行相等的输赢条件
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	//判断三列相等的输赢条件
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//右对角线的输赢条件
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	//左对角线的输赢条件
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	//判断平局
	if (is_full(board, row, col) == 1)
	{
		return 'Q';
	}

	//继续
	return 'C';
}

四.最终的main方法

//测试三子棋游戏
void game() {
	char ret = 0;
	char board[ROW][COL] = {0};
	//初始化棋盘函数
	initBoard(board,ROW,COL);
	//打印初始化棋盘
	display_board(board,ROW,COL);
	//玩游戏
	while (1) {
		paly_move(board, ROW, COL);
		//判断输赢
		ret=is_win(board, ROW, COL);
		if (ret != 'C') {
			break;
		}
		display_board(board, ROW, COL);
		computer_move(board, ROW, COL);
		//判断输赢
		char ret = is_win(board, ROW, COL);
		if (ret != 'C') {
			break;
		}

		display_board(board, ROW, COL);
	}
	if (ret=='*') {
		printf("玩家赢\n");
	}
	else if (ret=='#') {
		printf("电脑赢\n");
	
	}
	else if(ret=='Q') {
	
		printf("平局\n");
	}
	display_board(board, ROW, COL);


}
int main() {
	int input = 0;
	srand((unsigned)time(NULL));
	do 
	{
		//1.开始游戏
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;

		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	
	} while (input);


	return 0;
}

你可能感兴趣的:(C语言初阶,c语言)