/** * 執行敵人的動作(每個拍點執行一次,先執行玩家動作,再執行敵人動作) * 敵人的動作包含 移動現有攻擊、對玩家造成傷害、發動新攻擊 三個部分 * 1.移動現有攻擊:所有攻擊物件都移動到下一圈的同一格 * 2.對玩家造成傷害:若玩家所在位置有攻擊物件,會減低玩家的生命值 * 3.發動新攻擊:玩家在最外圈時生成 0 個攻擊物件,玩家每前進一步,生成的攻擊物件的數量加 1; * 隨機決定這些攻擊物件要落在第 -3 圈的哪幾格(玩家的活動範圍只到第 0 圈,攻擊物件可在第 0 圈之內) */ private void BossAttack() { var objectMapKeys = new List <GameObject>(objectMap.Keys); var candidates = new List <int>(); var numberOfNewAttack = GameCoordinate.GetSizeOfM() - objectMap[player].M() - 1; foreach (var key in objectMapKeys) { if (key == player) { continue; } var newPosition = new GameCoordinate( objectMap[key].M() + 1, objectMap[key].N(), true ); if (newPosition.M() < GameCoordinate.GetSizeOfM()) { objectMap[key] = newPosition; key.transform.position = newPosition.ToCartesianCoordinate(); var playerAttacked = newPosition.Equals(objectMap[player]); if (playerAttacked) { Debug.Log("玩家被攻擊!"); playerHealth -= 1; } } else { objectMap.Remove(key); Destroy(key); } } for (var i = 0; i < GameCoordinate.GetSizeOfN(); i++) { candidates.Add(i); } for (var i = 0; i < numberOfNewAttack; i++) { var index = Random.Range(0, candidates.Count); var attackPosition = new GameCoordinate(-3, candidates[index], true); var newBossAttackMarker = Instantiate( bossAttackMarker, attackPosition.ToCartesianCoordinate(), Quaternion.identity ); objectMap.Add(newBossAttackMarker, attackPosition); candidates.RemoveAt(index); if (candidates.Count == 0) { break; } } }
// Show all possible positions private void ShowAllPosition() { for (var i = 0; i < GameCoordinate.GetSizeOfM(); ++i) { for (var j = 0; j < GameCoordinate.GetSizeOfN(); ++j) { var position = new GameCoordinate(i, j); var newCoordinateMark = Instantiate( coordinateMark, position.ToCartesianCoordinate(), coordinateMark.transform.rotation, coordinateMark.transform.parent ); newCoordinateMark.SetActive(true); } } }