El concepto de jugador es definido mediante una clase abstracta:
module TicTacToe class Player def initialize( mark ) @mark = mark # "X" or "O" or " " end ···· attr_reader :mark ···· def move( board ) raise NotImplementedError, "Player subclasses must define move()." end ···· def finish( final_board )·· end end endde la que heredan los jugadores concretos.
Cada jugador es una clase. Por ejemplo, el jugador humano:
module TicTacToe class HumanPlayer < Player def move( board ) print board .... end def finish( final_board ) .... end end endUn par de jugadores mas, uno tonto y otro listo:
module TicTacToe class DumbPlayer < Player def move( board ) moves = board.moves moves[rand(moves.size)] end end class SmartPlayer < Player def move( board ) .... end end endLa Banda de los Cuatro (The Gang of Four o GoF) llama a esta idea de implanta el algoritmo en clases separadas el strategy pattern o patrón estrategia [5], [6]. Esta estrategia puede aplicarse cuando ocurre que en medio de nuestra aplicación tenemos una parte que varía (el tipo de jugador). A veces en esa parte queremos hacer una cosa (usar el jugador
SmartPlayer
) y a veces
otra (el jugador HumanPlayer
). Es mas, es seguro que en el futuro se querrá
otra cosa (¿que tal un jugador MiniMaxPlayer
?).
Player
que lo
que hacen es decidir la próxima jugada mediante move
.
Player
.
Game
, que usa los Player
s como objetos intercambiables
Game
- el contexto -
de las clases estrategia Player
s es necesario habilitar un mecanismo
de comunicación entre el contexto y la estrategia. En este ejemplo se ha optado por
pasar esa información - el tablero - como argumento:
@board[@x_player.move(@board)] = @x_player.mark # dentro del método play de la clase GameLa estrategia - el jugador
@x_player
- recibe el tablero @board
y retorna su decisión - la jugada @x_player.move(@board)
(algo como "b2"
)
rdoc
,
la herramienta que se usa en Ruby para extraer documentación
de los programas: por un lado hay una variación en los parsers que soporta: C, Ruby y FORTRAN.
Por otro lado la salida puede hacerse en diversos formatos: XML, distintas versiones de HTML, CHM, ri
, etc.
En rdoc
cada uno de los formatos de salida es manejado mediante una estrategia.
Casiano Rodriguez León 2015-01-07