给我一个简单的C++扫雷代码
时间: 2024-06-09 22:10:48 浏览: 10
以下是一个简单的C语言扫雷代码,实现了最基本的功能:生成地图、布雷、翻开方块和判断游戏是否结束。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define MINE_NUM 10
void init_board(char board[ROW][COL], char ch){
int i, j;
for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){
board[i][j] = ch;
}
}
}
void print_board(char board[ROW][COL]){
int i, j;
printf(" ");
for(i = 0; i < COL; i++){
printf("%d ", i+1);
}
printf("\n");
for(i = 0; i < ROW; i++){
printf("%d ", i+1);
for(j = 0; j < COL; j++){
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void set_mines(char board[ROW][COL]){
int i, j, count = 0;
srand((unsigned)time(NULL));
while(count < MINE_NUM){
i = rand() % ROW;
j = rand() % COL;
if(board[i][j] != '*'){
board[i][j] = '*';
count++;
}
}
}
int get_mine_count(char board[ROW][COL], int x, int y){
int i, j, count = 0;
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] == '*'){
count++;
}
}
}
return count;
}
void set_numbers(char board[ROW][COL]){
int i, j;
for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){
if(board[i][j] != '*'){
board[i][j] = '0' + get_mine_count(board, i, j);
}
}
}
}
void uncover(char board[ROW][COL], char show[ROW][COL], int x, int y){
if(x < 0 || x >= ROW || y < 0 || y >= COL || show[x][y] != '-'){
return;
}
show[x][y] = board[x][y];
if(board[x][y] == '0'){
uncover(board, show, x-1, y-1);
uncover(board, show, x-1, y);
uncover(board, show, x-1, y+1);
uncover(board, show, x, y-1);
uncover(board, show, x, y+1);
uncover(board, show, x+1, y-1);
uncover(board, show, x+1, y);
uncover(board, show, x+1, y+1);
}
}
int is_win(char show[ROW][COL]){
int i, j;
for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){
if(show[i][j] == '-' || show[i][j] == '*'){
return 0;
}
}
}
return 1;
}
int main(){
char board[ROW][COL], show[ROW][COL];
int x, y, count = 0;
init_board(board, '-');
init_board(show, '-');
set_mines(board);
set_numbers(board);
print_board(show);
while(1){
printf("Please enter row and column: ");
scanf("%d%d", &x, &y);
if(board[x-1][y-1] == '*'){
printf("You lose!\n");
break;
}
uncover(board, show, x-1, y-1);
print_board(show);
if(is_win(show)){
printf("You win!\n");
break;
}
}
return 0;
}
```
代码中使用了两个数组 `board` 和 `show`,分别表示地图和展示给玩家的状态。`board` 中存储了地雷和数字,`show` 中初始值为 `'-'`,表示未翻开的方块,玩家翻开后显示相应的内容。函数 `init_board` 用于初始化数组,函数 `print_board` 用于打印地图。函数 `set_mines` 用于布雷,函数 `get_mine_count` 用于计算某个方块周围的地雷数,函数 `set_numbers` 用于设置数字。函数 `uncover` 用于翻开方块,使用递归实现了连锁反应。函数 `is_win` 用于判断游戏是否结束。在主函数中,先初始化地图,然后循环等待玩家输入,翻开方块并打印地图,判断游戏是否结束。如果翻开的方块是地雷,则游戏失败,退出循环。如果所有非地雷方块都被翻开,则游戏胜利,退出循环。