Lenguaje C elemental - juego de buscaminas

        No hay mucho que decir, vaya directamente al código.


contenido

1. Crear un entorno de proyecto

2. archivo prueba.c

3. Crea la función del juego

4. Crea el tablero de ajedrez

 5. Coloque las minas

6. Solucionar problemas de minas

7. Implementación final

Conclusión:


1. Crear un entorno de proyecto

No hay mucho que decir aquí, es lo mismo que el ajedrez.


2. archivo prueba.c


#include "game.h"//引用自己创建的头文件,可以把stdio.h这个头文件包括在那里面

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

void game()
{
    //游戏的逻辑在game函数中去实现
}
void test()
{
	int input = 0;
	do
	{
		menu();//打印菜单,1.代表玩游戏,0.代表退出
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://玩游戏
			game();//游戏的逻辑在game函数中去实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

3. Crea la función del juego

La lógica del juego se explica aquí y luego podemos comenzar a escribir código. 

Entonces, en el archivo de encabezado game.h, las variables globales definidas se pueden escribir así

 Porque no solo el 9, sino también el 11 se usará más adelante.


4. Crea el tablero de ajedrez

void game()
{
	//扫雷游戏的实现
	char mine[ROWS][COLS] = { 0 };//初始化成'0'
	char show[ROWS][COLS] = { 0 };//初始化成'*'
	//初始化棋盘
	Init_board(mine, ROWS, COLS, '0');//初始化成'0'
	Init_board(show, ROWS, COLS, '*');//初始化成'*'
	//打印棋盘
	show_board(mine, ROW, COL);//虽然创建的是11*11的棋盘,但我们只想看到的是中间的9*9
	show_board(show, ROW, COL);
}
void Init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("--------扫雷--------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

Aquí primero imprima dos tableros de ajedrez para ver el efecto.

Entonces, cuando realmente queremos imprimir el tablero de ajedrez, se muestra la matriz '*'. 


 5. Coloque las minas

void game()
{
	//扫雷游戏的实现
	//mine是用来存放布置好的雷的信息
	//char mine[ROWS][COLS] = { 0 };//初始化成'0'
	//show是用来存放排查出的雷的信息
	//char show[ROWS][COLS] = { 0 };//初始化成'*'
	//初始化棋盘
	//Init_board(mine, ROWS, COLS, '0');
	//Init_board(show, ROWS, COLS, '*');
	//打印棋盘
	//show_board(mine, ROW, COL);//虽然创建的是11*11的棋盘,但我们只想看到的是中间的9*9
	
    //布置雷
	set_mine(mine, ROW, COL);
}
void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		//这里还是11*11的数组,生成的随机数范围是0~9,加1就可以变成1~10,正好对应需要的中间的9*9的数组
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';//布置雷
		}
		count--;
	}
}

        Los números aleatorios se usan aquí nuevamente, por lo que la misma rutina, el archivo de encabezado, srand ((int sin firmar) tiempo (NULL));. '1' es una mina generada aleatoriamente.

       La imagen de arriba es solo para ver la ubicación de la mina generada, pero cuando realmente juegas, no puedes ver nada, por lo que debes cambiar la mina en la función show_board en el // diseño de la mina para mostrar, y se cambiará después del cambio se convierte en el tablero de ajedrez de abajo.


6. Solucionar problemas de minas

void game()
{
	//扫雷游戏的实现
	//mine是用来存放布置好的雷的信息
	//char mine[ROWS][COLS] = { 0 };//初始化成'0'
	//show是用来存放排查出的雷的信息
	//char show[ROWS][COLS] = { 0 };//初始化成'*'
	//初始化棋盘
	//Init_board(mine, ROWS, COLS, '0');
	//Init_board(show, ROWS, COLS, '*');
	//打印棋盘
	//show_board(mine, ROW, COL);//虽然创建的是11*11的棋盘,但我们只想看到的是中间的9*9
	//布置雷
	//set_mine(mine, ROW, COL);
	//show_board(show, ROW, COL);
	
    //排查雷
	find_mine(mine, show, ROW, COL);
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] +//这里解释一下,如果周围的坐标被放置了雷,该坐标就会被设置成字符'1',不是雷就还是'0',字符1和字符0的ASCII码值相差1,所以返回值就是周围雷的个数
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1]) - 8 * '0';
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)//10个雷,那就剩下71个位置,把71个位置都排完,就是排雷成功
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,被炸死了\n");
				show_board(mine, ROW, COL);
				break;
			}
			else
			{
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';
				show_board(show, ROW, COL);
				win++;//每排完一个位置就减少一个需要排的位置
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine, ROW, COL);
	}
}

7. Implementación final

Todo el código adjunto:

archivo juego.h:

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

//初始化棋盘
void Init_board(char arr[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void show_board(char arr[ROWS][COLS], int row, int col);

//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);

//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

archivo juego.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void Init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("--------扫雷--------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}

void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	int x = 0;
	int y = 0;
	while (count)
	{
		//这里还是11*11的数组,生成的随机数范围是0~9,加1就可以变成1~10,正好对应需要的中间的9*9的数组
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';//布置雷
			count--;
		}
	}
}

int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y] +
		mine[x - 1][y - 1] +
		mine[x][y - 1] +
		mine[x + 1][y - 1] +
		mine[x + 1][y] +
		mine[x + 1][y + 1] +
		mine[x][y + 1] +
		mine[x - 1][y + 1]) - 8 * '0';
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,被炸死了\n");
				show_board(mine, ROW, COL);
				break;
			}
			else
			{
				int count = get_mine_count(mine, x, y);
				show[x][y] = count + '0';
				show_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		show_board(mine, ROW, COL);
	}
}

archivo prueba.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"//引用自己创建的头文件,可以把stdio.h这个头文件包括在那里面

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

void game()
{
	//扫雷游戏的实现
	//mine是用来存放布置好的雷的信息
	char mine[ROWS][COLS] = { 0 };//初始化成'0'
	//show是用来存放排查出的雷的信息
	char show[ROWS][COLS] = { 0 };//初始化成'*'

	//初始化棋盘
	Init_board(mine, ROWS, COLS, '0');
	Init_board(show, ROWS, COLS, '*');
	//打印棋盘
	//show_board(mine, ROW, COL);//虽然创建的是11*11的棋盘,但我们只想看到的是中间的9*9
	//布置雷
	set_mine(mine, ROW, COL);
	show_board(show, ROW, COL);
	//排查雷
	find_mine(mine, show, ROW, COL);
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//打印菜单,1.代表玩游戏,0.代表退出
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1://玩游戏
			game();//游戏的逻辑在game函数中去实现
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

Conclusión:

       Luego, estos dos juegos han sido escritos y se siente muy bien. Solo uso el conocimiento relevante del lenguaje C y no he usado los más complicados, así que mientras trabajes duro, puedes escribir un código más hermoso.

Supongo que te gusta

Origin blog.csdn.net/m0_64607843/article/details/122652624
Recomendado
Clasificación