【发布时间】:2016-12-01 20:52:52
【问题描述】:
我正在 Unity 3D 4.7.2f 上创建一个游戏,其中我有一个可以通过触摸它们“连接”的项目网格。如果选择了 3 个或更多,它们就会消失,如果你玩过 Best Fiends,你就会明白这一点。我已经实现了大部分游戏逻辑,我似乎无法提取的唯一部分是一种检查游戏是否可玩的方法(即,至少有 3 个瓷砖彼此相邻)。我需要这些信息,这样我就可以将这些项目打乱成一个可玩的集合。无论如何,这是我的协程,用于检查棋盘是否可玩:
IEnumerator isPlayable(){
yield return new WaitForSeconds(0f);
bool playable = false;
TileObject first = null;
TileObject next = null;
int inLine = 0;
foreach(GameObject GO in baseItems){
if(playable)
break;
first = null;
next = null;
inLine = 0;
for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
if(visibleItems[i,j].name.Equals(GO.gameObject.GetComponent<TileObject>().name)){
if(first == null){
first = visibleItems[i,j];
if(inLine == 0)
inLine = 1;
} else if(next == null){
next = visibleItems[i,j];
if(isAdjacent(first, false, next)){
inLine++;
if(inLine >= 3){
i = rows + 1;
j = columns + 1;
playable = true;
break;
} else {
first = next;
next = null;
}
} else {
first = next;
next = null;
}
}
}
}
}
if(playable)
Debug.Log(GO.name + " Yes");
else
Debug.Log(GO.name + " No");
}
}
如你所见,我也调用了我的“isAdjacent”函数,如下:
public bool isAdjacent(TileObject tileObj, bool checkChosen = true, TileObject next = null){
bool meetsRequirements = false;
if(checkChosen){
if(chosenItems != null && chosenItems.Count > 0){
if(chosenItems.ToArray()[0].name.Equals(tileObj.name)){
foreach(TileObject item in chosenItems){
meetsRequirements = verifyDown(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyUp(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyLeft(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyRight(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyUpLeft(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyUpRight(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyDownLeft(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow()) ||
verifyDownRight(item.getColumn(), tileObj.getColumn(), item.getRow(), tileObj.getRow());
}
} else {
meetsRequirements = false;
}
} else {
meetsRequirements = false;
}
} else {
meetsRequirements = verifyRight(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyDownRight(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyDown(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyDownLeft(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyLeft(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyUpLeft(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyUp(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow()) ||
verifyUpRight(next.getColumn(), tileObj.getColumn(), next.getRow(), tileObj.getRow());
}
return meetsRequirements;
}
我知道“isAdjacent”功能可以正常工作,因为它与我用来检查所选(点击/点击)项目是否在其他同类项目附近的功能相同。 “baseItems”数组包含游戏对象(附加了 TileObject 脚本),每个游戏内项目都基于该对象。 TileObject 包含它自己的名称,并且它们也有它们的列号和行号(用于 isAdjacent 函数)。我很确定我的逻辑问题出在“isPlayable”协程中,但我不知道为什么。基本上它需要检查 3 个同类(例如“蓝色项目”)是否连续(在任何方向,只要它们相邻),但是当它不是可玩游戏时,有时会显示“是”或“不”当它是。这并不总是会发生,但确实会发生。有人能帮我吗?希望我能准确地解释自己。
编辑:作为一个例子,我添加了这张图片:
As you can see, green should have said "Yes"
In this other case, Blue should've said "No" and go all the way to "Yellow" to say "Yes"
【问题讨论】:
-
这可能会让你朝着正确的方向前进:gamedev.stackexchange.com/questions/48869/…