---
title: GameAPI - Diagramme de classes (complet)
---
classDiagram

    class AbstractBoard{
        <<abstract>>
        -currentPlayer: Player
        -history: Deque<AbstractPly>

        +AbstractBoard(Player p, Deque<AbstractPly> h)
        #setNextPlayer(): void
        #addPlyToHistory(AbstractPly c): void
        #removePlyFromHistory(): AbstractPly
        #getLastPlyFromHistory(): AbstractPly
        +getCurrentPlayer()
        +isGameOver(): boolean
        +getResult(): Result
        +isLegal(AbstractPly c): boolean
        +iterator(): Iterator<AbstractPly>
        +doPly(AbstractPly c): void
        +undoPly(): void
        +safeCopy(): IBoard
    }

    class AbstractGame{
        <<abstract>>
        -currentBoard: IBoard
        -mapPlayers: EnumMap<Player, AbstractGamePlayer>

        +AbstractGame(IBoard b, EnumMap<Player,AbstractGamePlayer> m)
        +run(): Result
    }

    class AbstractGamePlayer{
        <<abstract>>
        -iAm: Player
        
        +AbstractGamePlayer(Player p)
        +giveYourMove(IBoard p): AbstractPly
    }

    class AbstractPly{
        <<abstract>>
        -joueur: Player
        
        +AbstractPly(Player j)
        +getPlayer(): Player
    }

    class IBoard{
        +getCurrentPlayer(): Player
        +isGameOver(): boolean
        +getResult(): Result
        +isLegal(AbstractPly c): boolean
        +iterator(): Iterator<AbstractPly>
        +doPly(AbstractPly c): void
        +undoPly(): void
        +safeCopy(): IBoard
    }

    class Player{
        <<enumerate>>
        PLAYER1
        PLAYER2
    }

    class Result{
        <<enumerate>>
        WIN
        DRAW
        LOSS
    }