hello呀!小伙伴们,今天小刘同学要带着大家学习的内容是——扫雷!!!
在本次学习中,我们将会运用到的主要内容是数组,函数,循环和条件语句。
当然,本次学习的内容并不困难,希望本次教学结束大家都能够学会如何编写C语言基础小游戏扫雷哦~
那么,废话不多说,我们现在就开始吧!!!
当然,如果大家觉得小刘同学的讲解不错的话,可以点一波关注哦~
首先理清楚我们的扫雷游戏的基本功能:
首先,扫雷游戏存在一个棋盘,并且在棋盘中放入雷。
其次,在扫雷的时候,如果我们选择的位置是雷,我们就会被炸死,如果不是雷,那么在这个位置就会显示,该位置附近的8个位置里面存在几个雷。
最后,判断输赢的标准是:玩家将所有的雷都找出(找出的意思并不是说玩家踩到雷了),这个时候是玩家赢了。或者是玩家踩到雷,这个时候就是玩家输了。
扫雷基本棋盘:
观察扫雷游戏的基本面板可得:以上的扫雷游戏是9X9的棋盘,并且在棋盘中存放了10个雷。(棋盘的大小可以更改,雷的数量也可以更改)
我们在棋盘中放入1,代表该位置是雷。在棋盘中放入0,代表该位置不是雷。那么,我们就要设置一个9X9的数组来存放我们的雷和非雷。
当我们在玩家选择位置的时候要排查这个位置周围的八个坐标有几个雷时,如果,我们选择的位置是棋盘的四角处,那么这个时候,我们要排查这个位置周围的坐标时,就会出现数组越界的情况,那么这个时候,我们就需要将该数组扩大。此时,我们将棋盘的数组定义为11X11的数组。而我们向玩家展示时,展示的依旧是9X9的棋盘。
我们发现,当我们将雷布置在棋盘中的时候,棋盘数组中会显示出:1和0。而,当我们把排查雷的信息也放在布置雷的数组中时,我们会发现,我们分不清楚到底哪个位置是我们排查的信息,哪个位置是我们布置雷的信息。所以,这个时候,我们需要另外定义一个与棋盘数组一样大小的数组,我们将布置雷的数组定义为:
char mine[9][9],并将其初始化为:'0'。将排查信息的数组定义为:
char show[9][9]。同时,布置雷的数组是让我们程序员看的,而排查雷的数组是给玩家看的,为了保持神秘感,我们将排查雷的数组初始化为:
'*'。——>数组为字符型数组。
理清楚关系后,我们开始写代码啦!!!当然,扫雷游戏和我们前面所讲过的井字棋游戏一样,都要建立三个模块喽~
分别是:
text.c game.c game.h。
text.c模块
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Menu()
{
printf("\t***************************************\n\n");
printf("\t************** 1.play ***************\n\n");
printf("\t************** 0.exit ***************\n\n");
printf("\t***************************************\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(mine, ROW, COL);
//排查雷
FindMine(mine,show, ROW, COL);//在mine中找雷。把雷放在show中
}
int main()
{
//设置随机数的生成起点
srand((unsigned int)time(NULL));
int input = 0;
do
{
Menu();
printf("请输入你的选择:>");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n已退出游戏,欢迎您再次游玩\n");
break;
default:
printf("输入错误,请重新选择。\n");
break;
}
Sleep(1000);
system("cls");
} while (input);
return 0;
}
game.h模块
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);
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);
int get_mine_count(char mine[ROWS][COLS], int x, int y);
game.c模块
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//mine数组在没有布置雷的时候,全是'0'
//show数组在没有排查雷的时候,全是'*'
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("\t*** 扫雷游戏 ***\n\n");
printf("\t");
for (j = 0; j <= col; j++)
{
printf("%d ",j);
}
printf("\n");
for (i = 1; i <= row; i++)
{ printf("\t");
printf("%d ",i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("\n\t*** 扫雷游戏 ***\n\n");
}
//设置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
int count = EASY_COUNT;//雷的个数
while (count)
{
int x = rand() % row + 1;//1~9
int y = rand() % col + 1;//1~9
if (board[x][y] == '0')//查看该坐标处是否已经布置雷
{
board[x][y] = '1';
count--;
}
}
}
//排查雷
int get_mine_count(char board[ROWS][COLS], int x, int y)
{
return (board[x - 1][y] + board[x - 1][y - 1] + board[x][y - 1] +
board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] +
board[x][y + 1] + board[x - 1][y + 1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;//找到非雷的数量
while (1) {
printf("请输入要排查的坐标:>");
scanf("%d %d", &x, &y);
//坐标是否合法
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (show[x][y] != '*')
{
printf("该坐标被排查过了,不能重复排查\n");
}
else {
//是雷
if (mine[x][y] == '1')
{
printf("非常遗憾,你被炸死了!!!\n");
DisplayBoard(mine, ROW, COL);
break;
}
//不是雷
else
{
win++;
//要注意字符1和数字1的区别
int count = get_mine_count(mine, x, y);//统计mine数组中x,y坐标周围有几个0
show[x][y] = count + '0';//数字转换为字符
DisplayBoard(show, ROW, COL);
}
}
}
else
{
printf("输入坐标非法!!!请重新输入。\n");
}
if (win == COL * ROW)
{
printf("恭喜你排雷成功!!!\n");
DisplayBoard(mine, ROW, COL);
}
}
}
调试过程:
看mine数组和show数组是否按照我们的要求初识化了。
看mine数组是否被按照我们想要的效果进行了布雷的过程
创作不易,请大家多多支持!!!如有不懂的内容,可以私信小刘同学哟~