int DetectMine(Vector3 coordinate) { int numMine = 0; //int numTarget = 0; HexGrid[] grids = HexagonMesh.FindNeighbor(coordinate); for (int i = 0; i < grids.Length; i++) { if (grids[i]) { if (grids[i].gridInfo == -1) { numMine++; } if (grids[i].gridInfo == -99) { numMine += 2; } } } //if (numMine == 0) // numMine += numTarget; //else // numMine += numTarget*2; if (numMine > 6) { numMine = 6; } return(numMine); }
void ArrangeGrid(int index) { int order = 0; for (int x = -(layer - 1); x <= (layer - 1); x++) { for (int y = -(layer - 1); y <= (layer - 1); y++) { for (int z = -(layer - 1); z <= (layer - 1); z++) { if (x + y + z == 0) { // 滿足等式者為六角網格上的座標 Vector3 cood = new Vector3(x, y, z); // 依序尋找下一個不重複的六角網格座標 if (cood != HexagonMesh.grids[order].gridCoordinate) { HexagonMesh.grids[index].gridCoordinate = cood; HexagonMesh.grids[index].transform.localPosition = HexagonMesh.HexToCartesian(cood); return; } order++; } } } } }
public void ClearNeigbor(Vector3 coordinate) { HexGrid[] grids = HexagonMesh.FindNeighbor(coordinate); for (int i = 0; i < grids.Length; i++) { grids[i].Disappear(); } }
private void PlaceTrap() { for (int i = 0; i < trap - target; i++) { // Step.1 隨機設置陷阱位置 List <int> placeIndex = new List <int>(); // 可使用網格索引 List <int> trapNeighborIndex; // 陷阱鄰近網格索引 int placeRandom; // 隨機索引值 int placeNeighborTrap; // 鄰近陷阱數 bool placeAgain; // 不滿足條件 gridIndex.ForEach(index => placeIndex.Add(index)); // 複製一份當前剩餘的網格列表,僅用於下方迴圈; do { // 重置參數 placeRandom = placeIndex[Random.Range(0, placeIndex.Count)]; placeNeighborTrap = 0; placeAgain = false; // 檢查鄰近網格 lock (trapNeighborIndex = HexagonMesh.FindNeighborIndex(placeRandom)) { for (int j = 0; j < trapNeighborIndex.Count; j++) { int indexNeighbor = trapNeighborIndex[j]; // 鄰近網格是否為安全區 if (HexagonMesh.grids[indexNeighbor].gridInfo == -999) { placeAgain = true; placeIndex.Remove(placeRandom); // 移除不符合條件之隨機索引值 } // 鄰近網格是否為陷阱或寶藏 else if (HexagonMesh.grids[indexNeighbor].gridInfo == -1 || HexagonMesh.grids[indexNeighbor].gridInfo == -99) { placeNeighborTrap++; } // 鄰近陷阱與寶藏數量超過難度限制,重新生成索引值 if (placeNeighborTrap > maxTrapGroup) { placeAgain = true; placeIndex.Remove(placeRandom); // 移除不符合條件之隨機索引值 } } } }while (placeAgain); // 檢查完成 gridIndex.Remove(placeRandom); HexagonMesh.grids[placeRandom].gridInfo = -1; if (showAll) { HexagonMesh.grids[placeRandom].gridImage.sprite = themeManager.iconTitleTrap.sprite; } } }
public void ExploreNeigbor(Vector3 coordinate) { HexGrid[] grids = HexagonMesh.FindNeighbor(coordinate); for (int i = 0; i < grids.Length; i++) { if (grids[i]) { grids[i].Explore(); } } }
private void SafeArea() { gridIndex.Remove(firstIndex); HexagonMesh.grids[firstIndex].gridInfo = -999; List <int> safeIndex = HexagonMesh.FindNeighborIndex(firstIndex); for (int i = 0; i < safeIndex.Count; i++) { gridIndex.Remove(safeIndex[i]); HexagonMesh.grids[safeIndex[i]].gridInfo = -777; } }
public void ChooseDifficulty(int level) { difficulty = (Difficulty)level; switch (difficulty) { case Difficulty.Doctor: layer = 4; trap = 5; target = 2; opportunity = 10; tipsButton[0].SetActive(true); tipsButton[1].SetActive(true); tipsButton[2].SetActive(true); toggleDoctor.gameObject.SetActive(true); toggleDoctor.isOn = true; adventureMode = AdventureMode.Doctor; break; case Difficulty.Newbie: layer = 4; trap = 5; target = 2; opportunity = 2; gridGruop.localScale = Vector3.one; break; case Difficulty.Trainee: layer = 5; trap = 8; target = 4; opportunity = 3; gridGruop.localScale = Vector3.one; break; case Difficulty.Elite: layer = 5; trap = 8; target = 5; opportunity = 4; gridGruop.localScale = Vector3.one; break; case Difficulty.Expert: layer = 5; trap = 8; target = 6; opportunity = 5; gridGruop.localScale = Vector3.one; break; case Difficulty.Master: layer = 6; trap = 12; target = 9; opportunity = 7; gridGruop.localScale = new Vector3(0.84f, 0.84f, 0.84f); break; case Difficulty.Crazy: layer = 6; trap = 13; target = 11; opportunity = 9; gridGruop.localScale = new Vector3(0.84f, 0.84f, 0.84f); break; case Difficulty.Wakaka: layer = 7; trap = 26; target = 11; opportunity = 11; gridGruop.localScale = new Vector3(0.7f, 0.7f, 0.7f); break; } textLevel.text = "Lv. " + level; textDifficultyEng.text = difficulty.ToString(); textDifficultyCht.text = ((DifficultyCht)level).ToString(); // 設置難度之後要重新排列網格 countHexagonGrids = HexagonMesh.CalculateHexGrids(layer); rotateMap = false; gridGruop.localRotation = Quaternion.identity; // 排列過程中不要旋轉 for (int i = 0; i < HexagonMesh.grids.Length; i++) { if (i < countHexagonGrids) { ArrangeGrid(i); } else { Vector3 gridCoordinate = new Vector3(999, 999, 999); HexagonMesh.grids[i].gridCoordinate = gridCoordinate; HexagonMesh.grids[i].transform.localPosition = new Vector3(7000, 7000, 7000); } } rotateMap = true; }
// 建置六角網格 void CreateHexagonalGrids() { HexagonMesh.grids = new HexGrid[HexagonMesh.CalculateHexGrids(maxLayer)]; HexagonMesh.gridsIndex = new List <int>(); for (int i = 0; i < HexagonMesh.grids.Length; i++) { HexagonMesh.gridsIndex.Add(i); HexagonMesh.grids[i] = Instantiate(gridPrefab).GetComponent <HexGrid>(); HexagonMesh.grids[i].indexGrid = i; HexagonMesh.grids[i].name = "Hex Grid Button " + (i); HexagonMesh.grids[i].transform.SetParent(gridGruop); HexagonMesh.grids[i].transform.localScale = new Vector3(1, 1, 1); HexagonMesh.grids[i].gridCoordinate = new Vector3(1, 1, 1); HexagonMesh.grids[i].transform.localRotation *= Quaternion.Euler(0, 0, Random.Range(0, 6) * 60); HexagonMesh.grids[i].manager = this; HexagonMesh.grids[i].themeManager = this.themeManager; HexagonMesh.grids[i].FirstTryEvent += OnFirstTry; } }
private void PlaceTreasure() { for (int i = 0; i < target; i++) { // Step.1 隨機設置寶藏位置,但是寶藏彼此不得相鄰 List <int> placeTreasureIndex = new List <int>(); // 寶藏可佈置網格索引 List <int> placeTrapIndex; // 寶藏鄰近陷阱可佈置網格索引 List <int> treasureNeighborIndex; // 寶藏鄰近網格索引 bool placeAgain; // 不滿足條件 int placeRandom; // 隨機索引值 int placeNeighborTrap; // 鄰近陷阱數 gridIndex.ForEach(index => placeTreasureIndex.Add(index)); // 複製一份當前剩餘的網格列表,僅用於下方迴圈; do { // 重置參數 placeTrapIndex = new List <int>(); placeAgain = false; placeRandom = placeTreasureIndex[Random.Range(0, placeTreasureIndex.Count)]; placeNeighborTrap = 0; // 檢查鄰近網格 HexagonMesh.grids[placeRandom].Neighbor = HexagonMesh.GetNeighbor(placeRandom); HexagonMesh.grids[placeRandom].NeighborIndex = HexagonMesh.FindNeighborIndex(placeRandom); treasureNeighborIndex = HexagonMesh.grids[placeRandom].NeighborIndex; treasureNeighborIndex.ForEach(index => placeTrapIndex.Add(index)); // 複製一份寶藏鄰近網格列表,新列表將用於佈置陷阱; lock (treasureNeighborIndex) { for (int j = 0; j < treasureNeighborIndex.Count; j++) { int indexNeighbor = treasureNeighborIndex[j]; // 鄰近網格是否為寶藏或安全區 if (HexagonMesh.grids[indexNeighbor].gridInfo == -99 || HexagonMesh.grids[indexNeighbor].gridInfo == -999) { placeAgain = true; placeTreasureIndex.Remove(placeRandom); // 移除不符合條件之隨機索引值 } // 鄰近網格是否為陷阱 else if (HexagonMesh.grids[indexNeighbor].gridInfo == -1) { placeNeighborTrap++; placeTrapIndex.Remove(indexNeighbor); } // 鄰近陷阱數量超過難度限制,重新生成索引值 if (placeNeighborTrap > maxTrapGroup) { placeAgain = true; placeTreasureIndex.Remove(placeRandom); // 移除不符合條件之隨機索引值 } } } }while (placeAgain); // 檢查完成 gridIndex.Remove(placeRandom); HexagonMesh.grids[placeRandom].gridInfo = -99; HexagonMesh.grids[placeRandom].isSuspected = true; if (showAll) { HexagonMesh.grids[placeRandom].gridImage.sprite = themeManager.iconTitleTreasure.sprite; } // Step.2 寶藏周圍隨機設置一處陷阱 if (placeTrapIndex.Count > 0) { do { if (placeTrapIndex.Count == 0) { break; } // 重置參數 placeRandom = placeTrapIndex[Random.Range(0, placeTrapIndex.Count)]; placeNeighborTrap = 0; placeAgain = false; // 檢查鄰近網格 List <int> trapNeighborIndex; // 陷阱鄰近網格索引 lock (trapNeighborIndex = HexagonMesh.FindNeighborIndex(placeRandom)) { for (int j = 0; j < trapNeighborIndex.Count; j++) { int indexNeighbor = trapNeighborIndex[j]; // 鄰近網格是否為安全區 if (HexagonMesh.grids[indexNeighbor].gridInfo == -999) { placeAgain = true; placeTrapIndex.Remove(placeRandom); // 移除不符合條件之隨機索引值 } // 鄰近網格是否為陷阱或寶藏 else if (HexagonMesh.grids[indexNeighbor].gridInfo == -1 || HexagonMesh.grids[indexNeighbor].gridInfo == -99) { placeNeighborTrap++; } // 鄰近陷阱與寶藏數量超過難度限制,重新生成索引值 if (placeNeighborTrap > maxTrapGroup) { placeAgain = true; placeTrapIndex.Remove(placeRandom); // 移除不符合條件之隨機索引值 } } } }while (placeAgain); // 檢查完成 gridIndex.Remove(placeRandom); HexagonMesh.grids[placeRandom].gridInfo = -1; HexagonMesh.grids[placeRandom].isSuspected = true; if (showAll) { HexagonMesh.grids[placeRandom].gridImage.sprite = themeManager.iconTitleTrap.sprite; } } else { Debug.LogWarning("陷阱危機"); } } }