c语言可选择模式扫雷游戏代码
时间: 2023-06-20 20:09:28 浏览: 100
以下是一个简单的C语言扫雷游戏代码,它具有不同的难度级别(初级、中级、高级)和自定义游戏板大小。请注意,此代码只提供了一种实现方式,您可以根据自己的需求进行修改和优化。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_SIZE 20 // 游戏板的最大大小
int board[MAX_SIZE][MAX_SIZE]; // 游戏板
int bomb[MAX_SIZE][MAX_SIZE]; // 炸弹位置
int visited[MAX_SIZE][MAX_SIZE]; // 已经访问过的位置
int gameover = 0; // 游戏是否结束
int rows, cols; // 游戏板大小
int bomb_num; // 炸弹数量
// 初始化游戏板
void init_board() {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
board[i][j] = 0;
visited[i][j] = 0;
}
}
}
// 随机放置炸弹
void place_bombs() {
int i, j, count = 0;
while (count < bomb_num) {
i = rand() % rows;
j = rand() % cols;
if (board[i][j] != -1) {
board[i][j] = -1;
bomb[i][j] = 1;
count++;
}
}
}
// 计算每个格子周围的炸弹数量
void calc_bomb_numbers() {
int i, j, x, y;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (board[i][j] == -1) {
continue;
}
for (x = -1; x <= 1; x++) {
for (y = -1; y <= 1; y++) {
if (i + x < 0 || i + x >= rows || j + y < 0 || j + y >= cols) {
continue;
}
if (board[i + x][j + y] == -1) {
board[i][j]++;
}
}
}
}
}
}
// 打印游戏板
void print_board() {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (visited[i][j]) {
if (board[i][j] == -1) {
printf("* ");
} else {
printf("%d ", board[i][j]);
}
} else {
printf(". ");
}
}
printf("\n");
}
}
// 检查游戏是否结束
void check_gameover() {
int i, j;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (bomb[i][j] && visited[i][j]) {
gameover = 1;
return;
}
}
}
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
if (!bomb[i][j] && !visited[i][j]) {
return;
}
}
}
gameover = 1;
}
// 打开格子
void open_cell(int x, int y) {
visited[x][y] = 1;
if (board[x][y] == -1) {
gameover = 1;
return;
}
if (board[x][y] > 0) {
return;
}
if (x > 0 && !visited[x - 1][y]) {
open_cell(x - 1, y);
}
if (x < rows - 1 && !visited[x + 1][y]) {
open_cell(x + 1, y);
}
if (y > 0 && !visited[x][y - 1]) {
open_cell(x, y - 1);
}
if (y < cols - 1 && !visited[x][y + 1]) {
open_cell(x, y + 1);
}
}
// 主函数
int main() {
int level, i, j, x, y;
srand(time(NULL));
printf("请选择难度级别(1.初级;2.中级;3.高级):");
scanf("%d", &level);
switch (level) {
case 1:
rows = cols = 9;
bomb_num = 10;
break;
case 2:
rows = cols = 16;
bomb_num = 40;
break;
case 3:
printf("请输入游戏板的大小(最大为%d):", MAX_SIZE);
scanf("%d", &rows);
cols = rows;
printf("请输入炸弹数量:");
scanf("%d", &bomb_num);
break;
default:
printf("无效的难度级别!\n");
return 0;
}
if (rows > MAX_SIZE || cols > MAX_SIZE) {
printf("游戏板的大小不能超过%d!\n", MAX_SIZE);
return 0;
}
init_board();
place_bombs();
calc_bomb_numbers();
while (!gameover) {
print_board();
printf("请输入要打开的格子的行列号(例如:2 3):");
scanf("%d %d", &x, &y);
if (x < 1 || x > rows || y < 1 || y > cols) {
printf("无效的行列号!\n");
continue;
}
open_cell(x - 1, y - 1);
check_gameover();
}
printf("游戏结束!\n");
return 0;
}
```
阅读全文