筑基四层 —— 详解三子棋和扫雷

news2024/11/16 22:51:38

目录

一.修炼必备

二.三子棋详解

三.扫雷详解

四.三子棋和扫雷的完整代码

  !!!恭喜你,成功突破至筑基四层!!!


一.修炼必备

 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com)

 2.趁手武器:印象笔记/有道云笔记

 3.修炼秘籍:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

 4.雷劫必备:leetcode 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 

 注:遇到瓶颈怎么办?百度百科_全球领先的中文百科全书 (baidu.com)

二.三子棋详解

 1.先看一个思维导图,理清思路

 2.前提工作 —— 头文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

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

 3.框架

  1)框架一般我们使用do-while循环进行解决,因为我们需要先使用一次,然后再进行判断

  2)菜单

  3)代码实现

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


int main()
{
	int option = 0;
    //设置随机数种子
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &option);

		switch (option)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("你选择错误,请重新选择~\n");
				break;
		}

	} while (option);
	return 0;
}

 4.游戏函数概览 

void game()
{
	char board[ROW][COL];
	char ch = '0';

	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);

	//玩家下棋
	PlayerMove(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
		
	//判断输赢
	ch = IsWin(board, ROW, COL);

    //电脑下棋
	ComputerMove(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);

	//判断输赢
	ch = IsWin(board, ROW, COL);
}

 5.棋盘初始化:使用' '进行初始化

  1)为什么需要棋盘初始化?

  —— 防止数组中存储了未知值

  2)为什么棋盘初始化要用' '而不用其他的字符
  ——  美观且为了排版正确,使用其他字符会导致排版不正确,如使用数字等字符

  3)棋盘初始化的两种方式

i.循环初始化
ii.memset初始化

  4)代码实现 

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	//初始化法1:循环
	/*for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}*/

	//初始化法2:取board数组的首地址,然后把数组中的所有字符置为''
	memset(&board[0][0], ' ' , sizeof(board[0][0]) * row * col);
}

 6.打印棋盘

  1)棋盘模样

  2)遍历方法

i.每行遍历法:一行一行的打印
ii.规律法:找出棋盘的规律,可以按照规律进行打印,

  3)代码实现

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	//打印棋盘法1:直接每行每行输出
	/*for (int i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if (i < row - 1)
			printf("---|---|---\n");
	}*/

	//打印棋盘法2:找规律输出
	for (int i = 0; i < row; i++)
	{
		//先搞定数组的输出位置
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);//把每个字符输出
			if (j < col - 1)
				printf("|");//最后一个|不输出
		}
		printf("\n");

		//打印的---|要少一行
		if (i < row - 1)
		{
			for (int i = 0; i < row; i++)
			{
				printf("---");
				if (i < row - 1)
					printf("|");//最后一个|不输出
			}
			printf("\n");
		}
	}
}

 7.玩家下棋

  1)思路分析

实现思路:玩家从键盘输入要下棋的位置,把玩家输入的坐标放入对应的数组索引中,还需要考虑该位置是否已经被玩家或电脑下过,没有被下过,才能继续进行操作

  2)代码实现

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:\n");
	int x = 0;
	int y = 0;
	
	while (1)
	{
		printf("请输入你要下棋的位置(坐标范围:(1-%d,1-%d)):", row, col);
		scanf("%d %d", &x, &y);

		//把不存在的情况排除
		if (x<1 || x > row || y < 1 || y > col)
		{
			printf("你输出的坐标错误,请重新输入~\n\n");
			continue;
		}
		
		//排除坐标已经占用的情况
		if (board[x - 1][y - 1] != ' ')
		{
			printf("该位置已经被占用了,请重新输入坐标~\n\n");
			continue;
		}

		board[x - 1][y - 1] = '*';
		break;
	}
}

 8.电脑下棋

  1)思路分析

思路:电脑在没有占用的数组棋盘中进行随机下棋,一定要确保电脑下棋的位置没有被占用

  2)代码实现

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	int x = 0;
	int y = 0;
	
	while (1)
	{
		x = rand() % row;
		y = rand() % col;

        //保证了电脑下棋的位置没有被占用
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

 9.判断输赢

  1)思路分析

思路:玩家和电脑每走一步的时候,都要进行判断输赢,看看那家已经成功的横着、竖着、×型连成了3个,那家连成了三个那家赢,注意:若是棋盘满了,则平局

  2)代码实现

//判断棋盘是否已满
int IsFull(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//是空格,则棋盘未满
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢:*:玩家赢,#:电脑赢 q:平局 c:继续
char IsWin(char board[ROW][COL], int row, int col)
{
	//判断横着是否连成3个
	for (int 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];
	}

	//判断竖着是否连成3个
	for (int i = 0; i < row; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][i];
	}
	
	//判断交叉线是否连成3个
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
		return board[0][0];
	
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
		return board[0][2];

	//判断棋盘是否已满
	if (IsFull(board, row, col))
	{
		printf("棋盘已满\n");
		return 'q';
	}

	//都没有的情况
	return 'c';
}

 10.game函数的总实现

void game()
{
    //定义二维数组存储棋盘
	char board[ROW][COL];
	char ch = '0';

	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);

	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		//打印棋盘
		DisplayBoard(board, ROW, COL);
		
		//判断输赢
		ch = IsWin(board, ROW, COL);
		if (ch != 'c')
			break;

		//电脑下棋
		ComputerMove(board, ROW, COL);
		//打印棋盘
		DisplayBoard(board, ROW, COL);

		//判断输赢
		ch = IsWin(board, ROW, COL);
		if (ch != 'c')
			break;
	}

	//判断情况:玩家、电脑赢、输、平局的情况
	if (ch == '*')
	{
		printf("玩家赢\n\n");
	}
	else if (ch == '#')
	{
		printf("电脑赢\n\n");
	}
	else
	{
		printf("平局\n\n");
	}
}

三.扫雷详解

 1.看思维导图,理清思路

 2.前提工作 —— 头文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROW 9 //行
#define COL 9 //列
#define ROWS ROW + 2
#define COLS COL + 2
#define MINECOUNT 10 //雷的数量

 

 3.框架

  1)我们常使用do-while循环进行项目开发,因为do-while会先执行后再进行判断条件

  2)菜单

  3)代码实现

void menu()
{
	printf("*****************************\n");
	printf("*******   1.扫雷游戏  *******\n");
	printf("*******   2.退出      *******\n");
	printf("*****************************\n");
}

int main()
{
	int option = 0;
    //设置随机数种子
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &option);

		switch (option)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("你的选择有误,请重新选择~\n");
				break;
		}
	} while (option);
	return 0;
}

 4.扫雷游戏函数具体详细

void game()
{
	//设置雷
	char mine[ROWS][COLS] = { 0 };
	//扫雷过程在此过程进行
	char show[ROWS][COLS] = { 0 };

	//初始化雷区
	//雷是‘1’,非雷‘0’
	InitBoard(mine, ROWS, COLS, '0');

	//扫雷过程中,使用'*'给初始化
	InitBoard(show, ROWS, COLS, '*');

	//打印界面
	DisplayBoard(show, ROW, COL);

	//布置雷
	setMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);

	//排查雷
	findMine(mine, show, ROW, COL);
}

 5.初始化雷区

  1)思路分析

思路:为两个数组分别进行初始化,分别传给两个数组不同的初始化值,给mine数组初始化'0',因为我们要把mine数组设置为种雷的数组,给show数组初始化为'*',因为我们在show数组中进行排雷

  2)代码实现

//初始化
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	//初始化法一
	/*for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}*/

	//初始化法二
	memset(&board[0][0], set, sizeof(board[0][0]) * rows * cols);
}

 6.打印扫雷界面

  1)扫雷界面的图

 

  2)思路分析

思路:我们需要先打印横向的索引,然后再打印每行的*值之前打印竖向的索引 

  3)代码实现

//打印界面
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	//打印横向索引
	for (int i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (int i = 1; i <= row; i++)
	{
		//打印竖向索引
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

 

 7.布置雷

  1)思路分析

思路:我们要再布置雷的数组(mine)中随机布置雷,雷的数量由程序员自己决定

  2)代码实现

//布置雷
void setMine(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;

	//随机设置雷
	while (i < MINECOUNT)
	{
		//随机生成坐标值
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		//判断已经设置过雷
		if (mine[x][y] == '1')
		{
			continue;
		}

		//设置雷
		mine[x][y] = '1';
		i++;
	}
}

 

 8.玩家排查雷

  1)思路分析

思路:

        a.遇到雷则游戏结束,则把所有的雷打印

        b.没有遇到雷则显示周围的八个格子有多少个雷

        c.雷全部排完,则排雷成功

  2)代码实现

//判断周围有多少个坐标
int isMine(char mine[ROWS][COLS], int x, int y)
{
	//判断周围八个坐标有几个雷
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
		+ mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1]
		+ mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0');
}

//排查雷
void findMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	
	while (count < row*col - MINECOUNT)
	{
		printf("请输入你要排查的坐标:");
		scanf("%d %d", &x, &y);

		//坐标合法性判断
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("坐标非法,请重新输入~\n");
			continue;
		}
		
		//判断该地方是不是雷
		if (mine[x][y] == '1')
		{
			printf("踩到雷了,被炸死~\n");
			DisplayBoard(mine, row, col);
			break;
		}

		//获取周围有几个雷
		int ret = isMine(mine, x, y) + '0';//+'0'免得ASCII码值对应不上
		show[x][y] = ret;

		//没有遇到雷,排查量少1
		count++;
		DisplayBoard(show, row, col);
	}

	//排雷成功的情况
	if (count == row * col - MINECOUNT)
	{
		printf("恭喜你,排雷成功~\n");
	}
}

四.三子棋和扫雷的完整代码

 1.三子棋完整代码

  1)game.h头文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//判断输赢
char IsWin(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);

  2)game.c源文件

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	//初始化法1:循环
	/*for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}*/

	//初始化法2:取board数组的首地址,然后把数组中的所有字符置为''
	memset(&board[0][0], ' ' , sizeof(board[0][0]) * row * col);
}


//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	//打印棋盘法1:直接每行每行输出
	/*for (int i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if (i < row - 1)
			printf("---|---|---\n");
	}*/

	//打印棋盘法2:找规律输出
	for (int i = 0; i < row; i++)
	{
		//先搞定数组的输出位置
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);//把每个字符输出
			if (j < col - 1)
				printf("|");//最后一个|不输出
		}
		printf("\n");

		//打印的---|要少一行
		if (i < row - 1)
		{
			for (int i = 0; i < row; i++)
			{
				printf("---");
				if (i < row - 1)
					printf("|");//最后一个|不输出
			}
			printf("\n");
		}
	}
}


//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:\n");
	int x = 0;
	int y = 0;
	
	while (1)
	{
		printf("请输入你要下棋的位置(坐标范围:(1-%d,1-%d)):", row, col);
		scanf("%d %d", &x, &y);

		//把不存在的情况排除
		if (x<1 || x > row || y < 1 || y > col)
		{
			printf("你输出的坐标错误,请重新输入~\n\n");
			continue;
		}
		
		//排除坐标已经占用的情况
		if (board[x - 1][y - 1] != ' ')
		{
			printf("该位置已经被占用了,请重新输入坐标~\n\n");
			continue;
		}

		board[x - 1][y - 1] = '*';
		break;
	}
}

//判断棋盘是否已满
int IsFull(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			//判断坐标是不是为空格
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

//判断输赢:*:玩家赢,#:电脑赢 q:平局 c:继续
char IsWin(char board[ROW][COL], int row, int col)
{
	//判断横着是否连成3个
	for (int 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];
	}

	//判断竖着是否连成3个
	for (int i = 0; i < row; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][i];
	}
	
	//判断交叉线是否连成3个
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
		return board[0][0];
	
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
		return board[0][2];

	//判断棋盘是否已满
	if (IsFull(board, row, col))
	{
		printf("棋盘已满\n");
		return 'q';
	}

	//都没有的情况
	return 'c';
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋:\n");
	int x = 0;
	int y = 0;
	
	while (1)
	{
		x = rand() % row;
		y = rand() % col;

		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

  3)test.c测试文件

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

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

void game()
{
	char board[ROW][COL];
	char ch = '0';

	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);

	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		//打印棋盘
		DisplayBoard(board, ROW, COL);
		
		//判断输赢
		ch = IsWin(board, ROW, COL);
		if (ch != 'c')
			break;

		//电脑下棋
		ComputerMove(board, ROW, COL);
		//打印棋盘
		DisplayBoard(board, ROW, COL);

		//判断输赢
		ch = IsWin(board, ROW, COL);
		if (ch != 'c')
			break;
	}

	//判断情况:玩家、电脑赢、输、平局的情况
	if (ch == '*')
	{
		printf("玩家赢\n\n");
	}
	else if (ch == '#')
	{
		printf("电脑赢\n\n");
	}
	else
	{
		printf("平局\n\n");
	}
}

int main()
{
	int option = 0;
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &option);

		switch (option)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("你选择错误,请重新选择~\n");
				break;
		}

	} while (option);
	return 0;
}

 2.扫雷完整代码

  1)game.h头文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROW 9 //行
#define COL 9 //列
#define ROWS ROW + 2
#define COLS COL + 2
#define MINECOUNT 10 //雷的数量

//初始化雷区
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//显示界面
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//设置雷
void setMine(char mine[ROWS][COLS], int row, int col);
//排查雷
void findMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

  2)game.c源文件

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

//初始化
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	//初始化法一
	/*for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}*/

	//初始化法二
	memset(&board[0][0], set, sizeof(board[0][0]) * rows * cols);
}


//打印界面
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	//打印横向索引
	for (int i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (int i = 1; i <= row; i++)
	{
		//打印竖向索引
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}


//布置雷
void setMine(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;

	//随机设置雷
	while (i < MINECOUNT)
	{
		//随机生成坐标值
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		//判断已经设置过雷
		if (mine[x][y] == '1')
		{
			continue;
		}

		//设置雷
		mine[x][y] = '1';
		i++;
	}
}

//判断周围有多少个坐标
int isMine(char mine[ROWS][COLS], int x, int y)
{
	//判断周围八个坐标有几个雷
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
		+ mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1]
		+ mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0');
}

//排查雷
void findMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int count = 0;
	
	while (count < row*col - MINECOUNT)
	{
		printf("请输入你要排查的坐标:");
		scanf("%d %d", &x, &y);

		//坐标判断
		if (x < 1 || x > row || y < 1 || y > col)
		{
			printf("坐标非法,请重新输入~\n");
			continue;
		}
		
		//判断该地方是不是雷
		if (mine[x][y] == '1')
		{
			printf("踩到雷了,被炸死~\n");
			DisplayBoard(mine, row, col);
			break;
		}

		//获取周围有几个雷
		int ret = isMine(mine, x, y) + '0';//+'0'免得ASCII码值对应不上
		show[x][y] = ret;

		//排雷成功,排查量少1
		count++;
		DisplayBoard(show, row, col);
	}

	//排雷成功的情况
	if (count == row * col - MINECOUNT)
	{
		printf("恭喜你,排雷成功~\n");
	}
}

  3)test.c测试文件

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void menu()
{
	printf("*****************************\n");
	printf("*******   1.扫雷游戏  *******\n");
	printf("*******   2.退出      *******\n");
	printf("*****************************\n");
}

void game()
{
	//设置雷
	char mine[ROWS][COLS] = { 0 };
	//扫雷过程在此过程进行
	char show[ROWS][COLS] = { 0 };

	//初始化雷区
	//雷是‘1’,非雷‘0’
	InitBoard(mine, ROWS, COLS, '0');

	//扫雷过程中,使用'*'给初始化
	InitBoard(show, ROWS, COLS, '*');

	//打印界面
	DisplayBoard(show, ROW, COL);

	//布置雷
	setMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);

	//排查雷
	findMine(mine, show, ROW, COL);
}

int main()
{
	int option = 0;
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &option);

		switch (option)
		{
			case 1:
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("你的选择有误,请重新选择~\n");
				break;
		}
	} while (option);
	return 0;
}

  !!!恭喜你,成功突破至筑基四层!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode51,52 N皇后相关(回溯方法)

题目1&#xff1a;N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题…

入职一年,那个准的下班的人,比我先升职了...

最近心态崩了。 和我同期一道进公司的人又升了一级&#xff0c;可是明明大家在进公司时&#xff0c;他不论是学历还是工作经验&#xff0c;样样都不如自己&#xff0c;眼下不过短短的两年时间便一跃在自己的职级之上&#xff0c;这着实让我有几分不甘心。 我想不明白&#xff…

谈谈Linux epoll惊群问题的原因和解决方案

近期排查了一个问题&#xff0c;epoll惊群的问题&#xff0c;起初我并不认为这是惊群导致&#xff0c;因为从现象上看&#xff0c;只是体现了CPU不均衡。一共fork了20个Server进程&#xff0c;在请求负载中等的时候&#xff0c;有三四个Server进程呈现出比较高的CPU利用率&…

OpenCV 图像平滑处理

本文是OpenCV图像视觉入门之路的第10篇文章&#xff0c;本文详细的在图像上面进行了图像均值滤波、方框滤波 、高斯滤波、中值滤波、双边滤波、2D卷积等操作。 OpenCV 图像平滑处理目录 1 均值滤波 2 方框滤波 3 高斯滤波 4 中值滤波 5 双边滤波 6 2D卷积(自定义…

电子技术——分立MOS放大电路

电子技术——分立MOS放大电路 有了前两节的学习&#xff0c;即三种放大器配置和偏置方法之后&#xff0c;我们可以通过现成的分立晶体管、电阻、电容等搭建分立MOS放大电路。 DC偏置基本结构 在本节我们选用的DC偏置基本结构是如图所示的源极恒流源的偏置方案&#xff0c;下图…

用#define宏实现Add函数

✋作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C语言 我们知道#define宏是一种非常暴力的替换&#xff0c;宏定义会在程序编译预处理阶段在调用宏的位置进行文本内容的直接替换&#xff0c;因此我们在使用宏定义实现Add加法函数时就要注意一些可能会报错的问题。 …

第九层(10):STL之函数对象

文章目录前情回顾函数对象概念特点谓词概念内建函数对象分类算术仿函数关系仿函数逻辑仿函数下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更新有关C/C语法&a…

你是如何学习 Java 的?

每一个行业中能成为大佬的人&#xff0c;一定都有他自己一套具有独到见解的方法...... 这个问题我很有发言权&#xff0c;从刚毕业做Java实习生月薪2k&#xff0c;到现在干了5年Java开发月薪43k&#xff0c;一直都在保持不断学习的状态。以我个人的经验来看&#xff0c;一个程…

视频分割新范式:视频感兴趣物体实例分割 VOIS

1. 背景视频中物体分割是视频理解的基础算法&#xff0c;也是对淘宝商品视频分析和加工所依赖的重要能力。传统的视频分割任务一般分为两种类型&#xff1a;一种是VOS&#xff08;Video Object Segmentation&#xff09;&#xff0c;该任务需要在第一帧给出物体的初始分割标注&…

Linux系列 目录和文件管理

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 简介 本章重点 一.检查文本内容 ​编辑 1.cat命令——显示并…

MySQL分表查询之Merge存储引擎实现

概念介绍 MySQL 分表之后怎么进行联合查询&#xff1f;用有表数量限制的 union all&#xff0c;还是汇总到一张表再查询&#xff0c;亦或用Sphinx&#xff08; 高性能SQL全文检索引擎 &#xff09;&#xff1f; 在这篇文章里&#xff0c;介绍使用 Merge [mɜːrdʒ] 存储引擎…

浅读人月神话(2)

读书笔记&#xff1a;今日翻书浅读&#xff0c;从《为什么巴比伦塔会失败》开始至《干将莫邪》结束&#xff0c;巴比伦塔的建造对当下项目推进有广泛借鉴意义&#xff0c;今天这几个章节在PMBOK中有一些可以互相对照学习的内容&#xff0c;《为什么巴比伦塔会失败&#xff1f;》…

荔枝派 zero 使用 Jlink 调试

Jlink 所谓硬件版本&#xff0c;就是这个调试器的硬件是第几代&#xff0c;我手上的这个是 V8 所谓固件版本&#xff0c;就是这个调试器主芯片中内置的软件是什么版本&#xff0c;我刷入的是 J-Link ARM V8 compiled Nov 28 2014 13:44:46 所谓 Jlink 工具版本&#xff0c;就…

记录--原生 canvas 如何实现大屏?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 可视化大屏该如何做&#xff1f;有可能一天完成吗&#xff1f;废话不多说&#xff0c;直接看效果&#xff0c;线上 Demo 地址 lxfu1.github.io/large-scree…。 看完这篇文章(这个项目)&#xff…

在线支付系列【13】微信支付之签名验签流程分析

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言签名生成签名验证总结前言 在上篇文档中&#xff0c;我们简单实现了对接微信支付的几个接口。了解到wechatpay-apache-httpclient框架自动实现了签名和验签&#xff0c;接下来跟踪下源码&a…

LeetCode-136. 只出现一次的数字

目录题目分析哈希集位运算题目来源 https://leetcode.cn/problems/single-number/ 题目分析 题目有个条件可谓相当重要&#xff0c;即凡重复的元素最多重复一次&#xff08;原话&#xff1a;给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个…

详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

文章目录1. 描述1.1 MybatisPlusInterceptor1.2 InnerInterceptor2. 实现2.1 不带条件的分页查询2.2 带条件的分页查询2.3 简述Page类3. 注意事项1. 描述 1.1 MybatisPlusInterceptor 我们在开发的过程中&#xff0c;经常会遇到分页操作&#xff0c;其分为逻辑分页和物理分页…

Gif动态图片如何用静图制作?教你静图合成动图的方法

gif动图如何制作&#xff1f;相信对于gif动图大家都不陌生&#xff0c;在平时的聊天软件中、公众号文章中都可以看到。那么&#xff0c;要如何制作gif动图呢&#xff1f;下面&#xff0c;就给教大家两个在线gif制作&#xff08;https://www.gif.cn/&#xff09;的方法&#xff…

综合案例【商品管理系统-Java基础版】(附完整源码)

Java语言的一个超级简易的商品管理系统&#xff0c;适合初学者练手 源码包无法上传至资源&#xff08;blog已经超级完整啦&#xff09;如果还是需要完整源码src包可私分享 目录1 项目分析1.1 用户模块&#xff08;普通用户、管理员用户&#xff09;1.1.1前端系统&#xff08;普…

FluentReader为什么称之为高颜值的rss阅读器

Fluent Reader 这是一款 RSS 阅读器。对于很多年轻的网友来说&#xff0c;RSS 这个名词可能有点陌生。简单来说只要某个网站支持 RSS&#xff0c;你订阅了 RSS 后&#xff0c;一旦网站更新了内容&#xff0c;就会推送到你面前。这时候&#xff0c;我们就需要一款像 Fluent Rea…