[principiante] Loteria

Iniciado por Geek7, 27 Junio 2013, 19:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Geek7

A base d emis conecptos basicos he hecho un mini programa que funciona como una loteria. Permite al usuario elegir entre 1 y 5 tickets y chequear si gano.. Quiero saber criticas a nivel de codigo (ubicacion de declaracion de variables, nombres etc...).

Código (java) [Seleccionar]

package exercise;

import java.util.Random;
import java.util.Scanner;

public class Lotto {

/**
* @author geek7
*/
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int choice;

while(true) {
System.out.println("$$$$$$$ LOTTO $$$$$$$");
System.out.println("Hi, how many tickets would you like to buy?");
System.out.println(" 1) 1 Ticket");
System.out.println(" 2) 2 Tickets");
System.out.println(" 3) 3 Tickets");
System.out.println(" 4) 4 Tickets");
System.out.println(" 5) 5 Tickets");
System.out.println(" 0) In bankrupt - Nothing\n");
choice = keyboard.nextInt();

if (choice == 0) {
System.out.println("EXITING...");
System.exit(0);
}


System.out.println("\nPrinting tickets...");
System.out.println("----------------------");

Random generateNumbers = new Random();
int[] tickets = new int[59];
int[] yourTickets = new int[choice];
int i, matched = 0;

// Generate list of numbers
for(i = 0; i < tickets.length; i++) {
tickets[i] = generateNumbers.nextInt(60);
}

// Give him his tickets
System.out.print("\nThese are your tickets: \t");
for (i = 0; i < yourTickets.length; i++) {
yourTickets[i] = generateNumbers.nextInt(60);
System.out.print(yourTickets[i] + " ");
}
System.out.println("\n\nLet's if you won something... \n");

// Check if something matched
for(i = 0; i < yourTickets.length; i++) {
for(int j = 0; j < tickets.length; j++) {
if (yourTickets[i] == tickets[j]) {
matched++;
}
}
}
// Make a pause
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
}

switch (matched) {
case 1:
System.out.println("You won $100!");
break;

case 2:
System.out.println("You won $200!");
break;

case 3:
System.out.println("You won $500!");
break;

case 4:
System.out.println("You won $800!");
break;

case 5:
System.out.println("GREAT. You've got the pot: $1000!");
break;

case 0:
System.out.println("Have luck next time!");
break;

default:
System.out.println("Something went wrong");
System.exit(1);
}

// Ask if he wants to try again
System.out.print("Would you like to try again? (X to exit) \t");
String tryAgain = keyboard.next();

if(tryAgain.compareToIgnoreCase("x") == 0) {
System.out.println("Thank you. Bye");
System.exit(0);
}

// Just clear screen
for (int l = 0; l < 1000; l++) {
System.out.println();
}

}


}

}

Mitgus

Está bien, sintaxis limpia y clara. Lo que te puedo recomendar es que lo hagas mediante un Thread y algo muy importante:

Aprovecha la POO, no hagas todo en el main. Así tendrás un código limpio, y fácil de mantener.

Código (=java) [Seleccionar]
import java.util.Random;
import java.util.Scanner;

public class Loteria {

int choice;
int[] tickets;
int[] yourTickets;
int matched;
Scanner keyboard = new Scanner(System.in);

public Loteria(){
Jugar instance = new Jugar();
instance.start();
}

void generar_tickets(int eleccion){

System.out.println("\nPrinting tickets...");
System.out.println("----------------------");

Random generateNumbers = new Random();
tickets = new int[59];
yourTickets = new int[eleccion];
int i;

// Generate list of numbers
for(i = 0; i < tickets.length; i++) {
tickets[i] = generateNumbers.nextInt(60);
}

// Give him his tickets
System.out.print("\nThese are your tickets: \t");
for (i = 0; i < yourTickets.length; i++) {
yourTickets[i] = generateNumbers.nextInt(60);
System.out.print(yourTickets[i] + " ");
}

} // fin metodo


void comparar(){

System.out.println("\n\nLet's if you won something... \n");

// Check if something matched
for(int i = 0; i < yourTickets.length; i++) {
for(int j = 0; j < tickets.length; j++) {
if (yourTickets[i] == tickets[j]) {
matched++;
     }
   }
}

// Make a pause
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
}

switch (matched) {
case 1:
System.out.println("You won $100!");
break;

case 2:
System.out.println("You won $200!");
break;

case 3:
System.out.println("You won $500!");
break;

case 4:
System.out.println("You won $800!");
break;

case 5:
System.out.println("GREAT. You've got the pot: $1000!");
break;

case 0:
System.out.println("Have luck next time!");
break;

default:
System.out.println("Something went wrong");
System.exit(1);
}

} // fin metodo

boolean jugar_denuevo() {

// Ask if he wants to try again
System.out.print("Would you like to try again? (X to exit) \t");
String tryAgain = keyboard.next();

if(tryAgain.compareToIgnoreCase("x") == 0) {
System.out.println("Thank you. Bye");
System.exit(0);
return false;
}
else {
// Just clear screen
for (int l = 0; l < 1000; l++) {
System.out.println();
  }
return true;

  }
}// fin metodo


// clase que empieza el juego mediante thread
private class Jugar extends Thread{

private boolean continuar=true; //condicion del thread


public void run()  { // incia el thread
while(continuar) { // hace la tarea mientras continuar sea true

try {
System.out.println("$$$$$$$ LOTTO $$$$$$$");
                                        System.out.println("Hi, how many tickets would you like to buy?");
                                        System.out.println(" 1) 1 Ticket");
                                        System.out.println(" 2) 2 Tickets");
                                        System.out.println(" 3) 3 Tickets");
                                        System.out.println(" 4) 4 Tickets");
                                        System.out.println(" 5) 5 Tickets");
                                        System.out.println(" 0) In bankrupt - Nothing\n");
                                        choice = keyboard.nextInt();

                                        if (choice == 0) {
                                        System.out.println("EXITING...");
                                        System.exit(0);
                                      }

                                       generar_tickets(choice);
                                       comparar();
                                       continuar = jugar_denuevo();

                                      }
catch(Exception e){
System.out.println("Ha ocurrido un error");
}
}
}
}


                       public static void main(String[] args) {
                        new Loteria();
                       }
                   } // fin.



He modificado tu método para jugar de nuevo. Para que lee devuelva true o false a la condición del while del thread. Si se elige un caracter que no sea X, devuelve true a la variable de condición y se seguirá jugando. De lo contrario, saldrá del juego.


Prueba el code y me comentas. Un saludo.


Linux User #560388

Geek7

Un poco avanzado para mi, todavia no he entendiddo threads y clases, gracias. ;D

Con respecto a tabulacion, comentarios de codigo esta bien?

Mitgus

Para mí its okay, yo comento mucho más mis códigos (creo que es una manía mía jeje) pero se entiende bastante bien lo que quieres hacer (aunque el 100% del code esté en inglés).

Respecto a tabulación ¿A qué te refieres?

Y por último como recomendación aprende POO, si usamos Java sin POO mejor irnos a C  ;D


Saludos.

PD: Léete el libro 'Cómo programar en Java 7ma edición - Deitel'. Aprenderás muy rápido con este libro.
Linux User #560388

Geek7

O sea, mi problema es que no comento porque no se que exactamente comentar. Si hay una funcion "jugar" y una variable "tickets" se entiende, el tema sera si en un futuro entendere.

Tabulacion seria hacer esto:
Código (java) [Seleccionar]

for (i = 0; i < 10; i++) {
    System.out......
        for() {
        }
    if {
    }       
}


en vez de:
Código (java) [Seleccionar]

for (i = 0; i < 10; i++) {
System.out......
for() {
}
if {
}       
}

Solo cuestion de "vista".

Mitgus

Claro, es importante una buena praxis. La identación es muy importante en un código ya que lo hace más legible. Pero la identación la coloca automáticamente el IDE. ¿Qué IDE usas? ¿O usas un editor de texto común?

No es necesario comentar solo con funciones. Simplemente, cuando haya un pedazo de código que creas conveniente comentar, simplemente coméntalo. Cuando recién empecé, no comentaba mis algoritmos, y a las 3 semanas no sabía ni qué había hecho. Comentar el código es muy importante.

Saludos.
Linux User #560388

Mitgus

#6
En tu código hay un bug. ¿Que pasaría si se ingresara por error una letra o caracter? Terminaría en una expeción tipo InputMismatchException. Para evitar esto, pediríamos el ingreso del número de tickets y determinaríamos si es o no un número.

Código (=java) [Seleccionar]

// Este metodo se encargará de avisarnos si lo ingresado es un número
private static boolean isNumeric(String cadena){
  try {
    Integer.parseInt(cadena);
    return true;
  } catch (NumberFormatException nfe){
    System.out.println("Ingrese solo numeros");
    return false;
   }
}


Y lo llamaríamos al ingresar un valor:

Código (=java) [Seleccionar]

boolean esNumero;
do {

System.out.println("$$$$$$$ LOTTO $$$$$$$");
                                        System.out.println("Hi, how many tickets would you like to buy?");
                                        System.out.println(" [1] 1 Ticket");
                                        System.out.println(" [2] 2 Tickets");
                                        System.out.println(" [3] 3 Tickets");
                                        System.out.println(" [4] 4 Tickets");
                                        System.out.println(" [5] 5 Tickets");
                                        System.out.println(" [0] In bankrupt - Nothing\n");
                                        String choice2 = keyboard.next();
                                        esNumero = isNumeric(choice2);
                                        if (esNumero == true){
                                        choice = Integer.parseInt(choice2);
                                        }

} while(esNumero==false || choice<0 || choice>5);



Como ves, ingresamos choice como String. Luego llamamos al metodo isNumeric para determinar si es un número. Si es un número devuelve true, de lo contrario devuelve false a la variable Boolean esNumero. Si esNumero ahora es true, convertimos choice a entero. Al final, en el while, colocamos que se vuelva a ingresar choice, mientras que No sea un numero, o mientras se ingrese un valor menor a 0 o mayor a 5.

El método isNumeric tiene un catch en caso no se pueda convertir choice a entero (aquí ya sabemos que lo ingresado no es un número), que mostrará el mensaje "Ingrese solo números".

Otro problema que tienes, es que los números que generas pueden repetirse, por lo que si hay 43, 43 en los tickets y tu tienes 43, cuenta como 2 aciertos.

Para arreglar esto, una opción es crear un método que nos avise si el ticket actual ya ha sido sacado:

Código (=java) [Seleccionar]

//determina si el valor de la bola ya ha sido sacado
boolean numeroRepetido(int num, int[] numeros, int count)
{
  // num = bola, numeros = textfields de numeros, count = cuenta
  for(int i=0; i<count; i++)
  {
    // si el numero q se ha sacado ya esta en algun textfield
    if(numeros[i] == num)
    {
      return true; //devuelve true
    }
  }
  return false;
}


Y lo llamamos cada vez que generamos un ticket:

Código (=java) [Seleccionar]
// genera los tickets
void generar_tickets(int eleccion){

System.out.println("\nPrinting tickets...");
System.out.println("----------------------");

tickets = new int[59];
yourTickets = new int[eleccion];


// Generate list of numbers
for(int i = 0; i < tickets.length; i++) {
int numero;
do{
   numero = 1+generateNumbers.nextInt(60);
}while(numeroRepetido(numero,tickets,i));
tickets[i] = numero;
}
}


Código (=java) [Seleccionar]

// genera nuestros numeros
void generar_mistickets(){
// Give him his tickets
System.out.print("\nThese are your tickets: \t");
for (int i = 0; i < yourTickets.length; i++) {
int numero;
do{
numero = 1+generateNumbers.nextInt(60);
}while(numeroRepetido(numero,yourTickets,i));
yourTickets[i] = numero;
if(i != yourTickets.length-1){
System.out.print(yourTickets[i] + ", ");
}
else
System.out.print(yourTickets[i]);
}

} // fin metodo


Como podrás ver, dentro de cada for hacemos un do - while cuando se crea un nuevo ticket. Y la condición es:

Código (=java) [Seleccionar]
while(numeroRepetido(numero,tickets,contador));

Donde numero es el número que se ha generado actualmente, tickets es el arreglo de tickets (yourTickets y tickets), y contador es la cuenta de cuántos numeros se van sacando actualmente.

Código (=java) [Seleccionar]

//determina si el valor del ticket ya ha sido sacado
boolean numeroRepetido(int num, int[] numeros, int count)
{
  // num = ticket, numeros = arreglo de tickets, count = cuenta
  for(int i=0; i<count; i++)
  {
    // si el numero q se ha sacado ya se ha sacado
    if(numeros[i] == num)
    {
      return true; //devuelve true
    }
  }
  return false;
}


Por ejemplo, si recién vamos sacando 3 tickets (i = 2). El for del método quedaría:

Código (=java) [Seleccionar]
for(int i=0; i<count; i++) {
  // 0 < 2 ó 1 < 2 -> Si, entonces compara:
  // si el numero q se ha sacado ya se ha sacado
    if(numeros[i] == num)
    {
      return true; //devuelve true
    }
    else
      return false;
  }



Otra cosita es la cantidad de aciertos. Pueden haber más de 10 aciertos en tu código. Podemos hacer esto:

Código (=java) [Seleccionar]

// Check if something matched
for(int i = 0; i < yourTickets.length; i++) {
for(int j = 0; j < tickets.length; j++) {
if (yourTickets[i] == tickets[j]) {
matched++;
System.out.println(yourTickets[i]+ " = "+tickets[j]);
}
if(matched == 5){
j=60;
i=60;
   }

  } // fin for interno
} // fin for externo


Solamente se coloca un if (matched == 5). Cuando hayan 5 aciertos (que se suponen son lo máximo), i & j se les asigna 60 solo para romper los fors.

Espero hayas entendido este pedazo de código. Un saludo.

PD: Te dejo todo el code para que lo estudies cuando veas POO.

Código (=java) [Seleccionar]

import java.util.Random;
import java.util.Scanner;

public class Loteria {

int choice;
int[] tickets;
int[] yourTickets;
int matched=0;
Scanner keyboard = new Scanner(System.in);
Random generateNumbers = new Random();

public Loteria(){
Jugar instance = new Jugar();
instance.start();
}

// genera los tickets
void generar_tickets(int eleccion){

System.out.println("\nPrinting tickets...");
System.out.println("----------------------");

tickets = new int[59];
yourTickets = new int[eleccion];


// Generate list of numbers
for(int i = 0; i < tickets.length; i++) {
int numero;
do{
   numero = 1+generateNumbers.nextInt(60);
}while(numeroRepetido(numero,tickets,i));
tickets[i] = numero;
}
}

// genera nuestros numeros
void generar_mistickets(){
// Give him his tickets
System.out.print("\nThese are your tickets: \t");
for (int i = 0; i < yourTickets.length; i++) {
int numero;
do{
numero = 1+generateNumbers.nextInt(60);
}while(numeroRepetido(numero,yourTickets,i));
yourTickets[i] = numero;
if(i != yourTickets.length-1){
System.out.print(yourTickets[i] + ", ");
}
else
System.out.print(yourTickets[i]);
}

} // fin metodo


//determina si el valor de la bola ya ha sido sacado
boolean numeroRepetido(int num, int[] numeros, int count)
{
  // num = bola, numeros = textfields de numeros, count = cuenta
  for(int i=0; i<count; i++)
  {
    // si el numero q se ha sacado ya esta en algun textfield
    if(numeros[i] == num)
    {
      return true; //devuelve true
    }
  }
  return false;
}

// compara nuestros numeros con los tickets y aumenta los aciertos
void comparar(){

System.out.println("\n\nLet's if you won something... \n");

// Check if something matched
for(int i = 0; i < yourTickets.length; i++) {
for(int j = 0; j < tickets.length; j++) {
if (yourTickets[i] == tickets[j]) {
matched++;
System.out.println(yourTickets[i]+ " = "+tickets[j]);
}
if(matched == 5){
j=60;
i=60;
   }

  } // fin for interno
} // fin for externo

// Make a pause
try {
Thread.sleep(3000);
} catch(InterruptedException e) {
}
System.out.println("Matchs:\t"+matched);
switch (matched) {
case 1:
System.out.println("You won $100!");
break;

case 2:
System.out.println("You won $200!");
break;

case 3:
System.out.println("You won $500!");
break;

case 4:
System.out.println("You won $800!");
break;

case 5:
System.out.println("GREAT. You've got the pot: $1000!");
break;

case 0:
System.out.println("Have luck next time!");
break;

}

} // fin metodo

// pregunta si se desea jugar denuevo
boolean jugar_denuevo() {

// Ask if he wants to try again
matched = 0;
System.out.println("Would you like to try again? (X to exit) \t");
String tryAgain = keyboard.nextLine();

if(tryAgain.compareToIgnoreCase("x") == 0) {
System.out.println("Thank you. Bye");
System.exit(0);
return false;
}
else {
// Just clear screen
for (int l = 0; l < 5; l++) {
System.out.println();
  }
return true;

  }
}// fin metodo

// este metodo nos indica si lo ingresado es un numero
private static boolean isNumeric(String cadena){
  try {
    Integer.parseInt(cadena);
    return true;
  } catch (NumberFormatException nfe){
    System.out.println("Ingrese solo numeros");
    return false;
   }
}

// clase que empieza el juego mediante thread
private class Jugar extends Thread{

private boolean continuar=true; //condicion del thread


public void run()  { // incia el thread
while(continuar) { // hace la tarea mientras continuar sea true
boolean esNumero;
do {

System.out.println("$$$$$$$ LOTTO $$$$$$$");
                                        System.out.println("Hi, how many tickets would you like to buy?");
                                        System.out.println(" [1] 1 Ticket");
                                        System.out.println(" [2] 2 Tickets");
                                        System.out.println(" [3] 3 Tickets");
                                        System.out.println(" [4] 4 Tickets");
                                        System.out.println(" [5] 5 Tickets");
                                        System.out.println(" [0] In bankrupt - Nothing\n");
                                        String choice2 = keyboard.nextLine();
                                        esNumero = isNumeric(choice2);
                                        if (esNumero == true){
                                        choice = Integer.parseInt(choice2);
                                        }

} while(esNumero==false || choice<0 || choice>5);

                                        if (choice == 0) {
                                        System.out.println("EXITING...");
                                        System.exit(0);
                                      }

                                       generar_tickets(choice);
                                       generar_mistickets();
                                       comparar();
                                       continuar = jugar_denuevo();

                                     
}
}
}


                       public static void main(String[] args) {
                        new Loteria();
                       }
                   } // fin.
Linux User #560388