私はunity 3D 4.7.2fでゲームを作成しています。ここでは、タッチして「接続」できるアイテムのグリッドがあります。 3つ以上が選択されていれば、それらが消えます。あなたがBest Fiendsをプレイしていれば、そのアイデアを得るでしょう。私はすでにゲームロジックのほとんどを実装していますが、私が引き出すことができないような部分は、ゲームがプレイできるかどうかをチェックする方法です(I.E.では、隣り合わせに少なくとも3つのタイルが並んでいます)。私はこの情報を必要とするので、アイテムを再生可能なセットにスクランブルすることができます。とにかく、ここでボードが再生可能であるかどうかを確認する私のコルーチンは次のとおりです。2d配列の隣接関係を確認するUnity3D
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"配列には、ゲーム内の各アイテムの基になっているGameObjects(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"
これはあなたに正しい方向にプッシュを与えるかもしれない:http://gamedev.stackexchange.com/questions/48869/3-in-a-row-or -more-logic – Abion47