c语言远征第9天
写一个简易版的扫雷游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_ROW 9
#define MAX_COL 9
char showmap[MAX_ROW][MAX_COL] ;
char minemap[MAX_ROW][MAX_COL] ;
int meau()
{
printf("************************\n");
printf("1.开始游戏\n");
printf("0.离开游戏\n");
printf("************************\n");
printf("请输入你的选择:>");
int choice = 0;
scanf("%d", &choice);
return choice;
}
//对两张地图进行初始化
void init()
{
srand((unsigned int)time(0));
int row = 0;
int count = 0;
for (row = 0;row < MAX_ROW; ++row)
{
for (int col = 0;col < MAX_COL; ++col)
{
showmap[row][col] = '*';
}
}
for (int row = 0; row < MAX_ROW; ++row)
{
for (int col = 0; col < MAX_COL; ++col)
{
minemap[row][col] = '0';
}
}
while (1)
{
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
int minecount = 10;
if (minemap[row][col] != '1')
{
minemap[row][col] = '1';
count++;
if (count >= minecount)
{
break;
}
}
}
}
//打印地图
void printmap(char map[MAX_ROW][MAX_COL])
{
int row = 0;
int col = 0;
printf(" ");
for (int i = 0; i < MAX_ROW; ++i)
{
printf("%d ", i);
}
printf("\n");
for (int i = 0; i < MAX_ROW +1; ++i)
{
printf("--");
}
printf("\n");
for (; row < MAX_ROW; ++row)
{
printf("%d| ", row);
for (col=0; col < MAX_COL; ++col)
{
printf("%c ",map[row][col]);
}
printf("\n");
}
}
//根据当前位置周围8个格子有几个地雷,并将数字更新到show_map;
void Updateshowmap(int row,int col,char showmap[MAX_ROW][MAX_COL],char minemap[MAX_ROW][MAX_COL])
{
int num = 0;
if (row-1>=0&&col-1>=0&&row-1<MAX_ROW&&col-1<MAX_COL&&minemap[row - 1][col - 1] == '1')
{
num++;
}
else if (row - 1 >= 0 && col - 1 >= 0 && row - 1 < MAX_ROW&&col - 1 < MAX_COL&&minemap[row - 1][col - 1] == '0')
{
Updateshowmap(row - 1, col - 1,showmap,minemap);
}
if (row - 1 >= 0 && col >= 0 && row - 1<MAX_ROW&&col<MAX_COL&&minemap[row - 1][col] == '1')
{
num++;
}
else if (row - 1 >= 0 && col >= 0 && row - 1 < MAX_ROW&&col < MAX_COL&&minemap[row - 1][col] == '0')
{
Updateshowmap(row - 1, col, showmap, minemap);
}
if (row - 1 >= 0 && col + 1 >= 0 && row - 1<MAX_ROW&&col + 1<MAX_COL&&minemap[row - 1][col + 1] == '1')
{
num++;
}
else if (row - 1 >= 0 && col+1 >= 0 && row - 1 < MAX_ROW&&col+1 < MAX_COL&&minemap[row - 1][col+1] == '0')
{
Updateshowmap(row - 1, col +1, showmap, minemap);
}
if (row >= 0 && col - 1 >= 0 && row <MAX_ROW&&col - 1<MAX_COL&&minemap[row][col - 1] == '1')
{
num++;
}
if (row >= 0 && col +1 >= 0 && row <MAX_ROW&&col +1<MAX_COL && minemap[row][col + 1] == '1')
{
num++;
}
if (row +1 >= 0 && col - 1 >= 0 && row + 1<MAX_ROW&&col - 1<MAX_COL&&minemap[row + 1][col - 1] == '1')
{
num++;
}
if (row +1 >= 0 && col >= 0 && row +1<MAX_ROW&&col<MAX_COL&&minemap[row + 1][col] == '1')
{
num++;
}
if (row +1 >= 0 && col +1 >= 0 && row +1<MAX_ROW&&col +1<MAX_COL&&minemap[row+1][col+1] == '1')
{
num++;
}
showmap[row][col] = '0' + num;//num为int型,要想转为字符型输出,需要加上'0'
}
void game()
{
int row = 0;
int col = 0;
int minecount = 10;
int mine_count_already_show = 0;
int blank_count_already_show = 0;
init();
while (1)
{
printmap(showmap);
//调试阶段 TODO
//printmap(minemap);
printf("请输入一组坐标:>");
scanf("%d %d", &row, &col);
system("cls");
if (row < 0 || col < 0 || row >= MAX_ROW || col >= MAX_COL)
{
printf("非法操作\n");
continue;
}
if (showmap[row][col] != '*')
{
printf("该位置已经被翻开\n");
continue;
}
if (minemap[row][col] == '1')
{
printf("游戏结束\n");
printmap(minemap);
break;
}
blank_count_already_show++;
//判定所有非雷区域被翻开
if (blank_count_already_show == MAX_COL * MAX_ROW - minecount)
{
printf("游戏胜利\n");
printmap(minemap);
break;
}
//统计当前位置周围雷的个数
Updateshowmap(row,col,showmap,minemap);
}
}
int main()
{
while(1)
{
int choice = meau();
if (choice)
{
game();
}
else if(!choice)
{
printf("goodbye\n");
break;
}
else
{
printf("您的输入有误\n");
}
}
system("pause");
return 0;
}