###前提・実現したいこと
上の画像は、右から2つ目、上から4つ目の位置の黒石オブジェクトをアクティブにした状態なのですが、このときに右上の繋がっている白石3つを非アクティブにしたいのですがうまくいきません。
参考URL:http://usapyon.game.coocan.jp/katsunari/howto_kihon.html
まず、TsumegoManagerクラスでプレハブを169個生成し、個々の要素に対して石の状態を設定しています。
StoneManagerクラスのsetStoneメソッドでは、石の状態とタップしたインデックスを引数で受け取り、そのインデックスに既に石が置かれてなければ仮で石を置いて相手の石を取れるかどうか判定し、石を取れるならそのインデックスをListに格納してpushStoneメソッドに返す、といった処理にしています。(長くてすみません)
デバッグログを出力してみたところ、prisonerAll(非アクティブにするオブジェクト数)は0でした。
###TsumegoManager.cs
//石のボタン押下時処理 public void pushStone(GameObject obj) { int tapIndex = int.Parse(obj.name); prisonerArray = stoneList[tapIndex].setStone(BLACK, tapIndex); foreach(int prisoner in prisonerArray) { if(prisoner < 0) break; stoneList[prisoner].setStone(NONE, prisoner); } }
###StoneManager.cs
public List<int> setStone(int state, int tapIndex) { int x, y; /* indexをxとyに分解 */ if (state == WHITE) { if (CheckLegal(WHITE, x, y)) { board[x, y] = WHITE; checkPrisoner(WHITE, x, y); /* 碁石オブジェクトをアクティブ化 */ return rtnTapIndex; } else { board[x, y] = WHITE; /* 碁石オブジェクトをアクティブ化 */ } } else if (state == BLACK) { if (CheckLegal(BLACK, x, y)) { board[x, y] = BLACK; checkPrisoner(BLACK, x, y); /* 碁石オブジェクトをアクティブ化 */ return rtnTapIndex; } else { board[x, y] = BLACK; /* 碁石オブジェクトをアクティブ化 */ } } else if (state == NONE) { board[x, y] = NONE; /* 碁石オブジェクトを非アクティブ化 */ } if (rtnTapIndex.Count == 0) { rtnTapIndex.Add(-1); } return rtnTapIndex; } public bool CheckLegal(int color, int x, int y) { if (board[x, y] != NONE) { return false; } if (move > 1) { if (ko_x == x && ko_y == y && ko_num == (move - 1)) { return false; } } if (CheckSuicide(color, x, y) == true) { return false; } return true; } public bool CheckSuicide(int color, int x, int y) { bool rtnVal; int opponent; //相手の色 board[x, y] = color; ClearCheckBoard(); rtnVal = DoCheckRemoveStone(color, x, y); if (rtnVal == true) { opponent = reverseColor(color); if (x > 1) { if (board[y, x - 1] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x - 1, y); if (rtnVal == true) { board[x, y] = NONE; return false; } } } if (y > 1) { if (board[y - 1, x] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x, y - 1); if (rtnVal == true) { board[x, y] = NONE; return false; } } } if (x < (BOARD_SIZE - 2)) { if (board[y, x + 1] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x + 1, y); if (rtnVal == true) { board[x, y] = NONE; return false; } } } if (y < (BOARD_SIZE - 2)) { if (board[y + 1, x] == opponent) { ClearCheckBoard(); rtnVal = DoCheckRemoveStone(opponent, x, y + 1); if (rtnVal == true) { board[x, y] = NONE; return false; } } } board[x, y] = NONE; return true; } else { board[x, y] = NONE; return false; } } public bool DoCheckRemoveStone(int color, int x, int y) { bool rtn; if (checkBoard[x, y] == true) { return true; } checkBoard[x, y] = true; if (board[x, y] == NONE) { return false; } if (board[x, y] == color) { if (x > 1) { rtn = DoCheckRemoveStone(color, x - 1, y); if (rtn == false) { return false; } } if (y > 1) { rtn = DoCheckRemoveStone(color, x, y - 1); if (rtn == false) { return false; } } if (x < (BOARD_SIZE - 2)) { rtn = DoCheckRemoveStone(color, x + 1, y); if (rtn == false) { return false; } } if (y < (BOARD_SIZE - 2)) { rtn = DoCheckRemoveStone(color, x, y + 1); if (rtn == false) { return false; } } } return true; } public int RemoveStone(int color, int x, int y) { int prisoner; if (board[x, y] == color) { return 0; } if (board[x, y] == NONE) { return 0; } ClearCheckBoard(); if (DoCheckRemoveStone(board[x, y], x, y)) { prisoner = DoRemoveStone(board[x, y], x, y, 0); return prisoner; } return 0; } public int DoRemoveStone(int color, int x, int y, int prisoner) { if (board[x, y] == color) { prisoner++; board[x, y] = NONE; if (x > 1) { rtnTapIndex.Add((x - 1) * (BOARD_SIZE - 2) + y); prisoner = DoRemoveStone(color, x - 1, y, prisoner); } if (y > 1) { rtnTapIndex.Add(x * (BOARD_SIZE - 2) + (y - 1)); prisoner = DoRemoveStone(color, x, y - 1, prisoner); } if (x < (BOARD_SIZE - 2)) { rtnTapIndex.Add((x + 1) * (BOARD_SIZE - 2) + y); prisoner = DoRemoveStone(color, x + 1, y, prisoner); } if (y < (BOARD_SIZE - 2)) { rtnTapIndex.Add(x * (BOARD_SIZE - 2) + (y + 1)); prisoner = DoRemoveStone(color, x, y + 1, prisoner); } } return prisoner; } public void checkPrisoner(int color, int x, int y) { int prisonerN; int prisonerE; int prisonerS; int prisonerW; int prisonerAll; bool koFlag; board[x, y] = color; /* 置いた石の隣に同じ色の石はあるか? */ if (board[y + 1, x] != color && board[y - 1, x] != color && board[y, x + 1] != color && board[y, x - 1] != color) { koFlag = true; } else { koFlag = false; } prisonerN = prisonerE = prisonerS = prisonerW = 0; /* 置いた石の周囲の相手の石が死んでいれば碁盤から取り除く */ if (y > 1) { prisonerN = RemoveStone(color, x, y - 1); } if (x > 1) { prisonerW = RemoveStone(color, x - 1, y); } if (y < (BOARD_SIZE - 2)) { prisonerS = RemoveStone(color, x, y + 1); } if (x < (BOARD_SIZE - 2)) { prisonerE = RemoveStone(color, x + 1, y); } prisonerAll = prisonerN + prisonerE + prisonerS + prisonerW; /* 置いた石の隣に同じ色の石がなく、取り除かれた石も1つならば劫 */ if (koFlag == true && prisonerAll == 1) { /* 劫の発生した手数を覚える */ ko_num = move; /* 劫の座標を覚える */ if (prisonerE == 1) { ko_x = x + 1; ko_y = y; } else if (prisonerS == 1) { ko_x = x; ko_y = y + 1; } else if (prisonerW == 1) { ko_x = x - 1; ko_y = y; } else if (prisonerN == 1) { ko_x = x; ko_y = y - 1; } } }
###補足情報
開発ツール:Unity 5.5.2f1
回答3件
あなたの回答
tips
プレビュー