示例#1
0
    // Fonction utilisé lorsqu'on joue contre l'ia
    // Elle retourne la meilleure action pour un etat donne
    public Vector2Int GetBestAction(ref TicTacToe.GameState gs)
    {
        var list = policy.Keys.ToList();
        var idx  = GetIndexOf(ref list, ref gs.Grid);

        if (idx >= 0)
        {
            Debug.LogWarning("Etat connu dans la policy !!");
            return(policy.ElementAt(idx).Value);
        }


        Debug.LogWarning("Cette etat n'est pas contenu dans ma policy !");

        var available = gs.GetAvailableCells();
        var rdm       = Random.Range(0, available.Count);

        return(new Vector2Int(available[rdm].Item1, available[rdm].Item2));
    }
示例#2
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);
    }