使用C语言写一个扫雷游戏
时间: 2023-12-20 15:04:37 浏览: 81
这是一个比较复杂的项目,需要涉及到图形界面、随机数生成、递归算法等内容,但是我可以给您提供一个基本的框架,您可以根据这个框架进行扩展。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
#define ROWS 10 // 扫雷区域行数
#define COLS 10 // 扫雷区域列数
#define MINE 9 // 地雷的数字
bool isMine(int board[ROWS][COLS], int row, int col)
{
// 判断该位置是否为地雷
if (board[row][col] == MINE) {
return true;
}
return false;
}
void printBoard(int board[ROWS][COLS], bool showMines)
{
// 打印扫雷区域
printf("\n ");
for (int i = 0; i < COLS; i++) {
printf("%d ", i);
}
printf("\n\n");
for (int i = 0; i < ROWS; i++) {
printf("%d ", i);
for (int j = 0; j < COLS; j++) {
if (board[i][j] == MINE && showMines) {
printf("* ");
} else {
printf("%d ", board[i][j]);
}
}
printf("\n");
}
}
void initBoard(int board[ROWS][COLS], int numMines)
{
// 初始化扫雷区域
srand(time(NULL)); // 设置随机数种子
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
board[i][j] = 0;
}
}
int count = 0;
while (count < numMines) {
int row = rand() % ROWS;
int col = rand() % COLS;
if (board[row][col] != MINE) {
board[row][col] = MINE;
count++;
}
}
}
void updateBoard(int board[ROWS][COLS], int row, int col)
{
// 更新扫雷区域
if (isMine(board, row, col)) {
printBoard(board, true);
printf("\nGame over.\n");
exit(0);
}
if (board[row][col] == 0) {
// 递归更新周围的格子
board[row][col] = -1;
for (int i = row - 1; i <= row + 1; i++) {
for (int j = col - 1; j <= col + 1; j++) {
if (i >= 0 && i < ROWS && j >= 0 && j < COLS && board[i][j] != MINE && board[i][j] != -1) {
updateBoard(board, i, j);
}
}
}
} else {
board[row][col] = -1;
}
}
bool isWin(int board[ROWS][COLS], int numMines)
{
// 判断是否获胜
int count = 0;
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (board[i][j] == -1 || board[i][j] == MINE) {
count++;
}
}
}
if (count == ROWS * COLS) {
printBoard(board, true);
printf("\nCongratulations! You win!\n");
return true;
}
return false;
}
int main()
{
int board[ROWS][COLS];
int numMines = 10; // 地雷数量
initBoard(board, numMines);
printBoard(board, false);
int row, col;
while (true) {
printf("\nEnter the row and column (e.g. 1 2): ");
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROWS || col < 0 || col >= COLS) {
printf("\nInvalid input. Try again.\n");
} else if (board[row][col] == -1 || board[row][col] == MINE) {
printf("\nThis square has already been revealed. Try again.\n");
} else {
updateBoard(board, row, col);
printBoard(board, false);
if (isWin(board, numMines)) {
break;
}
}
}
return 0;
}
```
这个程序中,我们使用一个二维数组来表示扫雷区域,其中数字 9 表示地雷,数字 0 表示未翻开的格子,数字 1-8 表示周围地雷的数量,数字 -1 表示已翻开的空格子。在初始化扫雷区域时,我们使用随机数生成地雷的位置;在更新扫雷区域时,我们使用递归算法更新周围的格子;在判断获胜时,我们统计已翻开的格子数,如果等于总格子数减去地雷数,就获胜了。
阅读全文