简易版扫雷,之后在修改
game.h
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
enum PlayGame{
EXIT, //第一个枚举成员的默认值为整形的0,后续枚举成员在第一个加1
PLAY
};
#define ROWS 12 //行12
#define COLS 12 //列12
#define ThunderNumber 19 //雷总数
void Set_Play(char Mine[ROWS][COLS], char Show[ROWS][COLS]); //玩家的棋盘
void InitCheckerBoard(char Mine[ROWS][COLS], char Show[ROWS][COLS]); //初始化棋盘
void PrintBoard(char Show[ROWS][COLS]); //打印棋盘
void Sweep(char Mine[ROWS][COLS],char Show[ROWS][COLS]); //扫雷
int JudgeRayNumber(char Mine[ROWS][COLS], int x, int y); //判断雷的个数
#endif
game.c
#include "game.h"
int GetRandNum(int x,int y){
return rand() % (y - x + 1) + x; //求出x-y之间的随机数
}
void Init_Mine(char mine[ROWS][COLS]){ //初始化雷
int x = 0;
int y = 0;
int i = ThunderNumber; //棋盘中总雷的个数
srand((unsigned)time(NULL));
while (i){ //如果雷不等于0
x = GetRandNum(1,9); //求一个随机数x
y = GetRandNum(1,9); //求一个随机数y
if (mine[x][y]=='0'){
mine[x][y] = '1'; //给此处赋一个雷
i--;
}
}
}
void InitCheckerBoard(char Mine[ROWS][COLS], char Show[ROWS][COLS]){
memset(Mine, '0', ROWS*COLS*sizeof(char)); //初始化我的棋盘
Init_Mine(Mine); //初始化雷
memset(Show, '*', ROWS*COLS*sizeof(char)); //初始化玩家的棋盘
}
void PrintBoard(char Show[ROWS][COLS]){ //打印棋盘char Mine[ROWS][COLS],
int i = 0;
int j = 0;
for (int i = 1; i < ROWS - 1; i++){ //玩家棋盘
for (int j = 1; j < COLS - 1; j++){
printf("%4c", Show[i][j]);
}
printf("\n");
}
}
int JudgeRayNumber(char Mine[ROWS][COLS], int x, int y){ //判断附近雷的个数
int count = 0;
if (Mine[x-1][y-1]=='1'){
count++;
}
if (Mine[x][y - 1] == '1'){
count++;
}
if (Mine[x+1][y - 1] == '1'){
count++;
}
if (Mine[x-1][y] == '1'){
count++;
}
if (Mine[x+1][y] == '1'){
count++;
}
if (Mine[x-1][y + 1] == '1'){
count++;
}
if (Mine[x][y + 1] == '1'){
count++;
}
if (Mine[x+1][y + 1] == '1'){
count++;
}
return count;
}
void Sweep(char Mine[ROWS][COLS], char Show[ROWS][COLS]){ //扫雷
int x = 0;
int y = 0;
int i = (ROWS - 2)*(COLS - 2) - ThunderNumber; //雷的个数
while (i){
printf("请输入坐标:");
scanf_s("%d%d", &x, &y); //获取输入坐标
int ret = JudgeRayNumber(Mine, x, y); //判断附近有几个雷
if (((x > 0) && (x < ROWS - 1)) && ((y>0) && (x < COLS - 1))){ //输入坐标必须满足在棋盘内
if (Mine[x][y] == '1'){
printf("很遗憾,你被炸死了\n");
return;
}else{
Show[x][y] = ret+'0'; //将雷的个数赋值给棋盘
PrintBoard(Show); //打印雷的棋盘
i--;
}
}
else{
printf("坐标输入错误");
}
}
printf("你赢了,撒花撒花\n");
}
test.c
#include"game.h"
void play_game(){
char Mine[ROWS][COLS] = {0};
char Show[ROWS][COLS] = {0};
InitCheckerBoard(Mine,Show); //初始化棋盘
PrintBoard(Show); //打印棋盘
Sweep(Mine, Show); //扫雷
}
void menu(){
printf("*************************\n");
printf("*******1:PLAY************\n");
printf("*******0:EXIT************\n");
printf("*************************\n");
}
void game(){
menu();
char input = 0;
printf("请输入选项->:");
scanf_s("%d",&input);
do{
switch (input){
case PLAY:
play_game();
break;
case EXIT:
break;
default:
printf("输入错误,请重新输入");
}
}while (input);
}
int main(){
game();
system("pause");
return 0;
}