/*****************************TODO:1) Ver Bug de cuando se pasa de Level - SOLUCIONADO2) Que las manzanas no se puedan poner en los bordes ni en donde este algun obstaculo - HECHO3) Que los obstaculos no se puedan poner en donde esta la vibora y en donde esta la manzana - HECHO4) Hacer un save game5) Poder poner en pausa6) Que los distintos puntajes se manden por internet a un server (tzulberti.no-ip.info)7) Guardar puntajes - HECHO*****************************/import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.Vector;import javax.swing.JOptionPane;import java.util.Random;import java.io.*;public class Juego extends JPanel implements KeyListener, FocusListener, MouseListener, ActionListener { private static int TAMANIO_JUGADOR = 10; private static int TAMANIO_MANZANA = 10; private static int TAMANIO_OBSTACULO = 10; private static int TAMANIO_BORDE = 3; private static int PUNTAJE_POR_LEVEL = 3; //Datos realmente importantes private Player jugador; private Vector coordenadasDeLosObstaculos = new Vector(); private Coordenada posicionDeLaManzana = new Coordenada(); private boolean perdio = false; //Datos necesarios por la implementacion private int ultimaTeclaPresionada = KeyEvent.VK_DOWN; private Timer volverAPintarTodo; private char teclaPresionada = 'a'; // Lo del timer, que esta corriendo de fondo public void actionPerformed(ActionEvent evt) { ocuparSeDeTodo(); repaint(); }; public Juego(String nombrePlayer, int posX, int posY, tiempoTimer) { super.requestFocus(); jugador = new Player(nombrePlayer, posX, posY); //tambien le cargo un obstaculo Coordenada obst = new Coordenada(); obst.x = 50; obst.y = 200; coordenadasDeLosObstaculos.add(obst); //pongo la manzana posicionDeLaManzana.x = 10; posicionDeLaManzana.y = 70; setBackground(Color.BLACK); //Le agrego el timer para que empiece //ClasePedorra aux = new ClasePedorra(); volverAPintarTodo = new Timer(tiempoTimer, this); volverAPintarTodo.start(); //ahora tambien le doy el foco del teclado addKeyListener(this); addFocusListener(this); addMouseListener(this); } //Esta funcion es la que se encarga de pintar todo... public void paintComponent(Graphics g) { super.paintComponent(g); //Primero pintamos la manzana g.setColor(Color.RED); g.fillOval(posicionDeLaManzana.x, posicionDeLaManzana.y, TAMANIO_MANZANA, TAMANIO_MANZANA); //ahora pinto los obstaculos g.setColor(Color.BLUE); int i = 0; Coordenada aux = new Coordenada(); while ( i < coordenadasDeLosObstaculos.size()) { aux = (Coordenada) coordenadasDeLosObstaculos.get(i); g.fillRect(aux.x, aux.y, TAMANIO_OBSTACULO, TAMANIO_OBSTACULO); i++; }; //pinto los bordes g.setColor(Color.BLUE); g.fillRect(0, 0, TAMANIO_BORDE, getHeight()); g.fillRect(getWidth()-TAMANIO_BORDE, 0, TAMANIO_BORDE, getHeight()); g.fillRect(0, 0, getWidth(), TAMANIO_BORDE); g.fillRect(0, getHeight()-TAMANIO_BORDE, getWidth(), TAMANIO_BORDE); //finalmente pinto el jugador int j = 0; g.setColor(Color.GREEN); while (j < jugador.posicionesQueOcupa().size()) { aux = (Coordenada) jugador.posicionesQueOcupa().get(j); g.fillOval(aux.x, aux.y, TAMANIO_JUGADOR, TAMANIO_JUGADOR); j++; }; } ///////////////////////////////////////////////////////////////////////////////////// ///////////////// Funciones para ver como esta el estado del juego ////////////////// ///////////////////////////////////////////////////////////////////////////////////// private void ocuparSeDeTodo() { boolean tieneQuePasarLevel = false; if (!perdio()) { if (comioManzana()) { comerManzana(); tieneQuePasarLevel = (jugador.puntaje % PUNTAJE_POR_LEVEL == 0); }; //veo si paso de level if (((jugador.puntaje % PUNTAJE_POR_LEVEL == 0) && (jugador.puntaje != 0)) && tieneQuePasarLevel) { //Me fijo que el bloque que voy a poner este en alguna //posicion valida boolean elBloqueEstaMalPuesto = true; Coordenada aux = new Coordenada(); Random nroRandom = new Random(); while ( elBloqueEstaMalPuesto) { aux.x = (nroRandom.nextInt(getWidth()) / 10) * 10; aux.y = (nroRandom.nextInt(getHeight()) / 10) * 10; elBloqueEstaMalPuesto = coordenadasDeLosObstaculos.contains(aux) || jugador.posicionesQueOcupa().contains(aux) || aux.x == 0 || aux.x == getWidth() || aux.y == 0 || aux.y == getHeight(); }; coordenadasDeLosObstaculos.add(aux); tieneQuePasarLevel = false; } //ahora muevo el jugador if (ultimaTeclaPresionada == KeyEvent.VK_LEFT) { jugador.mover("izq", TAMANIO_JUGADOR); } if (ultimaTeclaPresionada == KeyEvent.VK_RIGHT) { jugador.mover("der", TAMANIO_JUGADOR); } if (ultimaTeclaPresionada == KeyEvent.VK_UP) { jugador.mover("arriba", TAMANIO_JUGADOR); } if (ultimaTeclaPresionada == KeyEvent.VK_DOWN) { jugador.mover("abajo", TAMANIO_JUGADOR); }; } else { volverAPintarTodo.stop(); perdio = true; guardarPuntaje(); JOptionPane.showMessageDialog(null, "Perdiste"); }; }; ///////////////////////////////////////////////////////////////////////////////////// ///////////// Aca estan las funciones para cuando come manzana /////////////// ///////////////////////////////////////////////////////////////////////////////////// private boolean comioManzana() { return jugador.posicionesQueOcupa().get(0).equals(posicionDeLaManzana); }; private void comerManzana() { //pongo una nueva coordenada para la manzana Random nroRandom = new Random(); jugador.comer("abajo", TAMANIO_JUGADOR); boolean esaPosicionEstabaOcupada = true; while ( esaPosicionEstabaOcupada) { posicionDeLaManzana.x = (nroRandom.nextInt(getWidth()) / 10) * 10; posicionDeLaManzana.y = (nroRandom.nextInt(getHeight()) / 10) * 10; //ahora me fijo que esa posicion, sea una posicion valida. esaPosicionEstabaOcupada = coordenadasDeLosObstaculos.contains(posicionDeLaManzana) || jugador.posicionesQueOcupa().contains(posicionDeLaManzana) || posicionDeLaManzana.x == 0 || posicionDeLaManzana.x == getWidth() || posicionDeLaManzana.y == 0 || posicionDeLaManzana.y == getHeight(); }; } ///////////////////////////////////////////////////////////////////////////////////// ///////////////// Aca estan las funciones para ver si perdio ////////////////// ///////////////////////////////////////////////////////////////////////////////////// private boolean perdio() { boolean sigueJugando = true; sigueJugando = (!chocoElPlayer()) && (!seChocoElMismo()); return !sigueJugando; } private boolean chocoElPlayer() { Coordenada aux = new Coordenada(); int i = 0; int j = 0; boolean resultado = false; while (!resultado && i < jugador.posicionesQueOcupa.size()) { j = 0; aux = (Coordenada)jugador.posicionesQueOcupa.get(i); //primer me fijo si choco contra algun borde if (aux.x == 0 || aux.x > getWidth() - TAMANIO_JUGADOR) { resultado = true; }; if (aux.y == 0 || aux.y > getHeight() - TAMANIO_JUGADOR) { resultado = true; }; //ahora me fijo si choco contra algun obstaculo while ( ! resultado && j < coordenadasDeLosObstaculos.size()) { resultado = coordenadasDeLosObstaculos.get(j).equals(aux); j++; }; i++; }; return resultado; }; private boolean seChocoElMismo() { //esta funcion indica si se choco el mismo a lo largo de la serpiente int i = 0; boolean resultado = false; Coordenada aux = new Coordenada(); while (! resultado && i < jugador.posicionesQueOcupa().size()) { aux = (Coordenada) jugador.posicionesQueOcupa.get(i); resultado = jugador.posicionesQueOcupa().indexOf(aux, i+1) != -1; i++; }; return resultado; }; ///////////////////////////////////////////////////////////////////////////////////// ///////////// Estas son las funciones de cuando el jugador pierde /////////////// ///////////////////////////////////////////////////////////////////////////////////// void guardarPuntaje() { try { long posLeida = 0; RandomAccessFile frw = new RandomAccessFile("puntaje.dat", "rw"); String textoLeido = " "; String textoAGrabar = " "; boolean yaTermine = false; while (posLeida < frw.length() && !yaTermine) { //Voy a ver si este jugador ya tiene un puntaje ingresado, y si es asi //guardo el mayor de los dos textoLeido = frw.readUTF(); frw.seek(posLeida); //Primero comparo los nombres if (textoLeido.contains(jugador.nombre())) { //comparo los puntajes Integer puntajeJuego = new Integer(jugador.puntaje()); Integer puntajeGuardado = new Integer(textoLeido.substring(jugador.nombre().length()+1, textoLeido.length()-1)); if (puntajeGuardado < puntajeJuego) { System.out.println("Superastes tu puntaje"); System.out.println("Viejo Puntaje: "+ puntajeGuardado); System.out.println("Nuevo Puntaje: " + puntajeJuego); //vuelvo a formar el nuevo string a guardar textoAGrabar = jugador.nombre() + " " + puntajeJuego.toString() + "\n"; frw.writeUTF(textoAGrabar); } else { System.out.println("No superastes tu puntaje"); System.out.println("Viejo Puntaje: "+ puntajeGuardado); System.out.println("Nuevo Puntaje: " + puntajeJuego); } //como ya encontre jugador en el archivo, termine de guardar los datos yaTermine = true; } //Hago esto para avanzar a la proxima linea frw.readLine(); posLeida = frw.getFilePointer(); }; //termino de leer todo el archivo, pero el jugador no esta, por lo que lo tengo que agregar if (!yaTermine) { System.out.println("No se encontro el player, por lo que se lo crea en el archivo"); System.out.println("Nombre: " + jugador.nombre()); System.out.println("Puntaje: " + jugador.puntaje()); textoAGrabar = jugador.nombre() + " " + jugador.puntaje() + "\n"; frw.writeUTF(textoAGrabar); yaTermine = true; }; frw.close(); } catch (Exception e) { System.out.println("Salio por la exception: " + e); }; }; ///////////////////////////////////////////////////////////////////////////////////// ///////////////// Estas son las funciones del FocusListener ////////////////// ///////////////////////////////////////////////////////////////////////////////////// public void focusGained(FocusEvent evt) { repaint(); // redraw with cyan border } public void focusLost(FocusEvent evt) { repaint(); // redraw without cyan border volverAPintarTodo.stop(); Graphics g = new Graphics(); g.drawstring("PAUSA", 100, 100); } ///////////////////////////////////////////////////////////////////////////////////// ///////////////// Estas son las funciones del MouseListener ////////////////// ///////////////////////////////////////////////////////////////////////////////////// public void mousePressed(MouseEvent evt) { requestFocus(); } public void mouseEntered(MouseEvent evt) { } // Required by the public void mouseExited(MouseEvent evt) { } // MouseListener public void mouseReleased(MouseEvent evt) { } // interface. public void mouseClicked(MouseEvent evt) { } ///////////////////////////////////////////////////////////////////////////////////// ///////////////// Estas son las funciones del KeyListener ////////////////// ///////////////////////////////////////////////////////////////////////////////////// public void keyPressed(KeyEvent evt) { this.ultimaTeclaPresionada = evt.getKeyCode(); } public void keyReleased(KeyEvent evt) {}; public void keyTyped(KeyEvent evt) { this.teclaPresionada = evt.getKeyChar(); } ;}