C语言扫雷游戏

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX_row   9
#define MAX_col   9
#define mine_count 10

void  updatashowmap(int row,int col,
	char showmap[MAX_row][MAX_col],
	char mine_map[MAX_row][MAX_col]){
	//根据当前位置判定周围8个格子有几个地雷
    //更新到  showmap中
    int count = 0;
	if (row-1>=0&&col-1>=0
		&&row-1<MAX_row&&col-1<MAX_col
		&&mine_map[row-1][col-1] =='1') {
		count++;
	}
	if (row-1>=0&&col>=0
		&&row-1<MAX_row&&col<MAX_col
		&&mine_map[row-1][col] =='1') {
			count++;
	}
	if (row-1>=0&&col+1>=0
		&&row-1<MAX_row&&col+1<MAX_col
		&&mine_map[row-1][col+1] =='1') {
			count++;
	}
	if (row>=0&&col-1>=0
		&&row<MAX_row&&col-1<MAX_col
		&&mine_map[row][col-1] =='1') {
			count++;
	}
	if (row>=0&&col+1>=0
		&&row<MAX_row&&col+1<MAX_col
		&&mine_map[row][col+1] =='1') {
			count++;
	}
	if (row+1>=0&&col-1>=0
		&&row+1<MAX_row&&col-1<MAX_col
		&&mine_map[row+1][col-1] =='1') {
			count++;
	}
	if (row+1>=0&&col>=0
		&&row+1<MAX_row&&col<MAX_col
		&&mine_map[row+1][col] =='1') {
			count++;
	}
	if (row+1>=0&&col+1>=0
		&&row+1<MAX_row&&col+1<MAX_col
		&&mine_map[row+1][col+1] =='1') {
			count++;
	}
    //得到了周围8个格子中地雷的个数
	//假设count 为2 
	//实际想看到的内容是字符2
	//'2'也就ASCII中的32;
	showmap[row][col] = '0'+count;
}
//打印地图
void showmap(char showmap[][MAX_col]) {
	//不光能打印出地图,还能带坐标
	//先打印第一行
	int row,col;
	int i;
	printf("    ");
	for(i = 0;i<MAX_col;i++) {
		printf("%d ",i);
	}
	printf("\n");
	//打印一个分割线
	for(col = 0;col<MAX_col-2;col++) {
		printf("---");
	}
	printf("\n");
	//再打印其他行
	for(row = 0;row<MAX_row;row++) {
		printf(" %d| ",row);
		for(col = 0;col<MAX_col;col++) {
			printf("%c ",showmap[row][col]);
		}
		printf("\n");
	}
}
//初始化棋盘
void init(char show_map[][MAX_col],char mine_map[][MAX_col]) {
	//1.初始化展示棋盘
	int n = mine_count;	
	int row,col;
	for(row = 0;row<MAX_row;row++) {
		for(col = 0;col<MAX_col;col++)
			show_map[row][col] = '*';
	}
	//2.初始化扫雷棋盘
	//使用0表示不是地雷,使用1表示是地雷
	for(row = 0;row<MAX_row;row++) {
		for(col = 0;col<MAX_col;col++)
			mine_map[row][col] = '0';
	}
	while(n>0) {
			//生成一组随机坐标
		 int row = rand()%MAX_row;
		 int col = rand()%MAX_col;
		 if(mine_map[row][col] == '1') {
			 //这个位置有地雷,跳出
			 continue;
		 }
		 mine_map[row][col] = '1';
		 n--;
	}
}
void game() {
	//1.初始化棋盘
	char show_map[MAX_row][MAX_col];
	char mine_map[MAX_row][MAX_col];
	int  blank_count_already_show = 0;
	int  row = 0,col = 0;
	srand((unsigned int)time(NULL));
	init(show_map,mine_map);
	 while(1) {
	    //2.打印棋盘
		showmap(show_map);
		//调试地雷的地图
		showmap(mine_map);
		//3.输入棋盘
		printf("请输入一组坐标:");
		scanf ("%d,%d",&row,&col);
		//在这里清屏,清掉之前打印的内容
		system ("cls");
		if(row<0||row>=MAX_row||
			col<0||col>=MAX_col) {
			printf ("坐标非法,重新输入!\n");
			continue;
		}
		if(show_map[row][col]!='*') {
		   printf("输入的坐标已经被翻开了!\n");
		   continue;
		}
		//4.判断是否是地雷
		if(mine_map[row][col] == '1') {
	    printf("游戏结束!\n");
		showmap (mine_map);
		break;
		}
		//5.判定游戏是否胜利
		//判定所以的非地雷位置都被翻开了
		++blank_count_already_show;
		if(blank_count_already_show 
			== MAX_row*MAX_col-mine_count) {
           printf("游戏胜利!\n");
		   showmap(mine_map);
		   break;
		}
	//6.统计地雷的个数
	  updatashowmap(row,col,show_map,mine_map);
	 }
}
int showmenu() {
	int choose ;
	printf("----------------\n");
	printf("----1.开始游戏--\n");
	printf("----2.退出游戏--\n");
	printf("请输入你的选择:");
	scanf ("%d",&choose);
	return choose;
}
 int main() {
	 int choose ;
	 while(1) {
		 choose = showmenu ();
		 if(choose ==1) {
			 game();
		 }
		 else if (choose ==2){
			 printf("bye!bye!\n");
			 break;
		 }else 
			 printf("你的输入有误,重新输入!\n");
	 }
	 return 0;
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值