继续延续书写小游戏的想法,这次为大家带来简易版的扫雷行动
有任何问题都可以私信小编哟minghanhan778
目录
一、扫雷游戏预估功能分析
二、扫雷游戏各功能实现
三、扫雷游戏代码呈现
总结
像写三子棋一样,做一定的提前分析,分析出要有哪些初步的功能,提前定义好常量,不能把代码写死!
首先,扫雷肯定要埋雷,那么要将有雷和没雷进行区分,第一个想到的就是一个二维数组!其次面向于玩家,要进行选点排雷,那么肯定需要另外一个二维数组进行排查,所以经过分析,我们核心就是对两个二维数组进行一系列操作!在二维字符数组和普通的二维整型数组,我选用了可以更加灵活的二维字符数组,字符数组对于放入内容更加多样化,相信屏幕前的你也这么认为吧!
有了“三子棋”的经验,扫雷看起来也没有那么复杂。
需要的功能如下:
一个菜单 menu();
一个进入游戏的game();
扫雷打印 DisplayBoard();
每次玩之前的初设数组InitBoard();
进行随机布雷的SetMine();
玩家进行排雷的FindMine();
......
重点
而我想补充的是,我们可以分文件进行书写代码,例如一个text1.c中进行主函数的书写,一个game.c进行各类函数的书写,一个game.h的头文件进行函数的各项声明!
原因其实很简单,分三块内容写,能让你清晰的知道你写了什么,还有社么没写,逻辑更加明了,不至于在一个文件内上下翻转鼠标滚轮,找半天也不知道在哪里,甚至有的时候,找到了都不知道改什么了非常痛苦! 一旦分开,你在game.h中因为要写函数的声明,所以你可以清晰的知道写了哪些函数,而不用乱翻一个文件,找来找去!而在game.c中在去写要书写的函数,与主函数分割公开,实现清晰不凌乱! 想要实现清晰的思路,只需要简单的几步就是在两个.c文件中加上includ"game.h"即可,注意!是“”不是<>,只有库函数才用<>
首先我们知道,玩家在选择一个位置后,要先判读是不是雷!如果不是雷就要判断,在他周围的八个格里有几个雷!但是一旦选择的坐标在边边角角上,进行排查的时候就很容易越界!(吃过亏的宝子们一定知道我在说什么吧,全是泪啊,痛哭saaaad)
tips:解决的办法就是在定义数组的时候,多加一圈,例如要写9*9的扫雷游戏,那么我就多加一圈,变成11*11的数组,把外围的数组设置成“无雷”,这样及不妨碍我们正常书写排查雷的函数,也不用在提心吊胆的写,害怕数组越界!听懂掌声谢谢!
其次排查雷的函数怎么写呢,以及如何判定游戏胜利,都是关键的问题
头文件——game.h 代码如下:
#pragma once
#include
#include
#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EasyMineCount 10
void InitBoard(char board[ROWS][COLS], int rows, int cols,char ch);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
源文件——game.c 代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char ch) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
board[i][j] = ch;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col) {
int j = 0;
int i = 0;
printf("*****扫雷游戏*****\n");
for (j = 0; j <= col; j++) {
printf("%d ", j);
}
printf("\n");
for (int i = 1; i <= row; i++) {
printf("%d ", i);
for (int j = 1; j <= col; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("*****扫雷游戏*****\n");
}
void SetMine(char board[ROWS][COLS], int row, int col) {
int count = EasyMineCount;
while (count) {
//随机数范围1-9
int x = rand() % row + 1;
int y = rand() % col + 1;
if (board[x][y] == '0') {
board[x][y] = '1';
count--;
}
}
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int count = 0;
int i = 0;
int j = 0;
int win = 0;
while (win < (row * col - EasyMineCount)) {
printf("输入排雷坐标:>");
scanf("%d%d", &x, &y);
count = 0;
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (mine[x][y] == '1') {
printf("抱歉您踩到雷了,被炸死啦saaaaad游戏结束!\n");
DisplayBoard(mine, row, col);
return;
}
win++;
for (i = x - 1; i <= x + 1; i++) {
for (j = y - 1; j <= y + 1; j++) {
if (mine[i][j] == '1') {
count++;
}
}
}
show[x][y] = count + '0';
DisplayBoard(show, row, col);
}
else {
printf("输入坐标不合法,请重新输入坐标!\n");
}
}
printf("恭喜你避开所有雷♥\n");
}
源文件——text1.c 代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu() {
printf("******************************************\n");
printf("************** 1.play **************\n");
printf("************** 0.exit **************\n");
printf("******************************************\n");
}
void game() {
char mine[ROWS][COLS] = {0};//棋盘本身
char show[ROWS][COLS] = {0};//排查
//初始化棋盘
InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
//设置雷
SetMine(mine, ROW, COL);
//打印
DisplayBoard(show, ROW, COL);
//DisplayBoard(show, ROW, COL);
//选坐标找雷
FindMine(mine,show,ROW,COL);
}
int main() {
srand((unsigned int)time(NULL));
int input = 0;
do {
menu();
printf("\n请选择-->");
scanf("%d", &input);
switch (input) {
case 1 :
game();
break;
case 0 :
printf("再见!退出游戏!\n");
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
简易版扫雷,到此为止,之后会续更其他小游戏和知识点分享,尽情期待!♥