Example #1
0
    /**
     * 執行敵人的動作(每個拍點執行一次,先執行玩家動作,再執行敵人動作)
     * 敵人的動作包含 移動現有攻擊、對玩家造成傷害、發動新攻擊 三個部分
     * 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;
            }
        }
    }
Example #2
0
 // 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);
         }
     }
 }