又一次c语法练习,比较简单,难点只有展开无雷区(就是点一下展开一大片的逻辑)
先看效果
游戏开始
输入x,y和操作模式 (1标记0展开)
胜利和失败
附上代码
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define MAP_HEIGHT 9 //地图高度
#define MAP_WIDTH 9 //地图宽度
#define BOBM_NUM 10 //炸弹个数
//地图结点定义
typedef struct {
char bomb;//炸弹位 1 或 0
char ngb;//周围炸弹个数
char show;//显示字符
char spd;//展开标志位
}Node;
//地图数组定义
static Node Map[MAP_HEIGHT][MAP_WIDTH];
//周围格子相对自身的坐标数组定义
const char nLocation[8][2] = {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}};
//游戏结束标志
static char GameOver=0;
//公共变量
int i=0,j=0,k=0,h=0,w=0;
//遍历数组
#define TRA(insize, outsize) ({ \
for (i = 0; i < MAP_HEIGHT; i++) \
{ \
for (j = 0; j < MAP_WIDTH; j++) \
{ \
insize; \
} \
outsize; \
} \
})
//初始化
void Init(){
//给节点各个参数赋初值
TRA(Map[i][j].bomb=0;
Map[i][j].spd=0;
Map[i][j].ngb=0;
Map[i][j].show='O';,);
//生成炸弹
i=BOBM_NUM;
while (i){
srand((unsigned int)time(NULL));
w=rand()%(MAP_WIDTH-1);
h=rand()%(MAP_HEIGHT-1);
if(Map[h][w].bomb==0){
Map[h][w].bomb=1;
i--;
}
}
//计算ngb值
TRA(for(k=0;k<8;k++){
h = i + nLocation[k][1];
w = j + nLocation[k][0];
if (Map[h][w].bomb&&h >=0 && w >=0 && h < MAP_HEIGHT && w < MAP_WIDTH)
Map[i][j].ngb++;
},);
}
//展开
void spread(int y,int x){
if(Map[y][x].show=='0'){
for(k=0;k<8;k++){
h = y + nLocation[k][1];
w = x + nLocation[k][0];
if (Map[h][w].spd==0&&h >=0 && w >=0 && h < MAP_HEIGHT && w < MAP_WIDTH)
Map[h][w].show=Map[h][w].ngb+48;
}
for(k=0;k<8;k++){
h = y + nLocation[k][1];
w = x + nLocation[k][0];
if (Map[h][w].spd==0&&h >=0 && w >=0 && h < MAP_HEIGHT && w < MAP_WIDTH)
{
Map[h][w].spd=1;
spread(h,w);
}
}
}
else return;
}
//选择节点
void selectNode(){
int x,y,t,tNum=0;
scanf("%d %d %d",&x,&y,&t);
if((Map[y][x].bomb)&&!t)GameOver=1;
else{
if(t==0){
Map[y][x].show=Map[y][x].ngb+48;
Map[y][x].spd=1;
spread(y,x);
}
else if(t==1)Map[y][x].show='@';
}
TRA(if(Map[i][j].bomb&&Map[i][j].show=='@')tNum++;,);
if(tNum==BOBM_NUM)GameOver=2;
}
//显示
void showMap(){
system("cls");
for(i=-1;i<MAP_HEIGHT;i++){
if(i==-1)printf(" 0 1 2 3 4 5 6 7 8");
else {
printf("%d",i);
for(j=0;j<MAP_WIDTH;j++){
if(Map[i][j].show!='0')
printf(" %c",Map[i][j].show);
else
printf(" ");
}
}
printf("\n\n");
}
printf("Enter X Y MODE:");
}
//游戏主函数
void run(){
while (1)
{
if(GameOver==1){
TRA(if(Map[i][j].bomb)Map[i][j].show='*';else Map[i][j].show=Map[i][j].ngb+48;,);
showMap();
printf("\nYou Lose , Game Over ");
break;
}
else if(GameOver==2){
showMap();
printf("\nYou Win ! Ohhhhhhh !!!");
break;
}
else if(!GameOver){
showMap();
selectNode();
}
}
}
//main函数
int main(){
Init();
run();
return 0;
}