【unity】6.点击格子后显示附近雷的数量

上一篇:【unity】5.随机生成地雷并点击后变红


修改按钮的prefab

双击Assets/Prefabs里的MinesweeperButton.prefab,在MinesweeperButton下新建一个Text组件,重命名为Number,表示这个格子里显示的数字

选中这个Number对象,修改它的字体、字号、居中、字色等内容,文本内容删掉。尺寸也设置为30*30(否则会导致射线框过长,影响按钮点击效果)
在这里插入图片描述

在button中存储是否有雷的信息

打开MinesweeperButton.cs,新增一个变量和对应函数表示这个格子里是否有雷,初始化为false表示没有雷

	bool hasBomb = false;
	
	public void SetHasBomb(bool _hasBomb)
    {
        hasBomb = _hasBomb;
    }

    public bool GetHasBomb()
    {
        return hasBomb;
    }

判断周围格子是否有雷

打开GameLogic.cs,为了方便查询周围的格子,首先我们要新建一个List来存储格子列表,然后在每次创建button之后将其塞进List,并设置它的HasBomb值

	//新建List存放所有的按钮
    List<GameObject> buttonList;
    void InitMines(int _maxRow, int _maxCol)
    {
        bombList = GenerateRandomList(_maxRow * _maxCol, maxBomb);
        
        //每次初始化时new一下这个List
        buttonList = new List<GameObject>();
        
        for (int i = 0; i < _maxRow; i++)
        {
            for (int j = 0; j < _maxCol; j++)
            {
                int _centerX = (int)(parentButtonPrefab.GetComponent<RectTransform>().rect.width / 2);
                int _centerY = (int)(parentButtonPrefab.GetComponent<RectTransform>().rect.height / 2);
                int _buttonSize = (int)(buttonPrefab.GetComponent<RectTransform>().rect.height);
                Vector3 _pos = new Vector3(_centerX + (i - _maxRow / 2) * _buttonSize, _centerY + (j - _maxCol / 2) * _buttonSize);
                GameObject _button = GameObject.Instantiate(buttonPrefab, _pos, Quaternion.identity, parentButtonPrefab.transform);

                //将创建好的button塞进List里
                buttonList.Add(_button);
                
                //设置这个button所在的行和列
                _button.GetComponent<MinesweeperButton>().SetRow(i);
                _button.GetComponent<MinesweeperButton>().SetCol(j);
                
                //设置这个按钮的有雷值
                if (bombList.Contains(i * _maxCol + j))
                {
                    _button.GetComponent<MinesweeperButton>().SetHasBomb(true);
                }

                _button.GetComponent<Button>().onClick.AddListener(
                    delegate{
                        ClickMine(_button);
                    }
                );
            }
        }
    }

GameLogic.cs新建一个函数用来取附近8个格子中的雷的数量

    private int GetAroundBombNumber(int _row, int _col)
    {
        int result = 0;
        for (int i = -1; i < 2; i++)
        {
            for (int j = -1; j < 2; j++)
            {
                int _nRow = _row + i;
                int _nCol = _col + j;
                if (i == 0 && j == 0) { continue; }
                if ((_nRow < 0) || (_nCol < 0) || (_nRow > maxRow - 1) || (_nCol > maxCol - 1)) { continue; }
                if (_nRow * _maxCol + _nCol < 0) { continue; }
                if (buttonList[_nRow * _maxCol + _nCol].GetComponent<MinesweeperButton>().GetHasBomb()) { result++; }
            }
        }
        return result;
    }

修改ClickMine函数,在点击格子时判断如果附近雷数量>0,则显示雷,如果附近没有雷,则将格子颜色变灰。代码如下

    private void ClickMine(GameObject _button)
    {
        int _row = _button.GetComponent<MinesweeperButton>().GetRow();
        int _col = _button.GetComponent<MinesweeperButton>().GetCol();
        if (bombList.Contains(_row * _maxCol + _col))
        {
            _button.GetComponent<Image>().color = Color.red;
        }
        //这个格子本身没有雷的情况
        else
        {
            int _aroundBombNumber = GetAroundBombNumber(_row, _col);
            if (_aroundBombNumber > 0)
            {
            	//附近有雷,显示雷的数量
                _button.GetComponentInChildren<TextMeshProUGUI>().text = _aroundBombNumber.ToString();
            }
            else
            {
            	//附近没有雷,格子变为灰色
                _button.GetComponent<Image>().color = Color.gray;
            }
        }
    }

运行效果如下:


下一篇:【unity】7.自适应按钮大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值