Vamos a crear un pequeño programa en Java para generar apuestas de futbol. Las apuestas serán del tipo quinielísticas igual que los boletos que se venden en España.
Cada boleto esta compuesto de 8 columnas con 14 partidos. Los partidos de cada columna son apuestas con tres valores 1, X, 2. Si un equipo gana en casa es un 1, si empata es una X y si pierde es un 2. La ultima apuesta o pleno al 15 son los números de goles marcados por cada equipo que juega ese partido 0, 1, 2, M. Donde M es 3 o mas goles.
Lenguaje
Escribiremos el código con programación estructurada en funciones y lenguaje Java SE por ser ejecutable tanto en Windows como en Linux. Usaremos un editor de texto o Eclipse.
Diseño
Nada mas empezar mostraremos un mensaje de bienvenida y el menú con las opciones de pronosticar apuestas, configuración e información sobre la versión del programa.Sobre las opciones: Apuesta, 1x2%, ?.
- Apuesta: Elegir 'Empezar' que será la que nos calcule el pronostico y salga por pantalla.
- 1X2 %: Configuraciones que nos calculara pronósticos al azar según porcentaje elegido.
- ?: Información sobre la versión del programa.
Código
Escribiremos casi todo el código dentro del método main(). Nombramos a la ventana de la aplicación como 'Quiniela 2000'. La ventana tendrá un tamaño de 220 x 300 pixels no redimensionable.
JFrame ventana = new JFrame("Quiniela 2000"); // Ventana ventana.setSize(220, 300); // 220 ancho x 300 alto ventana.setResizable(false); // No dimensionable ventana.setVisible(true); // Visible ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Lo siguiente será escribir el código del menú con sus tres opciones.
JMenuBar barraMenu=new JMenuBar(); // Barra menu ventana.setJMenuBar(barraMenu); JMenu calcular= new JMenu("Apuesta"); // Menu Apuesta barraMenu.add(calcular); JMenuItem empezar=new JMenuItem("Empezar"); // Submenu Empezar calcular.add(empezar); JMenu configurar= new JMenu("1X2 %"); // Menu Configurar barraMenu.add(configurar); ButtonGroup grupo = new ButtonGroup(); // Grupo radioButton JRadioButtonMenuItem rbMenuItem1,rbMenuItem2,rbMenuItem3; rbMenuItem1=new JRadioButtonMenuItem("55,56 - 33,33 - 11,11"); // Submenu 5-3-1 rbMenuItem1.setSelected(true); // Por defecto esta opción seleccionada grupo.add(rbMenuItem1); configurar.add(rbMenuItem1); rbMenuItem2=new JRadioButtonMenuItem("55,56 - 22,22 - 22,22"); // Submenu 5-2-2 grupo.add(rbMenuItem2); configurar.add(rbMenuItem2); rbMenuItem3=new JRadioButtonMenuItem("33,33 - 33,33 - 33,33"); // Submenu 3-3-3 grupo.add(rbMenuItem3); configurar.add(rbMenuItem3); JMenu acercaDe= new JMenu("?"); // Menu Acerca de... barraMenu.add(acercaDe); JMenuItem sobreQuiniela=new JMenuItem("Sobre Quiniela"); // Submenu Sobre.. acercaDe.add(sobreQuiniela);
El mensaje de bienvenida lo escribiremos como una etiqueta centrada en horizontal y vertical dentro de un contenedor tipo JPanel. Este contenedor será el mismo donde también visualizaremos los pronósticos de las apuestas.
JPanel panel=new JPanel(new GridLayout(1,1)); // Tipo Panel JLabel labelBienvenido= new JLabel("¡ Bienvenido a Quiniela 2000 !",SwingConstants.CENTER); labelBienvenido.setVerticalAlignment(SwingConstants.CENTER); panel.add(labelBienvenido); // Agregar etiqueta a Panel ventana.add(panel); // Agregar Panel a Ventana
Ahora nos toca añadir los eventos a cada opción del menú para según lo que se elija hacer una cosa u otra.Con ActionListener y ActionPerformed crearemos la subrutinas de la opciones para los eventos de menú.
Evento accionEmpezar.
Declaramos una variable global llamada 'modoApuesta' que vamos a necesitar en la subrutina del evento para saber que configuración tomar a la hora de representar el pronostico de la apuesta.
public class Programa { static int modoApuesta=1; // Metodo principal public static void main(String[] args) {
Dentro del método principal declaramos el objeto evento accionEmpezar con su código.
JLabel labelPartido = new JLabel("Partido",SwingConstants.CENTER); JLabel labelPronostico= new JLabel("Pronostico",SwingConstants.CENTER); Border border = LineBorder.createGrayLineBorder(); labelPartido.setBorder(border); labelPronostico.setBorder(border); ActionListener accionEmpezar=new ActionListener() { public void actionPerformed(ActionEvent e) { panel.setLayout(new GridLayout(17,2)); panel.removeAll(); panel.add(labelPartido); panel.add(labelPronostico); for (int i=1, c;i<=16;i++) { if (i<15) c=i; else c=15; panel.add(new JLabel(""+c,SwingConstants.CENTER)); panel.add(new JLabel(generaCasilla(modoApuesta,c),SwingConstants.CENTER)); } panel.revalidate(); } };
Dentro de la Clase creamos un método generaCasilla() que va a utilizar el evento accionEmpezar que nos da el resultado de la casilla apostada según la variable modoApuesta
public static String generaCasilla(int modo, int casilla) { Random rnd = new Random(); int num; if (casilla<15) { num = rnd.nextInt(9); // Devuelve 0 a 8 switch(modo) { case 1: // 55,56 - 33,33 - 11,11 switch(num) { case 0: case 1: case 2: case 3: case 4: return "1"; case 5: case 6: case 7: return "X"; case 8: return "2"; } break; case 2: // 55,56 - 22,22 - 22,22 switch(num) { case 0: case 1: case 2: case 3: case 4: return "1"; case 5: case 6: return "X"; case 7: case 8: return "2"; } break; case 3: // 33,33 - 33,33 - 33,33 switch(num) { case 0: case 1: case 2: return "1"; case 3: case 4: case 5: return "X"; case 6: case 7: case 8: return "2"; } break; } } else { num=rnd.nextInt(4); // Devuelve 0 a 3 switch(num) { case 0: return "0"; case 1: return "1"; case 2: return "2"; case 3: return "M"; } } return ""; }
Evento accionConfigura.
Damos valor a la variable global modoApuesta según la opción del menú configura
String primero = new String("Boton1"); String segundo = new String("Boton2"); String tercero = new String("Boton3"); ActionListener accionConfigura=new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == primero) modoApuesta=1; else if (e.getActionCommand() == segundo) modoApuesta=2; else if (e.getActionCommand() == tercero) modoApuesta=3; } };
Evento accionAcercaDe.
Visualizamos una ventana con información del programa con el método JOptionPane.showMessageDialog()
ActionListener accionAcercaDe=new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(ventana, "Quiniela 2000 Version 1.0", "Sobre Quiniela",JOptionPane.INFORMATION_MESSAGE); // El primer parametro muestra ventana en medio } };
Por último nos queda asignar a cada evento de la opción del menú su rutina.
empezar.addActionListener(accionEmpezar); rbMenuItem1.addActionListener(accionConfigura); rbMenuItem1.setActionCommand(primero); rbMenuItem2.addActionListener(accionConfigura); rbMenuItem2.setActionCommand(segundo); rbMenuItem3.addActionListener(accionConfigura); rbMenuItem3.setActionCommand(tercero); sobreQuiniela.addActionListener(accionAcercaDe);
Código completo
Aquí esta el código completo del programa.
package com.popularfan.quiniela1; import java.awt.GridLayout; import java.util.Random; import javax.swing.*; import java.awt.event.*; import javax.swing.border.LineBorder; import javax.swing.border.Border; public class Programa { static int modoApuesta=1; // Metodo principal public static void main(String[] args) { // ##################### VENTANA ############################# JFrame ventana = new JFrame("Quiniela 2000"); // Ventana ventana.setSize(220, 300); // 220 ancho x 300 alto ventana.setResizable(false); // No dimensionable ventana.setVisible(true); // Visible ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ##################### BARRA MENU ########################## JMenuBar barraMenu=new JMenuBar(); // Barra menu ventana.setJMenuBar(barraMenu); JMenu calcular= new JMenu("Apuesta"); // Menu Apuesta barraMenu.add(calcular); JMenuItem empezar=new JMenuItem("Empezar"); // Submenu Empezar calcular.add(empezar); JMenu configurar= new JMenu("1X2 %"); // Menu Configurar barraMenu.add(configurar); ButtonGroup grupo = new ButtonGroup(); // Grupo radioButton JRadioButtonMenuItem rbMenuItem1,rbMenuItem2,rbMenuItem3; rbMenuItem1=new JRadioButtonMenuItem("55,56 - 33,33 - 11,11"); // Submenu 5-3-1 rbMenuItem1.setSelected(true); // Por defecto esta opción seleccionada grupo.add(rbMenuItem1); configurar.add(rbMenuItem1); rbMenuItem2=new JRadioButtonMenuItem("55,56 - 22,22 - 22,22"); // Submenu 5-2-2 grupo.add(rbMenuItem2); configurar.add(rbMenuItem2); rbMenuItem3=new JRadioButtonMenuItem("33,33 - 33,33 - 33,33"); // Submenu 3-3-3 grupo.add(rbMenuItem3); configurar.add(rbMenuItem3); JMenu acercaDe= new JMenu("?"); // Menu Acerca de... barraMenu.add(acercaDe); JMenuItem sobreQuiniela=new JMenuItem("Sobre Quiniela"); // Submenu Sobre.. acercaDe.add(sobreQuiniela); // ##################### PANEL ############################### JPanel panel=new JPanel(new GridLayout(1,1)); // Tipo Panel JLabel labelBienvenido= new JLabel("¡ Bienvenido a Quiniela 2000 !",SwingConstants.CENTER); labelBienvenido.setVerticalAlignment(SwingConstants.CENTER); panel.add(labelBienvenido); // Agregar etiqueta a Panel ventana.add(panel); // Agregar Panel a Ventana // ##################### EVENTOS MENU ####################### // Evento Empezar JLabel labelPartido = new JLabel("Partido",SwingConstants.CENTER); JLabel labelPronostico= new JLabel("Pronostico",SwingConstants.CENTER); Border border = LineBorder.createGrayLineBorder(); labelPartido.setBorder(border); labelPronostico.setBorder(border); ActionListener accionEmpezar=new ActionListener() { public void actionPerformed(ActionEvent e) { panel.setLayout(new GridLayout(17,2)); panel.removeAll(); panel.add(labelPartido); panel.add(labelPronostico); for (int i=1, c;i<=16;i++) { if (i<15) c=i; else c=15; panel.add(new JLabel(""+c,SwingConstants.CENTER)); panel.add(new JLabel(generaCasilla(modoApuesta,c),SwingConstants.CENTER)); } panel.revalidate(); } }; // Evento Configura String primero = new String("Boton1"); String segundo = new String("Boton2"); String tercero = new String("Boton3"); ActionListener accionConfigura=new ActionListener() { public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == primero) modoApuesta=1; else if (e.getActionCommand() == segundo) modoApuesta=2; else if (e.getActionCommand() == tercero) modoApuesta=3; } }; // Evento Acerca De.. ActionListener accionAcercaDe=new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(ventana, "Quiniela 2000 Version 1.0", "Sobre Quiniela",JOptionPane.INFORMATION_MESSAGE); // El primer parametro muestra ventana en medio } }; // Asignar cada evento con su opcion de menu empezar.addActionListener(accionEmpezar); rbMenuItem1.addActionListener(accionConfigura); rbMenuItem1.setActionCommand(primero); rbMenuItem2.addActionListener(accionConfigura); rbMenuItem2.setActionCommand(segundo); rbMenuItem3.addActionListener(accionConfigura); rbMenuItem3.setActionCommand(tercero); sobreQuiniela.addActionListener(accionAcercaDe); } // Metodo calcular pronostico casillas public static String generaCasilla(int modo, int casilla) { Random rnd = new Random(); int num; if (casilla<15) { num = rnd.nextInt(9); // Devuelve 0 a 8 switch(modo) { case 1: // 55,56 - 33,33 - 11,11 switch(num) { case 0: case 1: case 2: case 3: case 4: return "1"; case 5: case 6: case 7: return "X"; case 8: return "2"; } break; case 2: // 55,56 - 22,22 - 22,22 switch(num) { case 0: case 1: case 2: case 3: case 4: return "1"; case 5: case 6: return "X"; case 7: case 8: return "2"; } break; case 3: // 33,33 - 33,33 - 33,33 switch(num) { case 0: case 1: case 2: return "1"; case 3: case 4: case 5: return "X"; case 6: case 7: case 8: return "2"; } break; } } else { num=rnd.nextInt(4); // Devuelve 0 a 3 switch(num) { case 0: return "0"; case 1: return "1"; case 2: return "2"; case 3: return "M"; } } return ""; } }