扫雷小游戏
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10
void Init(char show_map[MAX_ROW][MAX_COL],
char mine_map[MAX_ROW][MAX_COL]){
//把show_map中每个元素都设为*
for (int row = 0; row < MAX_ROW; ++row){
for (int col = 0; col < MAX_COL; ++col){
show_map[row][col] = '*';
}
}
//把mine_map中每个元素都设为0
for (int row = 0; row < MAX_ROW; ++row){
for (int col = 0; col < MAX_COL; ++col){
mine_map[row][col] = '0';
}
}
//在mine_map上随机找出10个位置作为地雷
int mine_count = MINE_COUNT;
while (mine_count>1){
int row = rand()%MAX_ROW;
int col = rand()%MAX_COL;
if (mine_map[row][col] == '1'){
continue;
//++mine_count;
}
mine_map[row][col] = '1';
--mine_count;
}
}
void PrintMap(char map[MAX_ROW][MAX_COL]){
printf(" |");
for (int col = 0; col < MAX_COL; ++col){
printf("%d", col);
}
printf("\n");
for (int col = 0; col < MAX_COL-6; ++col){
printf("----");
}
printf("\n");
for (int row = 0; row < MAX_ROW; ++row){
printf("%d|", row);
for (int col = 0; col < MAX_COL; ++col){
printf("%c", map[row][col]);
}
printf("\n");
}
}
void UpdateShowMap(int row,int col,
char mine_map[MAX_ROW][MAX_COL],
char show_map[MAX_ROW][MAX_COL]){
int count = 0;
if (row - 1 >= 0 && col - 1 >= 0
&& mine_map[row - 1][col - 1] == '1'){
++count;
}
if (row - 1 >= 0
&& mine_map[row - 1][col] == '1'){
++count;
}
if (row - 1 >= 0
&& col + 1<MAX_COL
&&mine_map[row - 1][col + 1] == '1'){
++count;
}
if (col - 1 >= 0
&&mine_map[row ][col - 1] == '1'){
++count;
}
if (col + 1<MAX_COL
&& mine_map[row][col + 1] == '1'){
++count;
}
if (row + 1 <MAX_ROW && col - 1 >= 0
&& mine_map[row + 1][col - 1] == '1'){
++count;
}
if (row + 1 <MAX_ROW
&& mine_map[row + 1][col] == '1'){
++count;
}
if (row + 1 <MAX_ROW && col + 1 <MAX_ROW
&& mine_map[row + 1][col + 1] == '1'){
++count;
}
show_map[row][col] = count + '0';
}
void Game(){ //Game表示一局游戏
char show_map[MAX_ROW][MAX_COL];//创建两个二位数组作为地图
char mine_map[MAX_ROW][MAX_COL];
Init(show_map, mine_map);//对两个地图进行初始化
int blank_count = 0;
while (1){
system("cls");//清屏
//PrintMap(mine_map);//打印地图
printf("\n");
PrintMap(show_map);
printf("请输入要翻开的位置(row col):");//提示玩家输入,并进行校验
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
if (row < 0 || row >= MAX_ROW
|| col < 0 || col >= MAX_COL){
printf("您的输入的坐标有误!\n");
continue;
}
if (show_map[row][col] != '*'){
printf("输入的坐标已经翻开!\n");
continue;
}
if (mine_map[row][col] == '1'){
system("cls");
PrintMap(mine_map);//判断是否踩雷
printf("很遗憾,你踩雷了!\n");
return;
}
++blank_count;
if (blank_count == MAX_ROW*MAX_COL - MINE_COUNT){ //判断是否游戏胜利
printf("扫雷成功!\n");
return;
}
UpdateShowMap(row, col, mine_map, show_map);//告诉玩家当前位置有几个雷
}
}
int Menu()
{
printf("*******************************\n");
printf("*************1.开始游戏********\n");
printf("*************0.结束游戏********\n");
printf("*******************************\n");
printf("请输入您的选择\n");
int choice = 0;
scanf("%d", &choice);
return choice;
}
int main(){
srand((unsigned int)time(0));//获取时间戳
while (1){
int choice = Menu();
if (choice == 1){
Game();
}
else if (choice == 0){
printf("再见\n");
break;
}
else{
printf("您的输入有误!\n");
}
}
system("pause");
return 0;
}