思想:创建一个棋盘,但是棋盘有边界,在统计雷时要考虑边界就很麻烦,所以不能直接将棋拿来使用,所以将棋盘边界不适用,数组下标从1开始,末处边界也不使用。创建两个字符数据,选字符数组可以可以直接通过字符设置雷,一个字符数组用于向外展示,一个字符数组不展示。向外展示的遮盖住,不向外展示的用来设置雷区,通过用户的输入,现在雷区中判定是否该位置有雷,或者是周围有多少雷,然后在向外展示数组将覆盖处改成雷的个数。
头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<Windows.h>
#define Row 12//横通过改变此处来改变棋盘的大小
#define Col 12//纵
#define Num 20//雷的个数
#define Boom '@'//雷的字符
extern void Menu();
extern void Game();
extern void Show(char Bord[][Col]);//用于展示棋盘
extern void SetMine(char clear[][Col]);//设置雷在棋盘中
extern int BoomCount(char Bord[][Col],int x,int y);//统计改坐标附近八个位置雷的个数
源文件
#include"myclear.h"
int main() {
srand((unsigned long)time(NULL));//下次游戏重新设置雷
int flag = 1;
while (flag) {
int select = 0;
Menu();
scanf("%d", &select);
switch (select) {
case 1:Game();
break;
case 2:flag = 0;
printf("拜拜\n");
break;
default:
printf("输入有误,重新输入\n");
break;
}
}
Sleep(1000);
system("cls");
return 0;
}
源文件
#include"myclear.h"
void Menu() {
printf("#################\n");
printf("# 1.开始 2.退出 #\n");
printf("#################\n");
printf("Please select: ");
}
void SetMine(char clear[][Col]) {
int _x, _y;
int index = Num;
while (index) {
_x = rand() % 10 + 1;
_y = rand() % 10 + 1;
if (clear[_x][_y] == Boom)
continue;
clear[_x][_y] = Boom;
index--;
}
}
void Show(char Bord[][Col]){
for (int i = 1; i <= Row - 2; i++) {
for (int j = 1; j <= Col - 2; j++) {
printf("%2c", Bord[i][j]);
}
printf("\n");
}
}
int BoomCount(char Bord[][Col],int x,int y) {
return (Bord[x - 1][y - 1] + Bord[x - 1][y] +
Bord[x - 1][y + 1] + Bord[x][y - 1] +
Bord[x][y + 1] + Bord[x + 1][y - 1] +
Bord[x + 1][y] + Bord[x + 1][y + 1] - 8 * '0') / 16;
}
void Game() {
char Show_clear[Row][Col];//向外展示的区域
char My_clear[Row][Col];//不向外展示的区域
memset(My_clear, '0', sizeof(My_clear));
memset(Show_clear, '*', sizeof(Show_clear));
SetMine(My_clear);
int blank = (Row - 2) * (Col - 2) - Num;//棋盘中不是雷的块
int clearnum = 0;//扫到不是雷块就记录起来
while (1) {
system("cls");//清屏,保证再次输入的界面在最上面
Sleep(1);//清屏的时间间隔
Show(Show_clear);
int x = 0, y = 0;
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if (x<1 && x>Row - 2 && y<1 && y>Col - 2) {
printf("输入有误,重新输入\n");
continue;
}
if (Show_clear[x][y] != '*') {
printf("该处雷已经被排除,重新输入\n");
continue;
}
if (My_clear[x][y] == '@') {
printf("你被炸死了!\n");
printf("请选择:\n");
Sleep(1000);
break;
}
else {
int count = BoomCount(My_clear, x, y);
Show_clear[x][y] = count + '0';//将该位置改成周围雷的数量
clearnum++;
}
if (clearnum >= blank) {//若扫雷区不是雷块数量大于等于blank
printf("你已经获得胜利!\n");
break;
}
}
}