目录
1.简介
根据百度百科,《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
本篇文章用C语言实现该游戏,介绍代码的实现方式。
2.代码
代码分为两个源文件和一个头文件,分别是test.c,game.c和game.h。我们分别介绍三个部分的代码。
1.test.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"//包括game.h头文件,头文件中是game.c中函数的声明
void interface() {
printf("********************\n");//开始界面
printf("***** 1.paly *****\n");
printf("***** 2.exit *****\n");
printf("********************\n");
}
int test() {
interface();
int n = 0;
scanf("%d",&n);//读取n,if语句判断是否开始游戏
if (n == 1) {
printf("开始游戏\n");
char mine[ROW + 2][COL + 2] = { '0' };//数组mine埋地雷,不展示
char show[ROW + 2][COL + 2] = { '0' };//数组show展示揭开地是否有地雷或者附近是否有地雷
init(mine,'0');//mine全初始化为‘0’
init(show,'*');//show全初始化为‘*’
int row = ROW;//行
int col = COL;//列
plantboom(mine,show,row,col);//种地雷
//print(mine,row,col);
print(show,row,col);//展示show棋盘
int m = 0;
int time = 0;
do{//排雷
printf("请输入您要扫雷位置的坐标\n");
m = game(mine, show, row, col);//排雷函数
if (m == 0)//排雷失败就直接死去
break;
if (m == 1) {//排雷成功time计数加1
time++;
//printf("%d\n", time);
if (time == ROW * COL - count) {//全排完了
printf("WIN\n");
return 1;
}
}
}while(1);
return 1;
}
else if (n == 2) {//输入2直接退出
printf("退出游戏\n");
return 0;
}
else {//输入错误重新输入
printf("输入错误,请重新输入\n");
return 1;
}
}
int main() {//主函数,函数的入口
srand((unsigned int)time(NULL));//随机数生成的声明
int n = 0;
do {//至少进入test函数一次,所以do while。
n = test();
} while(n);
return 0;
}
2.game.h
对game.c中函数的声明。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define count 10
int game(char mine[ROW + 2][COL + 2],char show[ROW + 2][COL + 2], int row,int col);
void init(char board[ROW + 2][COL + 2],char set);
void print(char visual[ROW + 2][COL + 2],int row,int col);
void plantboom(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int row, int col);
int count_boom(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int x, int y);
3.game.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
int game(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int row, int col) {//排雷函数
int x = 0;
int y = 0;
scanf("%d %d",&x,&y);//读取排雷位置坐标
if (x >= 1 && x <= row && y >= 1 && y <= col)
if (mine[x][y] == '1') {//踩雷死亡
printf("WASTED\n");
return 0;
}
else {
int n = count_boom(mine, show, x, y);
show[x][y] = n + 48;
//print(mine, row, col);
print(show, row, col);
return 1;
}
else {
printf("输入错误,请重新输入\n");
return 2;
}
}
void init(char board[ROW + 2][COL + 2], char set) {//初始化棋盘
int x = 0;
int y = 0;
for (x = 0;x <= ROW + 1;x++) {
for (y = 0;y <= COL + 1;y++) {
board[x][y] = set;
}
}
}
void print(char visual[ROW + 2][COL + 2],int row, int col) {//打印棋盘
int x = 0;
int y = 0;
printf("--------扫雷--------\n");
for (x = 0;x <= row;x++)
printf("%d ",x);
printf("\n");
for (x = 1;x <= row;x++) {
printf("%d ",x);
for(y = 1;y <= col;y++) {
printf("%c ",visual[x][y]);
}
printf("\n");
}
printf("--------扫雷--------\n");
}
void plantboom(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int row, int col) {//种雷
int i = 0;
for (i = 0;i < count;i++) {
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (mine[x][y] == '0')
mine[x][y] = '1';
else
i--;
}
}
int count_boom(char mine[ROW + 2][COL + 2], char show[ROW + 2][COL + 2], int x, int y) {
//数排雷位置附近八个格子有多少个雷
return(mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 48*8);
}
3.运行
1.踩中雷
2.排雷成功
当全部雷都被确定后,就获胜。
4.总结
《扫雷》游戏的实现是对数组基本知识的一个检测,我很顺利的就编码成功了。这给了我一定的信心和学习兴趣。
本篇文章到此结束,求求赞赞。