Пример #1
0
    //Permet de simuler le GS d'un etat donne jusqu'a un etat final
    public float SimulateGameState(ref Dictionary <TicTacToe.GameState, Vector2Int> policy,
                                   ref List <TicTacToe.GameState> exploredState,
                                   ref TicTacToe.GameState gs)
    {
        int  playerTurn = 0;
        bool gameEnd    = false;

        // IA = Rond, donc playerWinner = 1
        int playerWinner = -1;


        while (!gameEnd)
        {
            //Je prend l'action possible
            var c            = gs.GetAvailableCells();
            var selectedCell = c[Random.Range(0, c.Count)];

            var clone = gs.Clone();
            if (playerTurn == 1)
            {
                var test = policy.Keys.ToList();

                // Epsilon greedy = range entre 0 - 10, et on tire RDM, si en dessous de Epsi action rdm, sinon policy
                // a Utiliser quand on fait la simulation d'un episode


                var gridToTest =
                    GetIndexOf(ref test,
                               ref clone.Grid); //policy.Any(x => x.Key.Grid == clone.Grid);//policy.ToList().FirstOrDefault(x => x.Key.Grid == clone.Grid).Key;

                if (gridToTest >= 0)
                {
                    if (Random.Range(0.0f, 1.0f) > epsilonGreedy)
                    {
                        selectedCell = (policy[policy.ElementAt(gridToTest).Key].x,
                                        policy[policy.ElementAt(gridToTest).Key].y);
                    }
                }
                else
                {
                    policy.Add(clone, new Vector2Int(selectedCell.Item1, selectedCell.Item2));
                }


                exploredState.Add(clone);
            }
            else
            {
                exploredState.Add(clone); //new Vector2Int(selectedCell.Item1, selectedCell.Item2));
            }
            // Grid, N, R, ...

            if (ticTacToe.SetCellWithoutChangeGraphics(playerTurn, selectedCell.Item1, selectedCell.Item2, ref gs))
            {
                var victoryState = ticTacToe.CheckVictory(ref gs);
                if (!victoryState.Item1)
                {
                    if (!ticTacToe.CheckNullMatch(ref gs))
                    {
                        ticTacToe.NextTurn(ref playerTurn);
                    }
                    else
                    {
                        gameEnd      = true;
                        playerWinner = victoryState.Item2;
                    }
                }
                else
                {
                    gameEnd      = true;
                    playerWinner = victoryState.Item2;
                }
            }
        }

        return(playerWinner == 1 ? winR : playerWinner == 0 ? nulR : loseR);
    }