写一个扫雷的小游戏用c语言实现
时间: 2023-10-09 20:16:27 浏览: 88
以下是一个简单的扫雷小游戏的示例代码,使用C语言实现:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 9
#define COLS 9
#define MINE_NUM 10
void init_board(char board[ROWS][COLS], int rows, int cols, char ch);
void display_board(char board[ROWS][COLS], int row, int col);
void set_mines(char board[ROWS][COLS], int row, int col, int num);
int get_mine_count(char board[ROWS][COLS], int row, int col, int x, int y);
int main() {
char board[ROWS][COLS];
int x, y, left;
char input;
srand((unsigned int)time(NULL));
init_board(board, ROWS, COLS, '*');
set_mines(board, ROWS, COLS, MINE_NUM);
left = ROWS * COLS - MINE_NUM;
printf("Welcome to Minesweeper!\n");
display_board(board, ROWS, COLS);
while (1) {
printf("Please enter the coordinate (x y): ");
scanf("%d %d", &x, &y);
if (x < 1 || x > ROWS || y < 1 || y > COLS) {
printf("Invalid input! Please enter the coordinate again.\n");
continue;
}
x--;
y--;
if (board[x][y] == 'M') {
printf("Game over! You stepped on a mine.\n");
board[x][y] = '*';
display_board(board, ROWS, COLS);
break;
} else if (board[x][y] != '*') {
printf("Invalid input! The square has already been uncovered.\n");
continue;
}
board[x][y] = get_mine_count(board, ROWS, COLS, x, y) + '0';
left--;
if (left == 0) {
printf("Congratulations! You win!\n");
display_board(board, ROWS, COLS);
break;
}
display_board(board, ROWS, COLS);
}
return 0;
}
void init_board(char board[ROWS][COLS], int rows, int cols, char ch) {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
board[i][j] = ch;
}
}
}
void display_board(char board[ROWS][COLS], int row, int col) {
int i, j;
printf(" ");
for (i = 1; i <= col; i++) {
printf("%d ", i);
}
printf("\n");
printf(" ");
for (i = 1; i <= col; i++) {
printf("--");
}
printf("\n");
for (i = 0; i < row; i++) {
printf("%2d| ", i + 1);
for (j = 0; j < col; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void set_mines(char board[ROWS][COLS], int row, int col, int num) {
int i, x, y;
for (i = 0; i < num; i++) {
do {
x = rand() % row;
y = rand() % col;
} while (board[x][y] == 'M');
board[x][y] = 'M';
}
}
int get_mine_count(char board[ROWS][COLS], int row, int col, int x, int y) {
int count = 0;
int i, j;
for (i = x - 1; i <= x + 1; i++) {
for (j = y - 1; j <= y + 1; j++) {
if (i >= 0 && i < row && j >= 0 && j < col && board[i][j] == 'M') {
count++;
}
}
}
return count;
}
本实现使用字符数组表示游戏棋盘,其中每个元素代表一个方块的状态,初始都为 '*'
,表示未被翻开。当玩家翻开一个方块时,会根据周围的地雷数量显示对应数字,如果该方块周围没有地雷,则递归翻开周围的方块,直到所有空白方块被翻开或者玩家踩中地雷结束游戏。
玩家可以通过输入坐标来翻开对应方块,输入格式为 x y
,其中 x
和 y
分别为行和列的编号,从 1 开始,最大为行数和列数。如果输入的坐标不合法或者对应方块已经被翻开,则需要重新输入。
相关推荐









