#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;
}
C语言扫雷游戏
最新推荐文章于 2021-01-17 11:29:42 发布