C++扫雷

前言

之前写过一个C++的贪吃蛇,今天写一个扫雷。可能网上已经有很多相关的源代码了,但是我这个是通过自己的思考,不是简单的扒别人成功的代码进行小修改得到的结果。希望我的分享能够对你的项目有启示。

原理

在这里插入图片描述
每一个数字表示的意思就是在这个数字的周围的8个位置中有几个炸弹。我们可以把这个所谓的棋盘看成三层。
在这里插入图片描述

  • 数字层:最下面被覆盖的部分,生成炸弹和对应位置的数字,采用-1表示炸弹,其余位置则用0-8分表示该位置周围炸弹的个数;
  • 操作层:记录已经被选中的位置,0表示未被选中,1表示已经被选中,如果操作层的数字由0变为1且数字层对应位置为-1时,则认为踩到炸弹了,游戏结束;
  • 显示层:对于显示层实际是虚拟的一层结构,根据下面的操作层和数字层的结果进行显示,对于操作层为0表示未被选中则显示为#,对于操作层为1表示已经被选中了,而对应数字层为0则显示(空格),对于数字层不为0的情况下则显示对应的数字。
    对于数字层我们首先通过随机数的方式生成所需要的炸弹个数。然后对于每个不是炸弹的位置进行遍历,求得对应的数字。
    在这里插入图片描述
    在这里插入图片描述
    这样就做成了数字层,对于操作层相对比较简答,就是每一次操作就将对应位置的元素由0变为1,表示该位置已经被处理。如果该位置对应的数字层的元素为炸弹则游戏结束。在操作层中有一个计数器result,这个计数器用于表示当前暂未操作的位置个数,如果这个个数等于炸弹的个数则认为游戏结束,成功!!

细节讲解

数字层

类定义

#pragma once
#define SIZE 10//表示棋盘大小
#define NUMBER 10//表示炸弹个数
#include<array>
#include<iostream>
using namespace std;
class base
{
   
private:
	array<array<int,SIZE>,SIZE> down;
public:
	base();
	int getValue(int x, int y);//用于返回数字层的元素,作为操作层的接口
	void init();
	void product();//生成标识数字
};

具体实现:

#include "base.h"

base::base() {
   
	for (int  i = 0; i < SIZE; i++)
		for (int j = 0; j < SIZE; j++)
			down[i][j] = 0;
	product();
}

int base::getValue(int x, int y) {
   
	return down[x][y];
}

void base::init() {
   
	for (int i = 0; i < NUMBER; i++)
	{
   
		int rand_x = rand() % SIZE;
		int rand_y = rand() % SIZE;
		while (down[rand_x][rand_y] == -1)
		{
   
			rand_x = rand</
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值