Exemple #1
0
    void Start()
    {
        ActionLogPresenter.CreateInstance();
        ItemData.Load();
        EnemyData.Load();
        PlayerData.Load();

        //map 生成
        mapPresenter.Generate();

        //enemy生成
        List <UserModel> enemies = EnemyData.GetRandoms(50);

        enemies.ForEach(enemy =>
        {
            Vector2Int _pos  = mapPresenter.GetPopPoint();
            UserModel _model = characterListPresenter.Generate(_pos, mapPresenter.GetTileModel(_pos.x, _pos.y).floorId, enemy);
            mapPresenter.SetUserModel(_pos, _model);
        });

        //player生成
        UserModel player = PlayerData.GetRandom();

        player.isOwn = true;

        Vector2Int position = mapPresenter.GetPopPoint();
        UserModel  model    = characterListPresenter.Generate(position, mapPresenter.GetTileModel(position.x, position.y).floorId, player);

        mapPresenter.SetUserModel(position, model);

        gameStatus = new GameStatusModel();

        //item 配置
        List <ItemModel> items = ItemData.GetRandoms(50);

        items.ForEach(item => itemsListPresenter.Generate(mapPresenter, item));

        //階段配置
        stairsListPresenter.Generate(mapPresenter);

        //dummy エネミー配置
        //enemiesListPresenter.DummyGenerate(mapPresenter, mapPresenter.CanSetObject(pos));

        //dummy 階段配置
        Vector2Int pos = mapPresenter.GetPopPoint();

        stairsListPresenter.DummyGenerate(mapPresenter, mapPresenter.CanSetObject(pos));

        CharacterPresenter characterPresenter = characterListPresenter.GetOwnCharacterPresenter();

        characterPresenter.characterView.Equip("");
        menuPresenter.itemMenuPresenter.Initialize(characterPresenter.itemModels);

        //Create Hud
        GameObject res = Resources.Load("Object/Hud") as GameObject;
        GameObject obj = UnityEngine.Object.Instantiate(res, new Vector3(0, 0, 0), Quaternion.identity) as GameObject;

        hudPresenter = obj.GetComponent <HudPresenter>();
        hudPresenter.UpdateHud(characterPresenter.status);
    }
        private void Update()
        {
            switch (nextState)
            {
            case NextState.Wait:
                return;

            case NextState.Draw:
                if (history.horizontalDominoes.Count > 0)
                {
                    placesToPlay = PlacesToPlay();
                    if (placesToPlay.Count == 0)
                    {
                        base.DrawDomino();
                        placesToPlay = PlacesToPlay();
                        if (placesToPlay.Count == 0)
                        {
                            nextState = NextState.Wait;
                            gameController.PlayerIsBlocked(this);
                            return;
                        }
                    }
                }
                nextState = NextState.Play;
                break;

            case NextState.Play:
                List <ChosenWayToPlay> waysToPlay = new List <ChosenWayToPlay>();
                if (history.horizontalDominoes.Count == 0)
                {
                    foreach (DominoController domino in dominoControllers)
                    {
                        waysToPlay.Add(new ChosenWayToPlay(domino, null));
                    }
                }
                else
                {
                    foreach (KeyValuePair <DominoController, List <DominoController> > entry in placesToPlay)
                    {
                        List <DominoController> list = entry.Value;
                        foreach (DominoController chosenPlace in list)
                        {
                            ChosenWayToPlay chosenWayToPlay = new ChosenWayToPlay(entry.Key, chosenPlace);
                            waysToPlay.Add(chosenWayToPlay);
                        }
                    }
                }
                int             historyDominoesNum = history.horizontalDominoes.Count + history.verticalDominoes.Count - (history.spinner == null ? 0 : 1);
                GameStatusModel gameStatus         = GetGameStatus();
                // From small to large
                waysToPlay.Sort(delegate(ChosenWayToPlay x, ChosenWayToPlay y)
                {
                    if (historyDominoesNum <= 18)
                    {
                        int xScore = GetScoreOfChosenWay(x);
                        int yScore = GetScoreOfChosenWay(y);
                        return(xScore - yScore);
                    }

                    ChosenWayToPlayModel xModel      = new ChosenWayToPlayModel(Utility.DominoControllerToDominoModel(x.chosenDomino), Utility.DominoControllerToDominoModel(x.chosenPlace));
                    PlayActionModel xPlayActionModel = new PlayActionModel(gameStatus, xModel);
                    WinLoseStatusModel xWinLoseStatus;
                    if (winLoseDict.ContainsKey(xPlayActionModel))
                    {
                        xWinLoseStatus = winLoseDict[xPlayActionModel];
                    }
                    else
                    {
                        xWinLoseStatus       = new WinLoseStatusModel();
                        xWinLoseStatus.wins  = 1;
                        xWinLoseStatus.loses = 1;
                    }
                    double xWinRate = (double)xWinLoseStatus.wins / (xWinLoseStatus.wins + xWinLoseStatus.loses);

                    ChosenWayToPlayModel yModel      = new ChosenWayToPlayModel(Utility.DominoControllerToDominoModel(y.chosenDomino), Utility.DominoControllerToDominoModel(y.chosenPlace));
                    PlayActionModel yPlayActionModel = new PlayActionModel(gameStatus, yModel);
                    WinLoseStatusModel yWinLoseStatus;
                    if (winLoseDict.ContainsKey(yPlayActionModel))
                    {
                        yWinLoseStatus = winLoseDict[xPlayActionModel];
                    }
                    else
                    {
                        yWinLoseStatus       = new WinLoseStatusModel();
                        yWinLoseStatus.wins  = 1;
                        yWinLoseStatus.loses = 1;
                    }
                    double yWinRate = (double)yWinLoseStatus.wins / (yWinLoseStatus.wins + yWinLoseStatus.loses);

                    if (xWinRate < yWinRate)
                    {
                        return(-1);
                    }
                    else if (xWinRate == yWinRate)
                    {
                        return(0);
                    }

                    return(1);
                });

                ChosenWayToPlay bestWayToPlay = waysToPlay[waysToPlay.Count - 1];
                PlaceDomino(bestWayToPlay.chosenDomino, bestWayToPlay.chosenPlace, history);
                dominoControllers.Remove(bestWayToPlay.chosenDomino);
                if (historyDominoesNum > 18)
                {
                    ChosenWayToPlayModel bestPlayModel       = new ChosenWayToPlayModel(Utility.DominoControllerToDominoModel(bestWayToPlay.chosenDomino), Utility.DominoControllerToDominoModel(bestWayToPlay.chosenPlace));
                    PlayActionModel      bestPlayActionModel = new PlayActionModel(gameStatus, bestPlayModel);
                    if (winLoseDict.ContainsKey(bestPlayActionModel))
                    {
                        winLoseStatusList.Add(winLoseDict[bestPlayActionModel]);
                    }
                    else
                    {
                        WinLoseStatusModel winLoseStatus = new WinLoseStatusModel();
                        winLoseStatus.wins  = 1;
                        winLoseStatus.loses = 1;
                        winLoseDict.Add(bestPlayActionModel, winLoseStatus);
                        winLoseStatusList.Add(winLoseStatus);
                    }
                }

                // Debug
                Debug.Log("Chosen Domino: " + bestWayToPlay.chosenDomino.leftValue + ", " + bestWayToPlay.chosenDomino.rightValue + ", " + bestWayToPlay.chosenDomino.upperValue + ", " + bestWayToPlay.chosenDomino.lowerValue);
                if (bestWayToPlay.chosenPlace != null)
                {
                    Debug.Log("Chosen Place: " + bestWayToPlay.chosenPlace.leftValue + ", " + bestWayToPlay.chosenPlace.rightValue + ", " + bestWayToPlay.chosenPlace.upperValue + ", " + bestWayToPlay.chosenPlace.lowerValue);
                }
                Debug.Log(Environment.StackTrace);

                nextState = NextState.Wait;
                gameController.PlayerPlayDomino(this, bestWayToPlay.chosenDomino, bestWayToPlay.chosenPlace);
                break;
            }
        }