/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package bingo;
import java.util.*;
//import java.lang.*;
/**
*
* @author matricula
*/
public class Bingo {
static Random rand = new Random();
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
int ctDeCartones = 0, segundos;
Dealer dler;
Scanner sc = new Scanner(System.in);
System.out.println("MAIN:Introduzca la cantidad de jugadores:");
ctDeCartones = sc.nextInt();
System.out.println("MAIN:Introduzca la cantidad máxima de segundos que esperará cada jugador:");
segundos = sc.nextInt();
// Creando un Dealer
dler = new SubDealer(ctDeCartones);
dler.start();
// Creando una variable para almacenar las referencias a los cartones
Carton car;
// Creando tantos cartones como indicó el usuario
for (int i = 0; i < ctDeCartones; i++) {
// Creando cartones. Parametros: nombre del jugador, dealer, segundos máximos que esperara para pedir bolos
car = new Carton("CartonDelJugador" + i, dler, segundos);
car.start();
}
System.out.println("MAIN:>>>Terminado");
}
}
class Dealer extends Thread {
int ctDeCartones, boloGenerado, solicitudesDelBolo;
boolean hayGanador = false;
boolean[] bolosGenerados = new boolean[75];
Dealer(int ctDeCartones) {
this.ctDeCartones = ctDeCartones;
}
public void run() {
while (!hayGanador) {
do {
boloGenerado = Bingo.rand.nextInt(75) + 1;
} while ((bolosGenerados[boloGenerado - 1]) && !hayGanador);
// } while (bolosGenerados[boloGenerado - 1]);
bolosGenerados[boloGenerado - 1] = true;
try {
// while ((solicitudesDelBolo < ctDeCartones) && !hayGanador) {
while ((solicitudesDelBolo < ctDeCartones) && !hayGanador) {
Thread.sleep(500);
}
solicitudesDelBolo = 0;
} catch (Exception e) {
System.out.println("DEALER:Ha ocurrido un error");
}
}
System.out.println("DEALER:>>> Juego Terminado!");
}
int obtenerBoloGenerado(String carton, int ultimoBoloRecibido) {
System.out.println("DEALER:El carton " + carton + " solicito un bolo");
if (ultimoBoloRecibido == boloGenerado) {
// -1 indica que no se ha generado un nuevo bolo
System.out.println("DEALER:No hay un nuevo bolo para entregar al carton " + carton);
return -1;
} else {
System.out.println("DEALER:Se entregó el bolo " + boloGenerado + " al carton " + carton);
solicitudesDelBolo++;
return boloGenerado;
}
}
void cantarBingo(String carton) {
System.out.println("DEALER:El carton " + carton + " canto BINGO!!!");
hayGanador = true;
}
// Funcion que retorna si hay un ganador
boolean hayUnGanador() {
return hayGanador;
}
}
class SubDealer extends Dealer {
SubDealer() {
super(1);
}
SubDealer(int a) {
super(a);
}
}
class Carton extends Thread {
Dealer dealer;
String nombreDelCarton;
int carton[][] = new int[5][5];
int ultimoBoloObtenido, segundos;
Carton(String nombre, Dealer dlr, int segundos) {
nombreDelCarton = nombre;
dealer = dlr;
this.segundos = segundos;
// Generando carton
int min, max, numero = 0;
boolean numeroExistente;
// Ciclo para generar los numeros de la primera columna
for (int c = 0; c < 5; c++) {
min = (c * 15) + 1;
max = min + 14;
for (int f = 0; f < 5; f++) {
numeroExistente = true;
while (numeroExistente) {
numero = Bingo.rand.nextInt((max - min) + 1) + min;
numeroExistente = false;
for (int c1 = 0; c1 < 5; c1++) {
for (int f1 = 0; f1 < 5; f1++) {
if (numero == carton[f1][c1]) {
numeroExistente = true;
}
}
}
}
carton[f][c] = numero;
}
}
System.out.println(Arrays.deepToString(carton));
}
public void run() {
int bolo;
while (!dealer.hayUnGanador()) {
// Esperando "segundos" segundos antes de pedir el bolo
try {
Thread.sleep((Bingo.rand.nextInt(segundos) + 1) * 1000);
} catch (Exception e) {
System.out.println("CARTON " + nombreDelCarton + ":Ha ocurrido un error!");
}
if (!dealer.hayUnGanador()) {
bolo = dealer.obtenerBoloGenerado(nombreDelCarton, ultimoBoloObtenido);
if (bolo == -1) {
System.out.println("CARTON " + nombreDelCarton + ":Aun no se ha generado un nuevo bolo. Sigo esperando.");
} else {
synchronized (System.out) {
ultimoBoloObtenido = bolo;
System.out.println("CARTON " + nombreDelCarton + ":El bolo obtenido fue: " + bolo);
if (validarBolo(bolo)) {
System.out.println("CARTON " + nombreDelCarton + ":Bolo encontrado en carton");
imprimirCarton();
if (validarCarton()) {
dealer.cantarBingo(nombreDelCarton);
}
} else {
System.out.println("CARTON " + nombreDelCarton + ":Bolo no encontrado en carton");
}
}
}
}
}
System.out.println("CARTON " + nombreDelCarton + ":>>> Saliendo del código del carton");
}
boolean validarBolo(int bolo) {
boolean boloEncontrado = false;
buscandoBolo:
{
for (int f = 0; f < 5; f++) {
for (int c = 0; c < 5; c++) {
if (carton[f][c] == bolo) {
carton[f][c] = carton[f][c] * -1;
boloEncontrado = true;
break buscandoBolo;
}
}
}
}
return boloEncontrado;
}
boolean validarCarton() {
boolean cartonGanador = false;
int contador_f = 0, contador_c = 0, contador_dp = 0, contador_ds = 0;
validando:
{
for (int c1 = 0; c1 < 5; c1++) {
contador_f = contador_c = 0;
for (int c2 = 0; c2 < 5; c2++) {
if (carton[c1][c2] < 0) {
contador_f++;
}
if (carton[c2][c1] < 0) {
contador_c++;
}
if (contador_f == 5 || contador_c == 5) {
break validando;
}
}
if (carton[c1][c1] < 0) {
contador_dp++;
}
if (carton[c1][4 - c1] < 0) {
contador_ds++;
}
}
}
if (contador_f == 5) {
System.out.println("CARTON " + nombreDelCarton + ":Ganador por fila");
cartonGanador = true;
}
if (contador_c == 5) {
System.out.println("CARTON " + nombreDelCarton + ":Ganador por columna");
cartonGanador = true;
}
if (contador_dp == 5) {
System.out.println("CARTON " + nombreDelCarton + ":Ganador por diagonal principal");
cartonGanador = true;
}
if (contador_ds == 5) {
System.out.println("CARTON " + nombreDelCarton + ":Ganador por diagonal secundaria");
cartonGanador = true;
}
/*
// Vaidando si el carton es ganador en alguna de las filas
for (int f = 0; f < 5; f++) {
for (int c = 0; c < 5; c++) {
if (carton[f][c] < 0) {
contador++;
}
}
}
if (contador == 5) {
cartonGanador = true;
}
// Validando si el carton es ganador en alguna de las columnas
if (!cartonGanador) {
contador = 0;
for (int c = 0; c < 5; c++) {
for (int f = 0; f < 5; f++) {
if (carton[f][c] < 0) {
contador++;
}
}
}
if (contador == 5) {
cartonGanador = true;
}
}
*/
return cartonGanador;
}
void imprimirCarton() {
System.out.println("\nCARTON " + nombreDelCarton + ":--------------------------");
for (int f = 0; f < 5; f++) {
for (int c = 0; c < 5; c++) {
if (c == 0) {
System.out.print("CARTON " + nombreDelCarton + ":|");
}
if (c == 2 && f == 2) {
System.out.print("FREE");
} else if (carton[f][c] > 0) {
System.out.printf(" %2d ", carton[f][c]);
} else {
System.out.printf("<%2d>", carton[f][c] * -1);
}
if (c == 4) {
System.out.println("|");
System.out.println("CARTON " + nombreDelCarton + ":--------------------------");
} else {
System.out.print('|');
}
}
}
System.out.print('\n');
}
}
1 Response
Write a comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.