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.
// Este metodo se encargará de avisarnos si lo ingresado es un número
private static boolean isNumeric
(String cadena
){ try {
return true;
System.
out.
println("Ingrese solo numeros"); return false;
}
}
Y lo llamaríamos al ingresar un valor:
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:
//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:
// 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
Como podrás ver, dentro de cada for hacemos un do - while cuando se crea un nuevo ticket. Y la condición es:
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.
//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:
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:
// 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.
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);
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 {
}
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"); return false;
}
else {
// Just clear screen
for (int l = 0; l < 5; l++) {
}
return true;
}
}// fin metodo
// este metodo nos indica si lo ingresado es un numero
private static boolean isNumeric
(String cadena
){ try {
return true;
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..."); }
generar_tickets(choice);
generar_mistickets();
comparar();
continuar = jugar_denuevo();
}
}
}
public static void main
(String[] args
) { new Loteria();
}
} // fin.