Plataforma de Juegos Dominó
Transcription
Plataforma de Juegos Dominó
Plataforma de Juegos Dominó Miguel Fonseca Martínez Manuel Regidor Serrano 1. Introducción Esta práctica consiste en la implementación de un jugador de Dominó, y tiene como objetivo, aparte de conseguir una funcionalidad completa, conseguir que esté jugador juegue de manera lo más inteligente posible, gracias a algoritmos de IA. Además, juegan siempre cuatro jugadores, y por tanto se reparten todas las fichas, gracias a esto, se ha simplificado mucho la programación. Sin embargo, además de este jugador inteligente, se implementará un jugador aleatorio “dummy”, y por este último se comenzará 2. Jugador Aleatorio Este jugador es un jugador de dominó que juega eligiendo las fichas de manera completamente aleatoria. En primer lugar, se empezará explicando como se crea este jugador, mediante su constructor y sus atributos. El jugador básico de dominó MyPlayer tiene como atributos el número de jugadores del juego (4 siempre), el jugador actual ( Numerados del 0 al 3) y el estado inicial, por el que se pasarán las fichas de la mano de dicho jugador. Otros atributos que tiene cada jugador, es el tablero de juego, el número de fichas en la mano de cada jugador y la ronda en la que se encuentre la partida. En este constructor se inicializa el tablero de juego, se “traduce” a Fichas la mano del jugador y se establecen a 7 las fichas de cada jugador Una vez, explicado cómo se construye este jugador, el algoritmo de juego es muy simple: 1. NextMove: Se elige la ficha a colocar, se quita de la mano y se indica mediante un String del tipo “343”. En el jugador aleatorio, esta ficha es aleatoria, siempre comprobando que se puede colocar en el tablero (Es decir, los extremos de la mesa del dominó coincide con alguna de las fichas de la mano). 2. ValidMove: Se comprueba por los demás jugadores que la ficha es correcta, es el caso de este jugador, simplemente comprueba que la longitud del String de la Ficha sea menor que 4 (En caso contrario, movimiento inválido) 3. DoMove: Se realiza el movimiento, es decir, se coloca la ficha en el tablero, y además, actualiza los valores de las fichas en la mano de ese jugador en todos los jugadores. 4. Draw: Se comprueba si ha habido un empate, en el caso del dominó, hay empate siempre que se cierre el tablero (Los extremos del tablero son el mismo número) 5. Winner: Se comprueba si hay un ganador, para ello, se comprueban las fichas en la mano del jugador actual, si es cero, ese jugador ha ganado y los demás lo confirman. En el caso de que no hay ganador, se vuelve a 1. 3. Jugador MiniMax con Variante Poda AlfaBeta El algoritmo de juego en este jugador “inteligente” es el mismo que el jugador “dummy”, es más, en el código, la clase MyPlayerMinimax hereda de MyPlayer y reutiliza todos los métodos salvo nextMove. Este ultimo metodo es el encargado de seleccionar la ficha de juego que se va a poner en el tablero, y que se seleccionará de manera inteligente. Para esta selección se ha utilizado el algoritmo Minimax con la poda AlfaBeta. Este algoritmo es un algoritmo de decisión basado en árbol de la jugada óptima para minimizar la pérdida máxima esperada contra un adversario, y con toda la información del juego. La variante AlfaBeta consiste en reducir las ramas que genera el algoritmo Minimax, de tal manera, que se mejora la eficiencia y la velocidad del mismo, ya que poda la rama cuando se comprueba que no se puede mejorar el valor heurístico actual. Para la implementación de este algoritmo, se ha utilizado el Arbol nativo de Java (DefaultTreeModel), que se encuentra en la librería javax.Swing. (Ya que se utiliza para implementar los menús extensibles en Java), y en principio, con una profundidad de cuatro (Ya que una profundidad mayor de árbol, ralentiza mucho el sistema). Además, al contrario que otras implementaciones, en el caso de nuestra implementación, se genera en primer lugar el árbol completo hasta la profundidad 4 y a continuación, se recorre podando y seleccionando. Por último, señalar que el valor heurístico viene determinado por la siguiente función: f(n) = 5*(valor_izdo_ficha + valor_dcho_ficha); En el caso que la ficha sea de valor doble, se multiplica por 10, en lugar de multiplicar por 5 en la función anterior. El pseudocódigo de este algoritmo (Fuente Wikipedia), es el siguiente: función alfabeta(nodo, profundidad, α, β, jugadorMaximizador) si nodo es un nodo terminal o profundidad = 0 devolver el valor heurístico del nodo si jugadorMaximizador para cada hijo de nodo α := max(α, -alfabeta(hijo, profundidad-1, -β, -α, FALSE)) si β≤α break (* poda β *) devolver α si no para cada hijo de nodo β := min(α, -alfabeta(hijo, profundidad-1, -β, -α, TRUE)) si β≤α break (* poda α *) devolver β (* Llamada inicial *) alfabeta(origen, profundidad, -infinito, +infinito, TRUE)
Documents pareils
Minería de Datos WEKA
Podemos apreciar que todos aquellos clientes
con nóminas superiores a 2000 euros van a
devolver el préstamo. Por otra parte cuando la
nómina es menor de esa cantidad la devolución
no esta solo rela...