当前位置:网站首页>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;
}
边栏推荐
- JUC(一)- JUC学习概览 - 对JUC有一个整体的认识
- navicat连接MySQL报错:1045 - Access denied for user ‘root‘@‘localhost‘ (using password YES)
- MySQL如何创建用户
- Android studio连接MySQL并完成简单的登录注册功能
- [PSQL] window function, GROUPING operator
- 关于web应用的目录结构
- coredns介绍
- ORA-04044:此处不允许过程、函数、程序包或类型,系统分析与解决
- golang环境详细安装、配置
- leetcode 665. Non-decreasing Array 非递减数列(中等)
猜你喜欢

MySQL 灵魂 16 问,你能撑到第几问?

自动化运维工具——ansible、概述、安装、模块介绍

本周大新闻|苹果MR已进行Pre-EVT测试,Quest 2涨价100美元

51单片机外设篇:ADC

apisix-Getting Started

MySQL 5.7详细下载安装配置教程

go语言中的goroutine(协程)

"Digital reconstruction of the system, getting the CEO is the first step"

The company does not pay attention to software testing, and the new Ali P8 has written a test case writing specification for us

MySQL大批量造数据
随机推荐
The original question on the two sides of the automatic test of the byte beating (arranged according to the recording) is real and effective 26
Go语言中定时任务库Cron使用详解
51单片机外设篇:点阵式LCD
MySQL安装教程
prisma使用mongodb副本集群报错引发的一些列问题
kubernetes 亲和、反亲和、污点、容忍
Android Studio 实现登录注册-源代码 (连接MySql数据库)
ORA-04044:此处不允许过程、函数、程序包或类型,系统分析与解决
公司不重视软件测试,新来的阿里P8给我们撰写了测试用例编写规范
How H5 realizes evoking APP
MySQL 游标
配合蓝牙打印的encoding-indexes.js文件内容:
Mycat2.0搭建教程
【C语言】LeetCode26.删除有序数组中的重复项&&LeetCode88.合并两个有序数组
12个MySQL慢查询的原因分析
[Digital IC hand-tear code] Verilog fixed priority arbiter | topic | principle | design | simulation
Redis数据库
软件测试的需求人才越来越多,为什么大家还是不太愿意走软件测试的道路?
Browser onload event
51单片机外设篇:红外通信