扫雷C语言代码300行
时间: 2023-12-05 19:06:32 浏览: 89
好的,下面是一个比较完整的扫雷游的C语言代码,计约 300 行```c
#include <stdio.h>
#include <.h>
#include <time.h>
#include <conio>
#include <windows.h>
#define ROW 9 //数
#define COL 9 // 列数
#defineINE_COUNT 10 // 地雷数量
#define COVER // 地图上的覆盖符号
#defineINE 'X' // 地雷符号
#define 'F' // 标记符号
#define SPACE ' ' // 空格号
#define NUMBER '0' 数字符号
typedef struct point { // 点结构体
int x,; // 行列坐标
} Point;
char map[ROW][COL]; // 地图
int mineCount = MINE_COUNT; // 剩余地雷数量
int coverCount = ROW * COL; // 剩余覆盖数量
void initMap(); // 初始化地图
void drawMap(); // 绘制地图
void placeMines(); // 随机放置地雷
int countMines(int x, int y); // 统计周围地雷数量
void sweep(int x, int y); // 扫描一个点
void mark(int x, int y); // 标记一个点
int isWin(); // 判断是否胜利
int main()
{
char input;
Point p;
srand((unsigned)time(NULL));
initMap(); // 初始化地图
while (1) {
system("cls");
drawMap(); // 绘制地图
printf("剩余地雷数:%d\n", mineCount);
printf("剩余覆盖数:%d\n", coverCount);
input = getch(); // 获取用户输入
switch (input) {
case 'w': // 上
if (p.x > 0) {
p.x--;
}
break;
case 's': // 下
if (p.x < ROW - 1) {
p.x++;
}
break;
case 'a': // 左
if (p.y > 0) {
p.y--;
}
break;
case 'd': // 右
if (p.y < COL - 1) {
p.y++;
}
break;
case ' ': // 扫描
if (map[p.x][p.y] == COVER) {
sweep(p.x, p.y);
}
break;
case 'f': // 标记
if (map[p.x][p.y] == COVER) {
mark(p.x, p.y);
} else if (map[p.x][p.y] == FLAG) {
map[p.x][p.y] = COVER;
coverCount++;
mineCount++;
}
break;
case 'r': // 重新开始
initMap();
break;
case 'q': // 退出游戏
return 0;
default:
break;
}
if (isWin()) { // 判断是否胜利
printf("你赢了!\n");
system("pause");
initMap();
}
}
return 0;
}
void initMap()
{
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
map[i][j] = COVER;
}
}
coverCount = ROW * COL;
mineCount = MINE_COUNT;
placeMines(); // 随机放置地雷
}
void drawMap()
{
int i, j;
Point p;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
p.x = i, p.y = j;
if (p.x == i && p.y == j) {
printf("[%c]", map[i][j]);
} else {
printf(" %c ", map[i][j]);
}
}
printf("\n");
}
}
void placeMines()
{
int i, x, y;
for (i = 0; i < MINE_COUNT; i++) {
do {
x = rand() % ROW;
y = rand() % COL;
} while (map[x][y] == MINE); // 不能重复放置
map[x][y] = MINE;
}
}
int countMines(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 && j >= 0 && i < ROW && j < COL && map[i][j] == MINE) {
count++;
}
}
}
return count;
}
void sweep(int x, int y)
{
int mines = countMines(x, y);
if (map[x][y] == COVER) {
coverCount--;
if (mines == 0) { // 周围没有地雷
map[x][y] = SPACE;
if (x > 0) {
sweep(x - 1, y);
}
if (x < ROW - 1) {
sweep(x + 1, y);
}
if (y > 0) {
sweep(x, y - 1);
}
if (y < COL - 1) {
sweep(x, y + 1);
}
} else { // 周围有地雷
map[x][y] = NUMBER + mines;
}
}
}
void mark(int x, int y)
{
if (map[x][y] == COVER && mineCount > 0) {
map[x][y] = FLAG;
mineCount--;
coverCount--;
}
}
int isWin()
{
int i, j;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (map[i][j] == COVER || map[i][j] == FLAG) {
return 0; // 还有未扫描或未标记的点,游戏未结束
}
}
}
return 1;
}
```
希望能对您有所帮助!
阅读全文