包含结构体的扫雷c语言带注释
时间: 2023-11-08 14:51:20 浏览: 33
以下是一个简单的扫雷游戏的C语言代码,包含了结构体和注释。代码中使用了二维数组来表示游戏面板,结构体用于存储每个方格的状态信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9 // 行数
#define COL 9 // 列数
// 方格状态
typedef struct {
int has_mine; // 是否有地雷
int is_opened; // 是否已经翻开
int is_flagged; // 是否被标记为地雷
} Cell;
// 初始化方格状态
void init_board(Cell board[][COL]) {
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j].has_mine = 0;
board[i][j].is_opened = 0;
board[i][j].is_flagged = 0;
}
}
}
// 随机生成地雷
void generate_mine(Cell board[][COL], int num_mines) {
int i, j, count = 0;
while (count < num_mines) {
i = rand() % ROW;
j = rand() % COL;
if (!board[i][j].has_mine) {
board[i][j].has_mine = 1;
count++;
}
}
}
// 显示游戏面板
void display_board(Cell board[][COL]) {
int i, j;
printf(" ");
for (i = 0; i < COL; i++) {
printf("%d ", i);
}
printf("\n");
printf(" ");
for (i = 0; i < COL; i++) {
printf("- ");
}
printf("\n");
for (i = 0; i < ROW; i++) {
printf("%d| ", i);
for (j = 0; j < COL; j++) {
if (board[i][j].is_opened) {
if (board[i][j].has_mine) {
printf("* ");
} else {
printf("%d ", count_mines(board, i, j));
}
} else if (board[i][j].is_flagged) {
printf("F ");
} else {
printf(". ");
}
}
printf("|\n");
}
printf(" ");
for (i = 0; i < COL; i++) {
printf("- ");
}
printf("\n");
}
// 统计周围地雷数量
int count_mines(Cell board[][COL], int row, int col) {
int i, j, count = 0;
for (i = row - 1; i <= row + 1; i++) {
for (j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < ROW && j >= 0 && j < COL && board[i][j].has_mine) {
count++;
}
}
}
return count;
}
// 翻开一个方格
void open_cell(Cell board[][COL], int row, int col) {
if (row < 0 || row >= ROW || col < 0 || col >= COL || board[row][col].is_opened || board[row][col].is_flagged) {
return;
}
board[row][col].is_opened = 1;
if (board[row][col].has_mine) {
printf("Boom! You lose!\n");
exit(0);
}
if (count_mines(board, row, col) == 0) {
open_cell(board, row - 1, col - 1);
open_cell(board, row - 1, col);
open_cell(board, row - 1, col + 1);
open_cell(board, row, col - 1);
open_cell(board, row, col + 1);
open_cell(board, row + 1, col - 1);
open_cell(board, row + 1, col);
open_cell(board, row + 1, col + 1);
}
}
// 标记一个方格为地雷
void flag_cell(Cell board[][COL], int row, int col) {
if (row < 0 || row >= ROW || col < 0 || col >= COL || board[row][col].is_opened) {
return;
}
board[row][col].is_flagged = !board[row][col].is_flagged;
}
int main() {
srand(time(NULL));
Cell board[ROW][COL];
init_board(board);
generate_mine(board, 10);
display_board(board);
while (1) {
int row, col;
char command[10];
printf("Please enter row and column (e.g. 3 4), or flag/unflag (e.g. f 3 4): ");
scanf("%s %d %d", command, &row, &col);
if (command[0] == 'f') {
flag_cell(board, row, col);
} else {
open_cell(board, row, col);
}
display_board(board);
}
return 0;
}
```