41
Aprender a programar desde cero / Re: Ayuda, programar una batalla pokemon en JAVA NETBEANS POO
« en: 11 de Febrero 2021, 20:36 »
Ya que nuestro 'máster' Kabuto se ha tomado el trabajo de preparar el código (gracias como siempre), me permito subirlo para que pueda ser accedido fácilmente y se mantenga aunque se rompan los links si esto ocurriera.
Si me equivoco en algo corrígeme Kabuto. El proyecto consta de dos packages con diferentes archivos como se indica a continuación:
package batalla: clases BatallaSwing.java (clase con el main) y Pokemon.java
package gui: clases PanelPokemon.java, PanelVS.java y PanelMensajes.java
Para que el código funcione es necesario poner las imágenes en la ruta adecuada y con los nombres adecuados, o bien modificarlo. Las imágenes están referenciadas en las líneas
pnPok1 = new PanelPokemon(pok1, "img/pikachu.png");
pnPok2 = new PanelPokemon(pok2, "img/bulbasaur.png");
ImageIcon imagen = new ImageIcon(PanelVS.class.getClassLoader().getResource("img/vs.png"))
CLASE BatallaSwing
CLASE Pokemon
CLASE PanelPokemon
CLASE PanelVS
CLASE PanelMensajes
Si me equivoco en algo corrígeme Kabuto. El proyecto consta de dos packages con diferentes archivos como se indica a continuación:
package batalla: clases BatallaSwing.java (clase con el main) y Pokemon.java
package gui: clases PanelPokemon.java, PanelVS.java y PanelMensajes.java
Para que el código funcione es necesario poner las imágenes en la ruta adecuada y con los nombres adecuados, o bien modificarlo. Las imágenes están referenciadas en las líneas
pnPok1 = new PanelPokemon(pok1, "img/pikachu.png");
pnPok2 = new PanelPokemon(pok2, "img/bulbasaur.png");
ImageIcon imagen = new ImageIcon(PanelVS.class.getClassLoader().getResource("img/vs.png"))
CLASE BatallaSwing
Código: [Seleccionar]
package batalla;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import gui.*;
@SuppressWarnings("serial")
public class BatallaSwing extends JFrame{
private Pokemon pok1;
private Pokemon pok2;
private PanelMensajes pnMensajes;
private PanelPokemon pnPok1;
private PanelPokemon pnPok2;
public BatallaSwing() {
pok1 = new Pokemon("Pikachu", 100, true);
pok2 = new Pokemon("Bulbasaur", 100, false);
pnMensajes = new PanelMensajes();
pnPok1 = new PanelPokemon(pok1, "img/pikachu.png");
pnPok1.actualizarPanel();
pnPok1.agregarAccion(new AccionAtacar());
pnPok2 = new PanelPokemon(pok2, "img/bulbasaur.png");
pnPok2.actualizarPanel();
pnPok2.agregarAccion(new AccionAtacar());
setLayout(new BorderLayout());
add(pnMensajes, BorderLayout.NORTH);
JPanel pnCentro = new JPanel();
pnCentro.add(pnPok1);
pnCentro.add(new PanelVS());
pnCentro.add(pnPok2);
add(pnCentro, BorderLayout.CENTER);
setTitle("Batalla Pokemon");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private class AccionAtacar implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (pok1.suTurno) {
pok2.perderVida(pok1.atacar());
pnMensajes.setMensaje(pok1.mensaje);
pok1.suTurno = false;
pok2.suTurno = true;
}
else {
pok1.perderVida(pok2.atacar());
pnMensajes.setMensaje(pok2.mensaje);
pok1.suTurno = true;
pok2.suTurno = false;
}
pnPok1.actualizarPanel();
pnPok2.actualizarPanel();
if (pok1.getVida() <= 0 || pok2.getVida() <= 0) {
String mensajeFinal = "Juego Terminado\n Ha ganado: ";
mensajeFinal += pok1.getVida()>0?pok1.getNombre():pok2.getNombre();
JOptionPane.showMessageDialog(null, mensajeFinal, "Fin del Juego",
JOptionPane.INFORMATION_MESSAGE);
//Valores por defecto para volver a jugar
pok1.setVida(100);
pok1.suTurno = true;
pok2.setVida(100);
pok2.suTurno = true;
pnPok1.actualizarPanel();
pnPok2.actualizarPanel();
pnMensajes.setMensaje("¡Comienza la batalla!");
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new BatallaSwing();
}
});
}
}
CLASE Pokemon
Código: [Seleccionar]
package batalla;
import java.util.Random;
public class Pokemon {
private String nombre;
private int vida;
private Random azar = new Random();
public String mensaje; //Mensaje que se genera tras un ataque
public boolean suTurno; //Indica si es el turno de ataque de este Pokemon
public Pokemon(String nombrePok, int vidaPok, boolean turno) {
nombre = nombrePok;
vida = vidaPok;
mensaje = "";
suTurno = turno;
}
public String getNombre() {
return nombre;
}
public int getVida() {
return vida;
}
public void setVida(int v) {
vida = v;
}
public int atacar() {
mensaje = ""; //Se generará un nuevo mensaje
int ataque = azar.nextInt(11) + 10;
if (esCritico()) {
mensaje += "¡Ataque crÃtico! ";
ataque = (int)(ataque * 1.5);
}
mensaje += "Daño: " + ataque + " puntos";
return ataque;
}
public void perderVida(int ataque) {
vida -= ataque;
}
private boolean esCritico() {
int valor = azar.nextInt(100);
/*
* Entre 0 y 100 hay diez valores que son
* múltiplos de 10.
* Es decir, hay un 10% de posibilidades
* de obtener un valor múltiplo de 10.
*/
return valor%10 == 0;
}
@Override
public String toString() {
return "Nombre: " + nombre + "\nVida: " + vida;
}
}
CLASE PanelPokemon
Código: [Seleccionar]
package gui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.BevelBorder;
import javax.swing.border.TitledBorder;
import batalla.Pokemon;
@SuppressWarnings("serial")
public class PanelPokemon extends JPanel{
private Pokemon pokemon;
private JButton btAtacar;
private JProgressBar barraVida;
public PanelPokemon(Pokemon pok, String rutaImagen) {
pokemon = pok;
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new PanelNombre());
add(new PanelImagen(rutaImagen));
add(new PanelVida());
add(new PanelBoton());
}
private class PanelNombre extends JPanel {
public PanelNombre() {
JLabel nombre = new JLabel(pokemon.getNombre());
nombre.setFont(new Font("Consolas", Font.BOLD, 34));
nombre.setForeground(Color.WHITE);
add(nombre);
setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED, Color.WHITE, Color.BLACK));
setBackground(new Color(23, 151, 238));
}
}
private class PanelImagen extends JPanel {
public PanelImagen(String rutaImagen) {
ImageIcon imagen = new ImageIcon(PanelPokemon.class.getClassLoader().getResource(rutaImagen));
JLabel icono = new JLabel(imagen);
icono.setBorder(BorderFactory.createLoweredSoftBevelBorder());
add(icono);
}
}
private class PanelVida extends JPanel {
public PanelVida() {
barraVida = new JProgressBar();
barraVida.setMaximum(pokemon.getVida());
barraVida.setValue(pokemon.getVida());
barraVida.setPreferredSize(new Dimension(200, 30));
barraVida.setForeground(Color.BLUE);
add(barraVida);
barraVida.setBorder(BorderFactory.createRaisedSoftBevelBorder());
TitledBorder bordeTitulado = new TitledBorder("Nivel de Vida");
bordeTitulado.setTitleFont(new Font("Consolas", Font.ITALIC, 24));
setBorder(bordeTitulado);
}
}
private class PanelBoton extends JPanel {
public PanelBoton() {
btAtacar = new JButton("¡ATACAR!");
btAtacar.setFont(new Font("Consolas", Font.BOLD, 30));
add(btAtacar);
setBorder(BorderFactory.createEmptyBorder(30, 20, 30, 30));
}
}
public void actualizarPanel() {
barraVida.setValue(pokemon.getVida());
btAtacar.setEnabled(pokemon.suTurno);
}
public void agregarAccion(ActionListener accion) {
btAtacar.addActionListener(accion);
}
}
CLASE PanelVS
Código: [Seleccionar]
package gui;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class PanelVS extends JPanel{
public PanelVS() {
ImageIcon imagen = new ImageIcon(PanelVS.class.getClassLoader().getResource("img/vs.png"));
JLabel icono = new JLabel(imagen);
add(icono);
}
}
CLASE PanelMensajes
Código: [Seleccionar]
package gui;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
@SuppressWarnings("serial")
public class PanelMensajes extends JPanel{
private JLabel mensajes;
public PanelMensajes() {
JPanel display = new JPanel();
mensajes = new JLabel("¡Comienza la batalla!");
mensajes.setFont(new Font("Calibri", Font.PLAIN, 38));
mensajes.setForeground(new Color(243, 81, 55 ));
display.add(mensajes);
setLayout(new GridLayout(1, 1));
add(display);
setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 15, 10, 15),
BorderFactory.createEtchedBorder(EtchedBorder.RAISED)));
display.setBackground(new Color(230, 234, 160 ));
}
public void setMensaje(String mensaje) {
mensajes.setText(mensaje);
}
}