c buscaminas basico

 Al igual que el backgammon, la función principal primero diseña la interfaz del menú del juego, que no se mostrará aquí.

Inicializa la placa

El tamaño del buscaminas principal es un tablero de 9 x 9 , pero las minas se eliminan en un círculo (8 cuadrículas) y se puede cruzar el borde . La matriz se amplía y las filas y columnas aumentan en 2, por lo que usamos una matriz de 11 * 11 para inicializar el tablero de ajedrez.

Al mismo tiempo, para que el jugador localice las coordenadas de qué fila y columna, debemos imprimir las filas y columnas.

#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2
//初级10个雷
#define EASY_COUNT 10

Como hay dos tableros de ajedrez, podemos pasar un parámetro de carácter más para inicializar diferentes tableros de ajedrez.

void init_mine(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;
		}
	}
}

impresión de tablero de ajedrez

Debido a la particularidad del juego del buscaminas, necesitamos diseñar dos tableros de ajedrez, uno para la información de ubicación de las minas (almacena dos caracteres, 0 significa que no hay minas, 1 significa que hay minas) y uno se usa para liberar la información de las minas detectadas (* está en el interfaz predeterminada, los caracteres numéricos representan el número de 8 grises circundantes).

void display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);//列打印
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);//行打印
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

 Dado que la matriz comienza desde el subíndice 1, aquí podemos imprimir un 0 para alinear y evitar la desalineación de las filas y columnas impresas.

 rayo fijo

Suelte minas al azar en el tablero de ajedrez 9*9, las minas están representadas por el carácter 1 y 10 minas se colocan en el nivel primario.

void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int n = EASY_COUNT;
	while (n--)
	{
		int i = rand() % row+1;//1~9
		int j = rand() % col+1;
		if (mine[i][j] == '0')
			mine[i][j] = '1';
	}
}

 Efecto:

  

Encuentra a Ray

        Hay varios procesos para encontrar minas, primero selecciona las coordenadas y luego muestra si las coordenadas son minas o áreas seguras, si son minas, el juego ha terminado. Si es un área segura, es necesario juzgar cuántas minas hay en semanas 4. La condición ganadora es marcar todas las áreas seguras para ganar . Sobre esta base, también es necesario verificar si las coordenadas están fuera de los límites y si se han verificado.

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 < col * row - EASY_COUNT)
	{
		printf("请输入要排查雷的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y>=1 && y<=col)
		{
			if (mine[x][y] != '1')
			{
				if (show[x][y] == '*')
				{
					int ret = get_mine_count(mine, x, y);
					show[x][y] = ret + '0';//得到雷的个数(字符)
					display_board(show, ROW, COL);
					win++;
				}
				else printf("坐标被占用\n");
			}
			else
			{
				printf("踩雷了,游戏结束\n");
				break;
			}
				
		}
		else
		{
			printf("坐标非法\n" );
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		display_board(mine, ROW, COL);
	}
}

moverse rayo

Usamos la característica de que los códigos ASCII de 0~1 caracteres son continuos (la diferencia es 1), y sumamos y restamos 8 valores de código ASCII de '0' para obtener el número de minas.

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');

}

Durante la prueba, podemos imprimir la matriz de minas, lo cual es conveniente para observar si hay números correspondientes de minas alrededor. La victoria del juego de prueba también se puede configurar en un mayor número de minas para juzgar si la victoria se produce normalmente. 

código completo

//game.c
#include "game.h"
void init_mine(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;
		}
	}
}
void display_board(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (j = 0; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
void set_mine(char mine[ROWS][COLS], int row, int col)
{
	int n = EASY_COUNT;
	while (n--)
	{
		int i = rand() % row+1;//1~9
		int j = rand() % col+1;
		if (mine[i][j] == '0')
			mine[i][j] = '1';
	}
}
static 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 < col * row - EASY_COUNT)
	{
		printf("请输入要排查雷的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y>=1 && y<=col)
		{
			if (mine[x][y] != '1')
			{
				if (show[x][y] == '*')
				{
					int ret = get_mine_count(mine, x, y);
					show[x][y] = ret + '0';//得到雷的个数(字符)
					display_board(show, ROW, COL);
					win++;
				}
				else printf("坐标被占用\n");
			}
			else
			{
				printf("踩雷了,游戏结束\n");
				break;
			}
				
		}
		else
		{
			printf("坐标非法\n" );
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
		display_board(mine, ROW, COL);
	}
}
//test.c

#include "game.h"

void menu()
{
	printf("            1. play          \n");
	printf("            0. exit          \n");
}
void game()
{
	char board[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	init_mine(show, ROWS, COLS, '*');
	init_mine(board, ROWS, COLS, '0');
	set_mine(board, ROW, COL);

	display_board(board, ROW, COL);
	display_board(show, ROW, COL);

	find_mine(board, show, ROW, COL);
	display_board(show, ROW, COL);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

//game.h
#define _CRT_SECURE_NO_WARNINGS 1
#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_mine(char board[ROWS][COLS], int row, int col, char set);

//打印棋盘
void display_board(char board[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);

Supongo que te gusta

Origin blog.csdn.net/dwededewde/article/details/132191808
Recomendado
Clasificación