0.我这里创建了三个文件(test.c和game.h和game.c) {test.c里是主要内容,game.h里面有各种定义,包含头文件,函数声明,game.c中是写的game.h中声明的函数的内容} (所以在test.c和game.c中顶部只写了#include"game.h") 我在game.h中定义一些数,方便修改如果全部要改。
1.游戏界面:
我用了一个小函数(menu)来打印游戏界面:(使用1和0是为了使用while循环时方便)
2.设置主函数(输入选择,输入1开始游戏,0推出游戏,输入其他的数提示错误并重新输入):(system("cls"的作用是清空当前屏幕)
3.开始设置游戏函数(game1())
一. 这里我们设置两个字符型二维数组a和b,a数组用于我们的存雷,b数组用于展示。
二.使用初始化数组a和b,a数组用字符0覆盖,(方便存雷,用1表示有雷,且后续要判断一个坐标周围有多少个雷方便计算)a数组用*覆盖;
三.用函数展示数组a和b(用棋盘形式)
我们使用9*9大小;但是我使用了11*11的二维数组,是为后续的方便,例如坐标不包含0,扫雷完一个坐标后对该坐标周围一圈有多少个雷的判断;
四.开始存雷:(也是使用函数)
在a数组中用1表示有雷,0表示没有雷(开始初始化的是全部为0,没有雷);存雷时需要随机数,就需要rand和srand函数,头文件中要包含time.h和stdlib.h;要存10个雷(在game.h中定义了MINES1为10);
五.用一个函数计算要排查的坐标周围存在几个雷;(我们用的是字符数组)
六.开始写排查雷函数;
如果输入的坐标在a数组中为1,表示有雷,游戏结束,反之不为1,表示没有雷,那么,这时就要更新b数组并展示b数组棋盘,且在那个坐标的内容改为字符数字,表示周围一圈有多少个雷;直到没有雷的坐标都被我们排查出,这时,宣布游戏胜利;
七.运行片段截图:(要赢得话要输入70次左右坐标且不被炸死)
八.我的代码:
1.test.c中的代码:
#include"game.h"
void menu(void) {
printf("*******************************************************");
printf("\n*********************1.开始游戏************************\n");
printf("***********************0.退出游戏************************\n");
printf("*********************************************************\n");
}
void game1(void) {
char a[ROW1S][COL1S] = {0}; char b[ROW1S][COL1S] = { 0 }; //a存雷信息;b排雷信息;
InitializePanel(a,ROW1S,COL1S,'0');
InitializePanel(b, ROW1S, COL1S, '*'); //棋盘初始化函数
show1(b);//展示排雷信息
ArrangeMines(a,ROW1, COL1);//布置雷函数
FindMines(a,b);//排查雷;
}
int main() {
int imput=0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择(1或0):-》->\n");
scanf("%d", &imput);
switch (imput) {
case 1:
system("cls"); printf("游戏开始:\n");
game1();
break;
case 0:printf("退出游戏:\n"); break;
default:printf("输入错误,请重新选择:\n"); break;
}
} while (imput);
return 0;
}
2. game.h中的代码:
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW1 9
#define COL1 9
#define ROW1S ROW1+2
#define COL1S COL1+2
#define MINES1 10
void InitializePanel(char a[ROW1S][COL1S], int x1, int x2, char c);
//扫雷棋盘面板初始化
void ArrangeMines(char a[ROW1S][COL1S],int x1,int x2);//布置雷
void show1(char a[ROW1][COL1S]);//展示存雷排雷信息
int MinesNumber(char a[ROW1S][COL1S], int x, int y);//查看排雷的地点周围有几个雷;
void FindMines(char a[ROW1S][COL1S], char b[ROW1S][COL1S]);//排查雷;
3.game.c中的代码
#include"game.h"
void InitializePanel(char a[ROW1S][COL1S], int x1, int x2, char c) {
int i, j;
for (i = 0; i < x1; i++) {
for (j = 0; j < x2; j++) {
a[i][j] = c;
}
}
}//棋盘初始化
void show1(char a[ROW1S][COL1S]) {
int i, j;
printf("-----------------排雷-----------------\n");
for (i = 0; i <= COL1; i++) { printf("%d ", i); } //打印列号
printf("\n");
for (i = 1; i <= ROW1; i++) {
printf("%d ", i); //打印行号
for (j = 1; j <= COL1; j++) {
printf("%c ", a[i][j]);
}printf("\n");
}
}//展示存雷排雷信息
void ArrangeMines(char a[ROW1S][COL1S],int x1,int x2) {
int c = MINES1;
while (c) {
int x = rand() % x1 + 1;
int y = rand() % x2 + 1; //随机数设置雷
if (a[x][y] == '0') {
a[x][y] = '1'; c--;
}
}
}
//设置布置雷;
int MinesNumber(char a[ROW1S][COL1S],int x,int y) {
return a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1]-8*'0';
}//查看排雷的地点周围有几个雷;
void FindMines(char a[ROW1S][COL1S], char b[ROW1S][COL1S]) {
int x = 0, y = 0; int win = 0;
while (win < ROW1 * COL1 - MINES1) {
printf("请输入要排查的坐标:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW1 && y >= 1 && y <= COL1) {
if (a[x][y] == '1') {
printf("很遗憾,被炸死了,下图中数字1是存有炸弹的地方\n");
show1(a); break;
}
else {
if (b[x][y] != '*') {
printf("该坐标你已经排查过啦,无需重复排查\n");
}
else {
system("cls");
int c = MinesNumber(a, x, y);
b[x][y] = c+'0';
show1(b);
}
}
}else {
printf("你输入的坐标好像有误呢,请重新输入\n");
}
if (win == ROW1 * COL1 - MINES1)printf("恭喜你,游戏胜利!\n");
}
}//排查雷;
九.
最后,希望提意见。谢谢你们。