请以面向过程写个扫雷文件
时间: 2024-02-29 18:55:50 浏览: 12
以下是一个简单的面向过程的扫雷游戏实现,使用C++语言编写。
```c++
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
const int ROWS = 10;
const int COLS = 10;
const int NUM_MINES = 10;
const char MINE = '*';
const char HIDDEN = '-';
const char FLAG = 'F';
void initBoard(vector<vector<char>>& board) {
board.resize(ROWS, vector<char>(COLS, HIDDEN));
}
void placeMines(vector<vector<char>>& board) {
int numMines = 0;
while (numMines < NUM_MINES) {
int row = rand() % ROWS;
int col = rand() % COLS;
if (board[row][col] == HIDDEN) {
board[row][col] = MINE;
numMines++;
}
}
}
void printBoard(const vector<vector<char>>& board, bool showMines = false) {
cout << " ";
for (int col = 0; col < COLS; col++) {
cout << col << " ";
}
cout << endl;
for (int row = 0; row < ROWS; row++) {
cout << row << " ";
for (int col = 0; col < COLS; col++) {
if (board[row][col] == MINE && showMines) {
cout << MINE << " ";
} else {
cout << board[row][col] << " ";
}
}
cout << endl;
}
}
bool isValid(int row, int col) {
return row >= 0 && row < ROWS && col >= 0 && col < COLS;
}
int countAdjacentMines(const vector<vector<char>>& board, int row, int col) {
int count = 0;
for (int r = row - 1; r <= row + 1; r++) {
for (int c = col - 1; c <= col + 1; c++) {
if (isValid(r, c) && board[r][c] == MINE) {
count++;
}
}
}
return count;
}
void revealCell(vector<vector<char>>& board, vector<vector<bool>>& revealed, int row, int col) {
if (!isValid(row, col) || revealed[row][col]) {
return;
}
revealed[row][col] = true;
if (board[row][col] == MINE) {
return;
}
int numMines = countAdjacentMines(board, row, col);
if (numMines > 0) {
board[row][col] = '0' + numMines;
return;
}
board[row][col] = '0';
for (int r = row - 1; r <= row + 1; r++) {
for (int c = col - 1; c <= col + 1; c++) {
revealCell(board, revealed, r, c);
}
}
}
bool playTurn(vector<vector<char>>& board, vector<vector<bool>>& revealed) {
int row, col;
char action;
cout << "Enter row and column: ";
cin >> row >> col;
if (!isValid(row, col)) {
cout << "Invalid cell!" << endl;
return true;
}
cout << "Enter action (r to reveal, f to flag): ";
cin >> action;
if (action == 'f') {
board[row][col] = FLAG;
return true;
} else if (action == 'r') {
if (board[row][col] == MINE) {
printBoard(board, true);
cout << "Game over!" << endl;
return false;
}
revealCell(board, revealed, row, col);
return true;
} else {
cout << "Invalid action!" << endl;
return true;
}
}
bool isGameWon(const vector<vector<char>>& board, const vector<vector<bool>>& revealed) {
for (int row = 0; row < ROWS; row++) {
for (int col = 0; col < COLS; col++) {
if (board[row][col] != MINE && !revealed[row][col]) {
return false;
}
}
}
return true;
}
int main() {
srand(time(nullptr));
vector<vector<char>> board;
vector<vector<bool>> revealed(ROWS, vector<bool>(COLS, false));
initBoard(board);
placeMines(board);
bool gameWon = false;
while (!gameWon) {
printBoard(board);
gameWon = playTurn(board, revealed);
if (gameWon) {
gameWon = isGameWon(board, revealed);
}
}
cout << "You won!" << endl;
return 0;
}
```
这个程序实现了一个简单的扫雷游戏。程序首先初始化了一个 ROWS x COLS 的矩阵,并随机放置了一定数量的地雷。然后,程序进入主循环,在每个回合中,程序显示当前的游戏矩阵,然后等待玩家输入一个行和列以及一个操作(揭开或标记)。如果玩家揭开了一个地雷,游戏结束。否则,程序递归地揭开周围的格子,直到揭开所有的非地雷格子或者揭开了地雷格子。如果所有的非地雷格子都被揭开了,游戏胜利。