当前位置:网站首页>C语言小游戏——扫雷小游戏
C语言小游戏——扫雷小游戏
2022-08-02 05:07:00 【悲伤猪小猪】
前言
还记得童年时偷偷玩蜘蛛纸牌和扫雷的日子嘛?对于小时候的我们来说,扫雷可能是最难的小游戏了,只会乱点,却还玩点不亦乐乎,今天我们长大的我们要来自己设计一下,这个小时候带给我们快乐的小游戏。这个游戏有哪些功能呢,我们需要在一个9*9的棋盘上寻找10个地雷,如果找出全部的雷,游戏就胜利了,如果不幸踩掉地雷,游戏失败,我们在排查地雷的同时,游戏会给出提示告诉我们所选的位置周围有多少地雷,来帮助我们获得游戏胜利,
游戏设计与实现
主界面的设计
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*********************\n");
printf("*********************\n");
printf("*****1.开始游戏******\n");
printf("*****0.结束游戏******\n");
printf("*********************\n");
printf("*********************\n");
}
void game()
{
printf("扫雷");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择是否开始游戏:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("结束游戏\n");
default:
printf("选择错误,请重新选择:\n");
}
} while (input);
return 0;
}
游戏首先都要有主界面,我们首先设计一个简单的界面,可以让玩家进行选择是否开始游戏,因为游戏可以反复游玩,所以我们将判断是否开始游戏放进一个循环当中,只有当玩家选择结束游戏时,游戏才结束。
棋盘的设计
为了保持游戏的神秘感,我们需要设计两个数组,一个数组用于布置雷,一个数组用于排查雷。我们将排查雷的棋盘打印给玩家看,玩家通过坐标选择要排查的位置,我们根据坐标给出相应的提示。我们将布置雷的棋盘隐藏起来,用于我们各种共功能的设计,同时也保持了游戏的神秘感。因为我们需要排查玩家所选位置的周围是否有雷,为了保证最周围的区域可以正常排查啊,我们将棋盘多设计两行两列,比如99的棋盘,我们在设计时设计为11x11,但给玩家呈现时我们打印99的棋盘。
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
char mine[ROWS][COLS] = {
0};//存放布置好雷的信息,初始化为字符0
char show[ROWS][COLS] = {
0};//存放排查出的雷的信息,初始化为*
初始化棋盘
我们将我们的mine数组初始化为'0'
将show数组初始化'*'
,我们设计一个函数来实现,我们可以设置一个参数用于接收需要舒适化的内容,这样就可以实现一个函数,初始化两个不用内容的数组了。
void init_board(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;
}
}
}
通过遍历数组,对数组进行初始化。
打印棋盘
初始化后我们想看一看我们设计的棋盘,我们对棋盘进行打印,之前分析过了,我们设计的棋盘为11x11的,但是我们真正打印的是9*9的棋盘。
//打印数组
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("-----------扫雷游戏-----------\n");
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------扫雷游戏-----------\n");
}
我们发现这样的棋盘对于玩家来说,寻找坐标会很困难,我们可不可以加上一点提示呢?
//打印数组
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("-----------扫雷游戏-----------\n");
//打印列号
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------扫雷游戏-----------\n");
}
布置地雷
既然玩家要进行扫雷,那么我们就需要给玩家布置地雷,使用随机数随机生成坐标,生成的随机数与行数和列数取余,保证生成的坐标在棋盘的范围内,进行判断该位置是否有地雷,如果没有就布置地雷,我们需要布置10个地雷。
//布置雷
void set_mine(char board[ROWS][COLS], int row, int col)
{
//布置10个雷
int count = 10;
while (count)
{
//随机下标的生成
int x = rand() % row+1;
int y = rand() % col+1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
我们打印用于布置雷的数组,发现已经在棋盘上布置了10个地雷。
排查雷
static get_mine_conut(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0';
}
//排查雷
find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row*col - EASY_CONUNT)
{
printf("请输入要排查的坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("地雷炸了,游戏结束!!!!\n");
display_board(mine, row, col);
break;
}
else
{
int count = get_mine_conut(mine, x, y);
show[x][y] = '0'+ count;
display_board(show, row, col);
win++;
}
}
else
{
printf("您输入的坐标有误,请重新输入\n");
}
if (win == row * col - EASY_CONUNT)
{
printf("恭喜你排雷成功,游戏胜利!!!\n");
display_board(show, row, col);
}
}
}
我们需要对玩家选择的坐标进行判断,是否在棋盘内,如果不在给出提示,玩家重新选择,如果在那么继续判断,如果是地雷,那么直接给出提示,地雷炸了游戏结束,如果不是地雷,那么需要将该坐标的周围坐标遍历,看是否有雷,有几个,将值传递给用于排查雷的show
数组。当选择到地雷时游戏结束,但是如果我们排查出所有地雷了后,游戏也结束,我们需要进行相应的判断。
完整代码
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化数组
void init_board(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 display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("-----------扫雷游戏-----------\n");
//打印列号
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-----------扫雷游戏-----------\n");
}
//布置雷
void set_mine(char board[ROWS][COLS], int row, int col)
{
//布置10个雷
int count = EASY_CONUNT;
while (count)
{
//随机下标的生成
int x = rand() % row+1;
int y = rand() % col+1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
static get_mine_conut(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0';
}
//排查雷
find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row*col - EASY_CONUNT)
{
printf("请输入要排查的坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("地雷炸了,游戏结束!!!!\n");
display_board(mine, row, col);
break;
}
else
{
int count = get_mine_conut(mine, x, y);
show[x][y] = '0'+ count;
display_board(show, row, col);
win++;
}
}
else
{
printf("您输入的坐标有误,请重新输入\n");
}
if (win == row * col - EASY_CONUNT)
{
printf("恭喜你排雷成功,游戏胜利!!!\n");
display_board(show, row, col);
}
}
}
game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define EASY_CONUNT 10
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_mine(char board[ROWS][COLS], int row, int col);
//排查雷
find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*********************\n");
printf("*********************\n");
printf("*****1.开始游戏******\n");
printf("*****0.结束游戏******\n");
printf("*********************\n");
printf("*********************\n");
}
void game()
{
char mine[ROWS][COLS] = {
0};//存放布置好雷的信息,初始化为字符0
char show[ROWS][COLS] = {
0};//存放排查出的雷的信息,初始化为*
//初始化棋盘
init_board(mine, ROWS, COLS,'0');
init_board(show, ROWS, COLS,'*');
//打印棋盘
//display_board(mine, ROW, COL);
display_board(show, ROW, COL);
//布置雷
set_mine(mine, ROW, COL);
//display_board(mine, ROW, COL);
//排查雷
find_mine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("请选择是否开始游戏:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("结束游戏\n");
default:
printf("选择错误,请重新选择:\n");
}
} while (input);
return 0;
}
边栏推荐
猜你喜欢
随机推荐
MySQL安装教程
golang's time package: methods for time interval formatting and output of timestamp formats such as seconds, milliseconds, and nanoseconds
Mysql常用命令大全
Detailed explanation of the software testing process (mind map) of the first-tier manufacturers
ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘解决方法
21天学习挑战赛安排
MySQL大批量造数据
coredns介绍
Review: image saturation calculation formula and image signal-to-noise (PSNR) ratio calculation formula
leetcode 204. Count Primes 计数质数 (Easy)
swinIR论文阅读笔记
How H5 realizes evoking APP
Use the browser's local storage to realize the function of remembering the user name
51单片机外设篇:DS18B20
mysql安装教程【安装版】
ELK log analysis system
Android studio connects to MySQL and completes simple login and registration functions
classSR论文阅读笔记
MySQL 的 limit 分页查询及性能问题
Redis数据库