Dragaminas
proceso de desarrollo
- Preparación
- Mostrar resultados
Preparación:
game.h un archivo de encabezado -> declara la función
test.c como el archivo principal
game.c como el archivo de implementación de la función
Mostrar resultados
ideas de desarrollo
-
interfaz de menú
-
Impresión de interfaz de juego (matriz bidimensional)
-
engendro aleatorio de truenos
-
Desminado (y juzgando el número de minas alrededor)
-
condición de victoria
La idea general es así, analicémosla paso a paso
interfaz de menú
void menu()
{
printf("*********************\n");
printf("*** 1.play 0.exit ***\n");
printf("*********************\n");
}
aqui hay que seguir Recibir entrada del usuario, cuando sea 1, ingrese al juego, cuando sea 0, salga del programa,
piense directamente en el juicio de declaración condicional, aquí usamos el interruptor
Continuo : después de que el usuario termina el juego, el menú se puede imprimir nuevamente para que el usuario elija
Esta operación es, por supuesto, la parte central del proyecto, situada enfunción principaladentro
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("退出游戏");
break;
default:
printf("输入有误!!!");
break;
}
} while (input);
return 0;
}
Impresión de la interfaz del juego.
Por supuesto, aquí se usa una matriz bidimensional, pero tenemos que considerar si puede lograr el efecto de desminado desinformado si solo se usa una matriz.
Por supuesto, una matriz no es posible, por lo que tenemos que creardos matrices,
uno es real y el otro se muestra al usuario
char mine[ROWS][COLS] = {
0 };//存放布置好的雷的信息
char show[ROWS][COLS] = {
0 };//存放排查出雷的信息
Aquí tenemos que pensarlo primero. Si la matriz es de 9 × 9, cuando esté en el borde, seráfuera de los límites
Podemos crear una matriz de 11 × 11, de los cuales no usamos el más externo, solo establecemos como valor predeterminado
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
Inicialización del mapa
//mine 数组在没有布置雷的时候全为 0
InitBoard(mine, ROWS, COLS, '0');
//show 数组在没有排查雷的时候全为 *
InitBoard(show, ROWS, COLS, '*');
Nuestra función InitBoard es:
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
impresión de mapas
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
printf("-----------扫雷游戏--------------\n");
//打印上面0~9注释
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i); //打印竖着1~9的注释
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------扫雷游戏--------------\n");
}
engendro aleatorio de truenos
Es fácil para nosotros pensar que se trata de generar números aleatorios y cambiar los valores de los elementos de su matriz.
Eso es todofunción srand()
//设置随机数的起始
srand((unsigned int)time(NULL));
Función generada aleatoriamente:
Definimos EASY_COUNT (el número de minas) en el archivo de cabecera
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
//横纵坐标1~9
while (count)
{
int d = rand() % row + 1;
int c = rand() % col + 1;
//随机生成十个雷,雷:1
if (board[d][c] == '0')
{
board[d][c] = '1';
count--;
}
}
}
Buscaminas y determina las condiciones de victoria.
Dragaminas
Deje que el usuario ingrese una coordenada y juzgue su valor
- Si la coordenada en la matriz show es *, la coordenada se ha borrado
- Si la coordenada en la matriz de minas es 1, no podrá ser bombardeada por la mía.
- De lo contrario, determine cuántas minas hay en la matriz de minas y muestre el número en las coordenadas de la matriz de visualización
Determinar si ingresar coordenadas repetidamente
if (show[x][y] != '*')
{
printf("该坐标已经排查过了,请重新输入:>\n");
}
El código fallido es muy simple, solo un juicio.
if (mine[x][y] == '1') //是雷
{
printf("被炸死咯\n");
DisplayBoard(mine, ROW, COL);
break;
}
La función de juzgar cuántas minas hay alrededor es
int get_mine_count(char board[ROWS][COLS], int x, int y)
{
return (board[x - 1][y] +
board[x - 1][y - 1] +
board[x - 1][y + 1] +
board[x][y + 1] +
board[x][y - 1] +
board[x + 1][y - 1] +
board[x + 1][y] +
board[x + 1][y + 1]- 8*'0');
}
La función de toda la operación es
void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
int x = 0, y = 0;
int a = 0, b = 0;
int win = 0;
while (win<row*col-EASY_COUNT)//判断胜利条件,win小于整体-雷数
{
printf("请输入排查的坐标:>\n");
scanf("%d %d", &a, &b);
x = a + 1;
y = b + 1;
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] != '*')
{
printf("该坐标已经排查过了,请重新输入:>\n");
}
else
{
if (mine[x][y] == '1') //是雷
{
printf("被炸死咯\n");
DisplayBoard(mine, ROW, COL);
break;
}
else //不是雷 '0'-'0'=0 '1'-'0'=1 字符->整型
// ASCII码值分别为 '1':49 '0':48
{
int count = get_mine_count(mine, x, y);//统计该坐标周围有几颗雷
show[x][y] = count + '0';//转换成数字字符
//printf("%c\n", count + '0');
DisplayBoard(show, ROW, COL);
win++;
}
}
}
else
{
printf("输入坐标错误,请重新输入:>\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,扫雷成功!!!\n");
DisplayBoard(mine, ROW, COL);
}
}
integración de código
prueba.c
#include "game.h"
void menu()
{
printf("*********************\n");
printf("*** 1.play 0.exit ***\n");
printf("*********************\n");
}
void game()
{
char mine[ROWS][COLS] = {
0 };//存放布置好的雷的信息
char show[ROWS][COLS] = {
0 };//存放排查出雷的信息
//初始化数组的内容为指定内容
//mine 数组在没有布置雷的时候全为 0
InitBoard(mine, ROWS, COLS, '0');
//show 数组在没有排查雷的时候全为 *
InitBoard(show, ROWS, COLS, '*');
//DisplayBoard(mine,ROW, COL);
//设置雷
SetMine(mine, ROW, COL);
//展示
DisplayBoard(show, ROW, COL);
//排雷
FindMine(mine,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("退出游戏");
break;
default:
printf("输入有误!!!");
break;
}
} while (input);
return 0;
}
juego.c
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
printf("-----------扫雷游戏--------------\n");
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");
}
printf("-----------扫雷游戏--------------\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;
//横纵坐标1~9
while (count)
{
int d = rand() % row + 1;
int c = rand() % col + 1;
//随机生成十个雷,雷:1
if (board[d][c] == '0')
{
board[d][c] = '1';
count--;
}
}
}
int get_mine_count(char board[ROWS][COLS], int x, int y)
{
return (board[x - 1][y] +
board[x - 1][y - 1] +
board[x - 1][y + 1] +
board[x][y + 1] +
board[x][y - 1] +
board[x + 1][y - 1] +
board[x + 1][y] +
board[x + 1][y + 1]- 8*'0');
}
void FindMine(char mine[ROW][COL], char show[ROW][COL], int row, int col)
{
int x = 0, y = 0;
int a = 0, b = 0;
int win = 0;
while (win<row*col-EASY_COUNT)//判断胜利条件,win小于整体-雷数
{
printf("请输入排查的坐标:>\n");
scanf("%d %d", &a, &b);
x = a + 1;
y = b + 1;
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] != '*')
{
printf("该坐标已经排查过了,请重新输入:>\n");
}
else
{
if (mine[x][y] == '1') //是雷
{
printf("被炸死咯\n");
DisplayBoard(mine, ROW, COL);
break;
}
else //不是雷 '0'-'0'=0 '1'-'0'=1 字符->整型
// ASCII码值分别为 '1':49 '0':48
{
int count = get_mine_count(mine, x, y);//统计该坐标周围有几颗雷
show[x][y] = count + '0';//转换成数字字符
//printf("%c\n", count + '0');
DisplayBoard(show, ROW, COL);
win++;
}
}
}
else
{
printf("输入坐标错误,请重新输入:>\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,扫雷成功!!!\n");
DisplayBoard(mine, ROW, COL);
}
}
juego.h
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 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 board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROW][COL],char show[ROW][COL], int row, int col);