Dragueur de mines
avant-propos
Le démineur est le même que le backgammon, qui peut bien exercer notre capacité d'analyse logique, et mieux comprendre et appliquer les connaissances que nous avons apprises ( tableaux, boucles et branches, etc. )
Regles du jeu
Je crois que beaucoup de gens ont été exposés à ce jeu à l'école primaire, mais le sujet sait aussi y jouer récemment, regardons les règles du jeu
Cliquez sur le carré avec la souris, si c'est une mine, le jeu échouera ;
si ce n'est pas une mine, le nombre de mines dans les 8 grilles adjacentes sera compté
Réalisation du jeu
Besoin d'utiliser, deux fichiers .c et un fichier .h
Le fichier démineur contient notre fonction d'appel principale, la fonction de jeu contient la partie principale de l'implémentation du jeu, le fichier d'en-tête est utilisé pour stocker les déclarations de fonction, l'inclusion du fichier d'en-tête et les définitions de macro
C'est clair et net, jetant une certaine base pour la future coopération multi-personnes
fonction d'appel
Après de nombreuses utilisations, je pense que vous connaissez déjà bien cette partie
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"//使用时记得包含头文件,用“”’。
menu()
{
printf("******************************\n");
printf("***********1.play ************\n");
printf("******************************\n");
printf("***********0.exit ************\n");
printf("******************************\n");
}
game()
{
}
int main()
{
srand((unsigned int)time(NULL));
int n;
do
{
menu();
printf("请输入你的选择\n");
scanf("%d", &n);
switch(n)
{
case 1:
game();
break;
case 0:
printf("你已退出游戏\n");
break;
default :
printf("输入错误\n");
break;
}
} while (n);
return 0;
}
conception du jeu()
Cette partie est également le cœur du jeu
et est principalement divisée en trois parties
1. Création, initialisation et affichage de l'échiquier
2. Disposition des mines
3. Mines saisies par les joueurs
1. Échiquier
(1) Création de l'échiquier
L'échiquier a besoin d'un tableau à deux dimensions, un tableau est utilisé pour stocker des données et l'autre pour l'affichage.
Par conséquent, pour le créer dans game()
, définissez d'abord une macro (dans le fichier d'en-tête du jeu)
afin que notre échiquier peut être personnalisé en taille, sans faire glisser déplacer tout le corps
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
Nous prévoyons de créer un échiquier 9*9
, alors créez-le dans game()
char board_mine[ROWS][COLS] = {
0 };
char board_show[ROWS][COLS] = {
0 };
Il y aura certainement des amis qui se demanderont
pourquoi ROWS COLS est utilisé ?
(2) L'initialisation de l'échiquier
est créée dans game()
init_board(board_mine, board_show, ROWS, COLS)
Définir la fonction dans le fichier game.c
void init_board(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board_mine[i][j] = '0';
board_show[i][j] = '*';
}
}
}
(3) Imprimer l'échiquier
créé dans game()
display_board(board_show, ROW, COL);
Définir la fonction dans le fichier game.c
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("--------扫雷--------\n");
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
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");
}
2. Disposition des rayons
Créé dans le jeu()
set_board(board_mine, ROW, COL);
Situé dans le fichier game.c
EASY est défini par #define, le nombre de mines utilisées pour organiser est effectué dans le fichier d'en-tête du jeu et
la graine du nombre aléatoire se trouve dans la fonction d'appel principale
srand((unsigned int)time(NULL));//随机数种子
void set_board(char board_mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = EASY;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board_mine[x][y] == '0')
{
board_mine[x][y] = '1';
count--;
}
}
}
3. Vérifiez le mien
Créé dans le jeu()
find_mine(board_mine, board_show, ROW, COL);
implémenté dans game.c
int cal(char board_mine[ROWS][COLS], int x, int y)
{
return board_mine[x + 1][y - 1] +
board_mine[x - 1][y - 1] +
board_mine[x][y - 1] +
board_mine[x + 1][y] +
board_mine[x - 1][y]
+board_mine[x + 1][y + 1] +
board_mine[x][y + 1] +
board_mine[x - 1][y + 1] - 8 * '0';
}
void find_mine(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col-EASY)
{
printf("输入要排查的坐标\n");
scanf("%d %d", &x, &y);
if (x <= row && x >= 1 && y <= col && y >= 1)
{
if (board_mine[x][y] == '1')
{
printf("你被炸死了\n");
display_board(board_mine, ROW, COL);
break;
}
else
{
int ret = cal(board_mine, x, y);
board_show[x][y] = ret+'0';
display_board(board_show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == row * col - EASY)
{
printf("恭喜你,排雷成功\n");
display_board(board_mine, ROW, COL);
}
}
code source
fonction d'appel
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
menu()
{
printf("******************************\n");
printf("***********1.play ************\n");
printf("******************************\n");
printf("***********0.exit ************\n");
printf("******************************\n");
}
game()
{
//棋盘的创建
char board_mine[ROWS][COLS] = {
0 };
char board_show[ROWS][COLS] = {
0 };
//棋盘初始化
init_board(board_mine, board_show, ROWS, COLS);
//展示棋盘
/*display_board(board_mine, ROW, COL);*/
display_board(board_show, ROW, COL);
//布置雷
set_board(board_mine, ROW, COL);
/*display_board(board_mine, ROW, COL);*/
//排查雷
find_mine(board_mine, board_show, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int n;
do
{
menu();
printf("请输入你的选择\n");
scanf("%d", &n);
switch(n)
{
case 1:
game();
break;
case 0:
printf("你已退出游戏\n");
break;
default :
printf("输入错误\n");
break;
}
} while (n);
return 0;
}
jeu.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void init_board(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board_mine[i][j] = '0';
board_show[i][j] = '*';
}
}
}
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("--------扫雷--------\n");
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
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 set_board(char board_mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = EASY;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board_mine[x][y] == '0')
{
board_mine[x][y] = '1';
count--;
}
}
}
int cal(char board_mine[ROWS][COLS], int x, int y)
{
return board_mine[x + 1][y - 1] +
board_mine[x - 1][y - 1] +
board_mine[x][y - 1] +
board_mine[x + 1][y] +
board_mine[x - 1][y]
+board_mine[x + 1][y + 1] +
board_mine[x][y + 1] +
board_mine[x - 1][y + 1] - 8 * '0';
}
void find_mine(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win<row*col-EASY)
{
printf("输入要排查的坐标\n");
scanf("%d %d", &x, &y);
if (x <= row && x >= 1 && y <= col && y >= 1)
{
if (board_mine[x][y] == '1')
{
printf("你被炸死了\n");
display_board(board_mine, ROW, COL);
break;
}
else
{
int ret = cal(board_mine, x, y);
board_show[x][y] = ret+'0';
display_board(board_show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == row * col - EASY)
{
printf("恭喜你,排雷成功\n");
display_board(board_mine, ROW, COL);
}
}
jeu.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define EASY 10
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
void init_board(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int rows, int cols);
void display_board(char board[ROWS][COLS], int row, int col);
void set_board(char board_mine[ROWS][COLS], int row, int col);
void find_mine(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int row, int col);
Je crois qu'après avoir lu l'article, vous y gagnerez quelque chose, progressons ensemble