Tengo que hacer un pequeño proyecto para la asignatura de Modelos Conexionistas y he decidido implementar el juego Pong mediante una Red Neuronal supervisada en Java.
El trabajo consiste en que el jugador comience a entrenar la red. Para ello , simplemente se pone a jugar en tipo frontón (contra una pared) y se van recogiendo los datos (para cada tupla (x, y, dirección_pelota), se pueden dar 3 salidas posibles: quedarse parado, ir a la izquierda o ir a la derecha). Luego, se pasan esos datos por una red neuronal. En principio voy a coger BackPropagation. Una vez entrenada la red, un jugador se enfrenta contra los valores aprendidos en el proceso de aprendizaje de la red.
Esta versión, a la que he llamado Pong-Alfa2 (la alfa1 es muy simple), sólo está implementada la interfaz gráfica en Java. Mi intención es ir colocando todo el proceso poco a poco (a medida que lo vaya haciendo). En esta versión, aunque aparezca entrenamiento, no se está entrenando, sólo se controla la interfaz gráfica. Se comienza a jugar dando al botón "Training". Cuando se falla, sale un mensaje "Game Over", entones se pulsa el botón Play para continuar. De momento lo tengo así, aunque esto lo cambiaré en las siguientes versiones.
La clase principal, responsable de la captura de eventos del ratón y botones es la que he llamada PanelDibujo.java.
_________________________________________________________
_________________________________________________________
/* * Juego PONG * Autor: Juan José Fumero Alfonso * web : snatverk.blogspot.com */ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; import java.awt.geom.Point2D.*; public class PanelDibujo extends JPanel implements Runnable, ActionListener{ public static final int MAXY = 405; public static final int MAXX = 580; boolean arriba, izquierda; private int r, gr, b; int x, y; //Coordenadas de la pelota Point p; Rectangle2D.Double rec; Ellipse2D.Double cir; boolean gameOver; NetData[][] nL; NetData[][] nR; boolean training; boolean bloqueado; public PanelDibujo() { setBackground(Color.white); //Inicializamos atributos p = new Point(); rec = new Rectangle2D.Double(); cir = new Ellipse2D.Double(); gameOver = false; nL = new NetData[MAXX][MAXY]; nR = new NetData[MAXX][MAXY]; for (int i = 0; i < MAXX; i++) { for (int j = 0; j < MAXY; j++) { nL[i][j] = new NetData(); nR[i][j] = new NetData(); nR[i][j].setDir(true); } } //Registramos al objeto this como oyente de evento de movimiento //de ratón this.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { p = e.getPoint(); repaint(); } } ); } public void run() { //Lógica de la pelota while(true) { if ((training) && (!bloqueado)) { if ((x < MAXX) && (!izquierda)) x++; else x--; if (x == MAXX) izquierda = true; if (x == 0) izquierda = false; if (y == (MAXY - 10) && (!arriba)) { if (((p.getX() - 25) <= x) && (p.getX() + 25 >= x)) { System.out.println("Ok: sigue jugando"); arriba = true; } else if (!arriba) { System.out.println("Matado!!!!"); gameOver = true; repaint(); bloqueado = true; } } if ((y < MAXY) && (!arriba)) y++; else y--; if (y == MAXY) arriba = true; if (y == 0) arriba = false; } repaint(); try { Thread.sleep(5); } catch (Exception e) { System.out.println("Error: Eception" + e.toString()); } } } public void paintComponent(Graphics g) { super.paintComponent(g); if (!gameOver) { GeneralPath gp = new GeneralPath(); Graphics2D g2 = (Graphics2D)g; //Dibujamos zona de juego gp.moveTo(1, 1); gp.lineTo(1, MAXY + 10); gp.moveTo(MAXX + 10, 1); gp.lineTo(MAXX + 10, MAXY + 10); gp.moveTo(0, MAXY + 10); gp.lineTo(MAXX + 10, MAXY + 10); gp.moveTo(1, 1); gp.lineTo(MAXX + 10, 1); g2.draw(gp); g2.setPaint(new Color(r, gr, b)); rec.setRect((p.getX()-25), MAXY + 5, 50,10); g2.fill(rec); g2.setPaint(new Color(255, 0, 0)); cir.setFrame(x, y, 15, 15); g2.fill(cir); } else { g.setFont(new Font( "Helvetica", Font.BOLD, 50)); g.drawString("GAME OVER", 150, 200); } }
public void actionPerformed (ActionEvent e) {
String nameButton = e.getActionCommand(); if (e.getSource() instanceof JButton) { if ("Training".equals(nameButton)) { training = true; System.out.println("Se ha pulsado Training"); } if ("Play".equals(nameButton)) { training = true; System.out.println("Se ha pulsado play"); bloqueado = false; gameOver = false; } } } }
_________________________________________________________
La clase NetData está preparada para la recogida de datos: en esta primera versión sólo se inicializan.
Puede descargar el código completo aquí:



0 comentarios:
Publicar un comentario en la entrada