扫雷游戏
程序员文章站
2022-03-13 15:36:00
...
扫雷游戏
一 创作思路
(1) 未翻开的状态(草地)和已经翻开的状态(数字)
(2) 该格子是地雷或者不是地雷(1 表示是地雷,0 表示不是地雷)
使用两个二维数组来分别表示以上两组状态.
第一个二维数组:char showMap[9][9];表示每个格子的翻开和未翻开状态.(*表示表示未翻开,字符’0’~'8’表示已翻开数字);
第二个二维数组:char mineMap[9][9];表示每个格子是否是地雷.('1’表示是地雷,'0’表示不是地雷)
二 游戏流程
1.创建地图并初始化.(针对showMap来说,初始化成全是’*’,针对mineMap来说,先整个初始化成全’0’,随机找10个位置作为地雷,设为’1’)
2.打印地图showMap
3.让玩家输入坐标,表示要翻开的位置
4.判定是否踩雷
5.更新 showMap,再翻开位置显示周围有多少个地雷
6.判定玩家是否翻开了所有位置(如果没有全部翻开,返回第二部继续循环)
三 游戏代码
//扫雷游戏
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10
void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]) {
//mem=>memory 内存
//set 设置
//memset的功能就是把一段内存上的每个字节都设置成一个具体的值
//二维数组的每个元素都是在一个连续的内存空间上布局的
memset(showMap, '*', MAX_ROW * MAX_COL);
memset(mineMap, '0', MAX_ROW * MAX_COL);
//随机产生十个位置作为地雷
//设置随机种子
srand((unsigned int)time(0));
int mineCount = 0;
while(mineCount< MINE_COUNT){
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (mineMap[row][col] == '1') {
continue;
}
mineMap[row][col] = '1';
mineCount++;
}
}
//希望这一个函数能同时具备打印两种地图的功能
//取决于实参填啥
void print(char theMap[MAX_ROW][MAX_COL]) {
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL;col++) {
printf("%c ",theMap[row][col]);
}
printf("\n");
}
}
void update(char showMap[MAX_ROW][MAX_COL],
char mineMap[MAX_ROW][MAX_COL],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 (r < 0 || r >= MAX_ROW || c<0 || c>=MAX_COL) {
//此时r,c坐标超出棋盘范围
continue;
}
if (r == row && c == col) {
continue;
}
if (mineMap[r][c] == '1') {
count++;
}
}
}
showMap[row][col] = '0' + count;
}
int main() {
//1.创建地图并初始化
char showMap[MAX_ROW][MAX_COL] = { 0 };
char mineMap[MAX_ROW][MAX_COL] = { 0 };
init(showMap, mineMap);
int openedCount = 0;
while(1){
system("cls");
//2.打印地图
print(showMap);
//此处为了验证update函数的正确性
// 先把地雷的函数图也打印出来
//printf("=====================\n");
//print(mineMap);
//3.玩家输入坐标
int row = 0;
int col = 0;
printf("请输入坐标(row,col):");
scanf("%d %d", &row, &col);
//进行合法性判定
if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
printf("您输入的坐标有误,请重新输入!\n");
continue;
}
//判断这个位置翻没翻开
if (showMap[row][col] != '*') {
printf("您输入的位置已经翻开了,请重新输入!\n");
continue;
}
//4.判定是否踩雷
if (mineMap[row][col] == '1') {
printf("您踩雷了,游戏结束!\n");
break;
}
//5.更新showMap,显示当前位置周围有多少雷
update(showMap,mineMap, row, col);
//6.进行游戏胜利的判定,统计当前一共翻开了多少个格子
openedCount++;
if (openedCount == MAX_ROW * MAX_COL - MINE_COUNT) {
printf("恭喜你,你赢了!\n");
break;
}
}
system("pause");
return 0;
}
推荐阅读