0
点赞
收藏
分享

微信扫一扫

【C语言】三子棋游戏与多子棋 (保姆级的实现过程)

穆风1818 2022-03-12 阅读 68

目录

🚀write in front🚀   

① 前言

② 模块化编程 

③ 游戏思路&逻辑

④ 实现游戏步骤/过程

Ⅰ创建颜色函数

Ⅱ 菜单界面menu()

Ⅲ 实现多子棋 

Ⅳ 棋盘初始化步骤

Ⅴ 打印棋盘格式实现步骤 

Ⅵ 玩家下棋实现步骤

Ⅶ 电脑下棋实现步骤

Ⅷ 判断游戏结果实现输赢

Ⅸ Isfull()函数的实现过程 

⑤ 结果演示

一、玩家胜利

二、电脑胜利 

三、游戏平局 

⑥ 模块化代码实现

1、test.c

2、game.h

3、game.c 


① 前言


② 模块化编程 


③ 游戏思路&逻辑

④ 实现游戏步骤/过程


Ⅰ创建颜色函数

0=黑色                8=灰色  
1=蓝色                9=淡蓝色        十六进制                                  
2=绿色                10=淡绿色        A          
3=湖蓝色              11=淡浅绿色      B 
4=红色                12=淡红色        C  
5=紫色                13=淡紫色        D          
6=黄色                14=淡黄色        E         
7=白色                15=亮白色        F


Ⅱ 菜单界面menu()

void menu()
{
	color(0);//Black 黑色
	system("cls");	//清屏.
	color(10);
	printf("|----------三子棋游戏------------|\n");
	printf("|********************************|\n");
	printf("|★★★★★★★★★★★★★★★★|\n");
	printf("|★★   1.开始  0.退出       ★★|\n");
	printf("|★★★★★★★★★★★★★★★★|\n");
	printf("|x = 玩家 -------------- o = 电脑|\n");
	printf("|--------------------------------|\n");
}


Ⅲ 实现多子棋 

#define ROW 3    // 行
#define COL 3    // 列

假设:我们改成 44 列 的棋盘。 如👇所示:  

 


Ⅳ 棋盘初始化步骤

void Initialization(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 Interface(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");
		}
	}
	printf("\n");
}


Ⅵ 玩家下棋实现步骤

void Player_play(char board[ROW][COL], int row, int col)
{
	printf("|--------|\n");
	printf("|玩家下棋|\n");
	printf("|--------|\n");
	while (1)
	{
		int x = 0;
		int y = 0;
		static int j = 1;//延长生明周期,
		while (j)
		{
			color(8);
			printf("--------------------------\n");
			printf("[输入第一个坐标记得空一格!]\n");
			printf("--------------------------\n");
			j--;
			break;
		}
		color(11);
		printf("<请输入坐标>:");
		scanf("%d %d", &x, &y);		
		//站在玩游戏的人角度:行以及列都是从1开始的。
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//但是程序的实现过程是下标从0开始的。
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'x';
				break;
			}
			else
			{
				color(6);
				printf("|==============|\n");
				printf("|该坐标已被占用|\n");
				printf("|==============|\n");
			}
		}
		else
		{
			color(6);
			printf("|====================|\n");
			printf("|坐标非法,请重新输入|\n");
			printf("|====================|\n");
		}
	}
}


Ⅶ 电脑下棋实现步骤

Ⅷ 判断游戏结果实现输赢

char Iswin(char board[ROW][COL], int row, int col)
{
	int a = 0;
	int b = 0;
	//判断三行
	for (a = 0; a < row; a++)
	{
		if (board[a][0] == board[a][1] && board[a][1] == board[a][2] && board[a][0] != ' ')
		{
			return board[a][0];//返回电脑赢,还是玩家赢。
		}
	}
	//判断三列
	for (b = 0; b < col; b++)
	{
		if (board[0][b] == board[1][b] && board[1][b] == board[2][b] && board[0][b] != ' ')
		{
			return board[1][b];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
	{
		return board[1][1];
	}
	//判断平局:其实就是看你的棋盘满了没有,当你棋盘的格子都下完了还没有结果的话,那么自然就是平局了。
	if (1 == Isfull(board, ROW, COL))
	{
		return 'q';
	}
	return 'c';
}


Ⅸ Isfull()函数的实现过程 

int Isfull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//不满,棋盘还有多余格子。
			}
		}
	}
	return 1;//当棋盘满了的话,返回值1,也就是执行return 'q'(平局)
}


⑤ 结果演示

一、玩家胜利

二、电脑胜利 

三、游戏平局 


⑥ 模块化代码实现

1、test.c

#include"game.h"

void menu()
{
	color(0);//Black 黑色
	system("cls");	//清屏.
	color(10);
	printf("|----------三子棋游戏------------|\n");
	printf("|********************************|\n");
	printf("|★★★★★★★★★★★★★★★★|\n");
	printf("|★★   1.开始  0.退出       ★★|\n");
	printf("|★★★★★★★★★★★★★★★★|\n");
	printf("|x = 玩家 -------------- o = 电脑|\n");
	printf("|--------------------------------|\n");
}
void game()
{
	printf(" ---------\n");
	printf("|PLAY GAME|\n");
	printf(" ---------\n");
	printf("\n");
	//创建二维数组
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	Initialization(board, ROW, COL);
	//打印棋盘
	Interface(board, ROW, COL);

	int ret = 0;
	while (1)
	{
		Player_play(board, ROW, COL);//玩家下棋
		Interface(board, ROW, COL);	 //打印棋盘
		//判断玩家赢 游戏
		ret = Iswin(board, ROW, COL);

		if (ret != 'c')//判断是否游戏继续
		{
			break;	   
		}
		Computer_play(board, ROW, COL);//电脑下棋
		Interface(board, ROW, COL);	   //打印棋盘

		//判断电脑赢 游戏
		ret = Iswin(board, ROW, COL);

		if (ret != 'c')
		{
			break;	   
		}
	}
	if (ret == 'x')
	{
		printf("玩家赢!\n");
		printf("|-----------------------|\n");
		printf("|休息5s嘟嘟嘟(/*·ω·)/|\n");
		printf("|-----------------------|\n");
		Sleep(5000);
	}
	else if (ret == 'o')
	{
		printf("电脑赢!\n");
		printf("|-----------------------|\n");
		printf("|休息5s嘟嘟嘟(/*·ω·)/|\n");
		printf("|-----------------------|\n");
		Sleep(5000);
	}
	else
	{
		printf("平局!\n");
		printf("|-----------------------|\n");
		printf("|休息5s嘟嘟嘟(/*·ω·)/|\n");
		printf("|-----------------------|\n");
		Sleep(5000);
	}
}
void test()
{
	int input = 0;
	do
	{
		menu();
		srand((unsigned int)time(NULL));
		color(5);
		printf("|════════════════|");
		printf("\n请输入上方的数字:");
		color(11);
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("|════════|");
			printf("|退出游戏|");
			printf("|════════|");
			break;
		default:
			printf("|═════════════════════════════|\n");
			printf("|由于你输入错误罚你5s不能玩(→_→)|\n");
			printf("|═════════════════════════════|\n");
			Sleep(5000);
		}
	} while (input);
}

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

2、game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdlib.h>
#include<Windows.h>
#include<stdio.h>
//行 列
#define ROW 3
#define COL 3

void color(short x);
void Initialization(char board[ROW][COL], int row, int col);
void Interface(char board[ROW][COL], int row, int col);
void Player_play(char baord[ROW][COL], int row, int col);
void Computer_play(char board[ROW][COL], int row, int col);
char Iswin(char board[ROW][COL], int row, int col);

3、game.c 

#include"game.h"
//自定义函根据参数改变颜色 
void color(short x)	
{
	if (x >= 0 && x <= 15)//参数在0-15的范围颜色
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);	//只有一个参数,改变字体颜色 
	else//默认的颜色白色
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
//棋盘初始化实现步骤
void Initialization(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 Interface(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");
		}
	}
	printf("\n");
}
//玩家下棋实现步骤
void Player_play(char board[ROW][COL], int row, int col)
{
	printf("|--------|\n");
	printf("|玩家下棋|\n");
	printf("|--------|\n");
	while (1)
	{
		int x = 0;
		int y = 0;
		static int j = 1;//延长生明周期,
		while (j)
		{
			color(8);
			printf("--------------------------\n");
			printf("[输入第一个坐标记得空一格!]\n");
			printf("--------------------------\n");
			j--;
			break;
		}
		color(11);
		printf("<请输入坐标>:");
		scanf("%d %d", &x, &y);		
		//站在完游戏的人角度:行以及列都是从1开始的。
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//但是程序的实现过程是下标从0开始的。
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = 'x';
				break;
			}
			else
			{
				color(6);
				printf("|==============|\n");
				printf("|该坐标已被占用|\n");
				printf("|==============|\n");
			}
		}
		else
		{
			color(6);
			printf("|====================|\n");
			printf("|坐标非法,请重新输入|\n");
			printf("|====================|\n");
		}
	}
}
//电脑下棋实现步骤
void Computer_play(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	color(9);
	printf("电脑走/:>: \n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = 'o';
			break;
		}
	}
}

int Isfull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//不满,棋盘还有多余格子。
			}
		}
	}
	return 1;//当棋盘满了的话,返回值1,也就是执行return 'q'(平局)
}
//判断游戏结果的实现输赢
//玩家赢了 —— ‘x’
//电脑赢了 —— ‘o’
//平局的话 —— ‘q’
//游戏继续 —— ‘c’
//注意:返回结果的值是字符,所以我们这里要用到字符串char来进行返回
//思路:无非就是判断,行以及列和对角线相不相等,但是不能前面空格也相等。
char Iswin(char board[ROW][COL], int row, int col)
{
	int a = 0;
	int b = 0;
	//判断三行
	for (a = 0; a < row; a++)
	{
		if (board[a][0] == board[a][1] && board[a][1] == board[a][2] && board[a][0] != ' ')
		{
			return board[a][0];//返回电脑赢,还是玩家赢。
		}
	}
	//判断三列
	for (b = 0; b < col; b++)
	{
		if (board[0][b] == board[1][b] && board[1][b] == board[2][b] && board[0][b] != ' ')
		{
			return board[1][b];
		}
	}
	//判断对角线
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
	{
		return board[1][1];
	}
	//判断平局:其实就是看你的棋盘满了没有,当你棋盘的格子都下完了还没有结果的话,那么自然就是平局了。
	if (1 == Isfull(board, ROW, COL))
	{
		return 'q';
	}
	return 'c';
}

举报

相关推荐

0 条评论