上一篇:【unity】9.右键单击添加旗子(Button Right Click事件)
添加flag相关判定
在上一节中我们添加了右键点击增加旗子功能,测试发现右键单击已经开过的格子也会将其变为有旗子的样子,猜想按钮上的listener并不会判断按钮是否处于enable状态,因此对GameLogic
中的SetFlag
函数做如下修改:
public void SetFlag(GameObject _button)
{
MinesweeperButton _mineSweeperButton = _button.GetComponent<MinesweeperButton>();
int _row = _mineSweeperButton.GetRow();
int _col = _mineSweeperButton.GetCol();
//如果按钮是enable状态,才能右键设立旗子
if (_button.GetComponent<Button>().enabled)
{
_mineSweeperButton.SetHasFlag(!_mineSweeperButton.GetHasFlag());
if (_mineSweeperButton.GetHasFlag())
{
_button.GetComponent<Image>().sprite = flagImage;
}
else
{
_button.GetComponent<Image>().sprite = noFlagImage;
}
}
}
同时测试发现DFS在遇到旗子时会显示旗子底下的数字,对DFS函数也做对应修改,遇到旗子直接return
void DFSMine(int _row, int _col)
{
//前略
//如果DFS搜到的格子有旗子了,直接return
if (_button.GetComponent<MinesweeperButton>().GetHasFlag() == true) { return; }
//后略
}
胜利判定
我们规定未开格子剩余数量小于等于雷数量时判定胜利。注意到开过的格子enable都为false,因此计算enable为true的格子数量
//定义当前剩余空格子数
int enableNum;
void InitMines()
{
//前略
//初始化空格子数为总数
enableNum = maxRow * maxCol;
}
void DFSMine(int _row, int _col)
{
//前略
_button.GetComponent<Button>().enabled = false;
//按钮的enabled改为false时将剩余空格子数-1
enableNum = enableNum - 1;
//后略
}
public void ClickMine(GameObject _button)
{
int _row = _button.GetComponent<MinesweeperButton>().GetRow();
int _col = _button.GetComponent<MinesweeperButton>().GetCol();
if (_button.GetComponent<MinesweeperButton>().GetHasFlag() == false)
{
if (bombList.Contains(_row * maxCol + _col))
{
_button.GetComponent<Image>().color = Color.red;
_button.GetComponent<Button>().enabled = false;
//点击到雷时,标记为失败,表现后面加
Debug.Log("You Lose!");
}
else
{
DFSMine(_row, _col);
//DFS结束时如果剩余空格子小于等于总雷数,标记为胜利。表现后面加
if (enableNum <= maxBomb)
{
Debug.Log("You win!");
}
}
}
}
运行结果
下一篇:【unity】11.胜利失败界面