Ir al contenido



Foto

Bingo Electronico


  • Por favor identifícate para responder
14 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.005 mensajes
  • LocationSanto Domingo

Escrito 21 noviembre 2011 - 08:28

Hola a todos

Me gustaria hacer una especie de bingo electronico. La idea es poder crear los cartones y que segun se vayan cantando los numeros, uno pueda verificar cuando alguien diga bingo, si realmente ha ganado.

gracias por adelantado por las ideas que puedan darme


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.983 mensajes
  • LocationArgentina

Escrito 21 noviembre 2011 - 09:16

Hola Luciano,


¿Tienes algo ya más o menos estudiado o visto? ¿Por electrónico a que te refieres? ¿internet? ¿Alguna  aplicación en red en donde cada máquina cliente tiene un cartón y los usuarios van marcando sus "cartones"?


Si nos puedes bajar algunas ideas más a tierra quizá podamos apreciar por donde van los tiros. Que al nivel de detalle que nos comentas lo veo muy abstracto.


Técnicamente no hay que esperar a que alguien diga ¡bingo! para saber y comprobar si efectivamente a ganado. Tranquilamente se puede saber (e ir evaluando) con cada tirada o salida de número si alguien va completando sus cartones... Por algo en realidad se dispone de un registro de los cartones y los números que contienen.


Saludos,


  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 21 noviembre 2011 - 10:18

Técnicamente no hay que esperar a que alguien diga ¡bingo! para saber y comprobar si efectivamente a ganado. Tranquilamente se puede saber (e ir evaluando) con cada tirada o salida de número si alguien va completando sus cartones... Por algo en realidad se dispone de un registro de los cartones y los números que contienen.


Saludos,



Eso también depende del caso, no es que lo juegue pero si conozco de varios tipos de jugada, sea formando lineas o grupos... pero bueno, eso va en la complejidad o necesidad de dicho juego, es cosa de tener no solo registrado los números de cada cartón sino también de sus posiciones en el mismo.


Saludos!
  • 0

#4 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.005 mensajes
  • LocationSanto Domingo

Escrito 21 noviembre 2011 - 05:14

Delphius  y Felipe Gracias por responder.

Delphius tienes razon en que no hay que esperar que alguien diga bingo para saber si en algun carton se ha hecho bingo, pero no necesariamente todos los cartones deben estar usandose. Ademas cada quien debe estar pendiente de sus cartones y si se le pasa el momento de decir bingo, entonces pierde. Por estas razones es que hay que esperar que alguien diga bingo y entonces confirmar que en ese carton se ha hecho.

Felipe tienes razon en que hay diferentes formas de hacer bingo y esa es otra parte de lo que quiero hacer.  La idea es poder establecer cual es la forma de ganar y con ello poder controlar quien ha ganado.
  • 0

#5 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.005 mensajes
  • LocationSanto Domingo

Escrito 21 noviembre 2011 - 07:08

Delphius esta es una de las ideas que encontre en la red:

Crear una tabla de datos con arreglos de n x 5; porque? 5 filas  B-I-N-G-O asi btines la letra; rellenar las columnas de cada fila con el  max de numeros de numeros que necesite o requiera tu juego; normalmente  75; 
 
segundo la creacion de los cartones es de 5 x 5 (arrays) donde identificas los numeros con letras; 
 
Para la salida de lso numeros debes usar un nmero aleatorio de N *  75  + 1 para asegurarte que siempre va a ser mayor que cero; y otro para  la letra; recuerda debes eliminarlo del primer arreglo cada vez que  salga un numero nuevo; y ver que ese numero aun no ha salido antesz de  cantarlo. 


Pero me gustaria saber si alguien ha hecho algo como esto y pueda darme algunas ideas

  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.983 mensajes
  • LocationArgentina

Escrito 21 noviembre 2011 - 09:15

No se si habrá formas de jugarlo o no... que yo sepa sólo hay una: completas línea o cartón.
Al menos el bingo que yo conozco el cartón consta de 15 números distribuídos en 3 filas. Cada fila posee un máximo de 9 (creo recordar) espacios por lo a lo sumo en 5 están los números y los 4 restantes libres (nulos). Es decir una matriz de 3 x 9:





delphi
  1. +--+--+--+--+--+--+--+--+--+
  2. |  |  |  |  |  |  |  |  |  |
  3. +--+--+--+--+--+--+--+--+--+
  4. |  |  |  |  |  |  |  |  |  |
  5. +--+--+--+--+--+--+--+--+--+
  6. |  |  |  |  |  |  |  |  |  |
  7. +--+--+--+--+--+--+--+--+--+




En la columna 1 van ubicados los números en el rango [0..9], en la 2da [10..19], 3ra [20,29] y así hasta llegar a la 9na [90,99]


Hay una variante cuyo bolillero consta de 75 y/o 70 números.


Se forma línea en cuanto se llenan los 5 números de alguna fila. Naturalmente, hay bingo cuando el cartón está lleno y el apostador grita.


Luk se bien que debe haber un "grito" para dar por válido el bingo. Solamente hice notar que no hay que esperar a que los usuarios vayan informando y chequeando... Por tanto en términos abstractos los apostadores y dueños de los cartones son meros expeculadores u observadores de los números que van saliendo. El control pasa por el sistema y no depende de los avisos... solamente ha de estar a la expectativa de un "Línea!" y/o "Bingo"


Las dudas y a lo que más apuntaba yo era a los aspectos técnicos-operativos que pueden (y lo harán) afectar al diseño del sistema.
Por el momento la forma en cómo se mantenga la presentación del cartón es meramente secundaria... lo importante es definir que tanto de lo que dices "electrónico" estás contemplando.
¿Cómo, o en qué estará montado el sistema? ¿web? ¿LAN?


Tengo algunas ideas para presentarte, en cuanto a algunos aspectos de la lógica y de diseño que luego tu deberías ampliar para encontrarle el contexto técnico-operativo pero demoraré tiempo en exponerlas. Si no te molesta esperar a mañana por la tarde (o noche) pueda sacar tiempo para comentarte más tranquilo.


Saludos,
  • 0

#7 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.005 mensajes
  • LocationSanto Domingo

Escrito 21 noviembre 2011 - 10:37

Delphius el bingo del que yo hablo es diferente. Estos son algunos de los detalles del bingo que mi hermana compró y con el que juega en su casa con sus amigos:

juego de bingo

1.- 48 cartones
2.- 5 lineas horizontales
3.- 5 lineas verticales
4.- espacio libre en el centro
5.- cada carton tiene 24 numeros
6.- el numero menor es 1 y el mayor es 75
7.- en cada carton falta un numero de la fila de centro (N)
8.- cada grupo de tres cartones no puede repetir los mismos numeros
9.- las lineas estan representadas por las letras de la palabra BINGO.
10.- la linea B ocupa los numeros del 1-15
11.- la linea I ocupa los numeros del 16-30
12.- la linea N ocupa los numeros del 31-45
13.- la linea G ocupa los numeros del 46-60
14.- la linea O ocupa los numeros del 61-75

15.- cada linea cubre un rango de 15 numeros


he creado en excell los primeros tres cartones para que tengas una idea:


[img height=269 width=800]http://img685.imageshack.us/img685/9784/sinttuloock.jpg[/img]

  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.005 mensajes
  • LocationSanto Domingo

Escrito 21 noviembre 2011 - 11:02

Lo de electronico es una forma de decir que no solo es con los cartones tradicionales, sino  que hay una parte o la totalidad electronica, pero a la gente le gusta anotar sus numeros.

Lo que quiero hacer es registrar estos 48 cartones, con las diferentes posiciones y lineas (B-I-N-G-O) (1-2-3-4-5). He pensado en crear algunas tablas que por ejemplo tengan al carton 1 con las posiciones b1,b2,b3,b4,b5,I1,I2,I3 y asi sucesivamente y en cada posicion de esas entrar el numero que corresponde.

La idea es que cada vez que se diga un numero, el sistema lo ponga en una pantalla junto con los demas numeros que han salido y que cuando alguien diga bingo, se verifique si realmente es asi, segun la forma de juego que se este jugando.

Una de las formas mas normales de jugar es  con 4 numeros en linea sin saltar ningun cuadro y  en caso de que este el libre este cuenta como un numero, Ejemplo: en el primero carton de la imagen anterior, se podria ganar con 3-16-45-59  o con 16-45-59-75 o con 45-40-libre-31 o con cuatro o tres esquinas en un solo carton, Hay muchas formas y tipos de juegos que podrian implementarse. La idea en principio es poder establecer la forma de ganar, comenzando por lo tradicional y asi poder confirmar que realmente alguien ha ganado.  Espero que tengan una idea mas clara del asunto y puedan darme algunos tips


  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.983 mensajes
  • LocationArgentina

Escrito 22 noviembre 2011 - 01:00

Hola Luciano,
Conozco esa variante del Bingo, por ello he dicho:

Hay una variante cuyo bolillero consta de 75 y/o 70 números.



En escencia es lo mismo, básicamente en la variante de 75 números y el tablero de 5x5 las formas de conseguir línea son verticales, horizontales y/o diagonales. La casilla del centro que es libro actúa como de comodín lo que permite llegar a formar una línea horizontal, vertical o diagonal con 4 en vez de 5.
Naturalmente hay bingo cuando el cartón está lleno (exceptuando el LIBRE, por supuesto).


La diferencia del cartón 3x9 es que existen 15 números, 5 en cada línea (que es posible únicamente en horizontal). Por tanto en vez de existir un LIBRE existen 12, 4 en cada línea.


Mis dudas iban justo por estos tipos de cosas, si había alguna pantalla en donde se avisan los números... si cada jugador disponía de alguna interfaz o aparato que le permita avisar de línea o bingo. Esto puede afectar al diseño del sistema y en cómo ha de llevarse a cabo los avisos.


Como te comenté, tengo algunas cosas en mente; que de alguna forma tu puedes evaluar y ver el modo de cómo llevarlo a tu estructura.


Disculpa si lo que diga resulta ser bastante técnico; en primer lugar aviso que tiene mucho de OO.


Vislumbro 4 clases: TCarton, TBolillero, TJugador, TBanca.
Explico en forma simple y luego daré un paneo más profundo.
TBanca es la clase administradora, se encarga de crear los cartones (clase TCarton) y asociarlos a los jugadores (clase TJugador). Esta clase se apoya o delega parte del trabajo en la clase TBolillero.
TBolillero se encarga de generar los números del bingo por azar (*) y lleva registro de los números que van saliendo.
De este modo tenemos por un lado la administración de los cartones y por el otro de los números arrojados.
TCarton es básicamente la clase que abstrae al cartón. Su diseño, por dentro, no nos interesa por el momento. Ya se verá como han de guardarse la matriz.
Y por último la clase TJugador que abstrae al jugador. No hace falta dar demasiado detalles de ésta... prácticamente se describe por si misma.


Centrémonos en TBanca y TBolillero.
TBanca debe ofrecer los métodos y funciones necesarias para comprobar a medida que se van arrojando los números si se ha producido línea y/o bingo. Ya podemos intuir dos métodos de interés entonces:




delphi
  1. procedure TBanca.EvaluarCartones(Nro: integer);
  2. function TBolillero.CantarNumero: integer;




Básicamente EvaluarCartones() recibe el número cantado por el bolillero y examina en la lista de cartones si está para marcarlo.
Entonces ya sabemos que, se necesita de una lista:




delphi
  1. TBanca = class
  2. private
  3.   FListaCartones: TObjectList;
  4. ...




Cada vez que se cree un tablero, irá a parar en esta lista:




delphi
  1. Carton := TCarton.Create;
  2. FListaCartones.Add(Carton);




Ahora si es necesario poner un poco de visión en TCarton. Para simplicar las cosas éste dispone de un método Marcar(). Como bien sabemos un número estará marcado o sin marcar por tanto además de los números es necesario contar con un arreglo o matriz booleana que haga la correspondencia al número.


Entonces:




delphi
  1. procedure TCarton.Marcar(Nro: integer);




El método EvaluarCartones() recorrerá la lista pidiendo que cada cartón marque:




delphi
  1. for j := 0 to FListaCartones.Count - 1 do
  2. begin
  3.   Carton := TCarton(FListaCartones.Items[j]);
  4.   Carton.Marcar(Nro);
  5. end;




La mejor clase candidata a saber si hay alguna línea o bingo completo es la propia TCarton. Entonces es aquí en donde tendrá un método (privado convenientemente) que haga esto. Marcar() los llamará:




delphi
  1. procedure TCarton.Marcar(Nro: integer);
  2. begin
  3.   existe := BuscarEnCarton(Nro);
  4.   if existe <> -1
  5.     then begin
  6.                 Tablero[existe] := true;
  7.                 HayLinea := ComprobarLinea;
  8.                 HayBINGO := ComprobarBINGO;
  9.             end;
  10. end;



Ahora ya habiendo abstraído en los métodos Comprobar() la lógica del problema sólo queda determinar si efectivamente este cartón es un (potencial) ganador. De haber un resultado positivo para HayLinea o HayBingo la clase TBingo le comunica a TBanca que lo agregue a una lista de ganadores tentativos (naturalmente si ya estaba en lista no hay que volver a agregarlo).


Es decir:


delphi
  1. if HayLinea OR HayBINGO
  2.   then FBanca.AgregarGanadorTentativo(self);




De esto podemos inferir que TCarton tiene un atributo privado que referencia a una instancia de la clase TBanca. ¿Cuándo se hace esta correspondencia? Cuando se crea el cartón:




delphi
  1. Carton := TCarton.Create(self); // Self es de la clase TBanca. Ya hemos dicho que esta los crea




Bien... Ya tenemos en una lista los posibles ganadores tentativos. Sólo resta que la clase TBanca recorra a ésta y explore si efectivamente ante un aviso de algún jugador se ha conseguido tal condición.




delphi
  1. function TBanca.ComprobarGanador(Carton: TCarton; var Linea: integer): boolean;
  2. var existe, linea: integer; Carton: TCarton;
  3. begin
  4.   linea := -1; // no se trata de un resultado favorable;
  5.   existe := FListaCartonesTentativos.IndexOf(Carton);
  6.   if existe <> -1
  7.     then begin
  8.                 Carton := TCarton(FListaCartones.Items);
  9.                 result := Carton.HayBingo OR Carton.HayLinea(linea);
  10.             end
  11.     else result := false;
  12. end;



Entonces tenemos dos listas de cartones: una en FListaCartones, y otra en FCartonesTentativos. ¿Porqué? Fácil: para no tener que estar recorriendo todos los cartones... a medida que van saliendo los números podemos ir prediciendo los cartones que se van llenando. En algún momento al menos uno de éstos llegará a una línea y/o bingo.

HayLinea es una función que regresa como parámetro de referencia (var) la línea en la que se detecta la línea (de haberlo). -1 indica que no hay, y 0 que se trata de un BINGO; en cualquier otro caso indica la linea. Los métodos Comprobar() además de llevar a cabo el resultado, establecen una propiedad booleana cuando detectan el caso:




delphi
  1. property HayLinea: boolean read FHayLinea;
  2. property HayBINGO: boolean read FHayBINGO;




De este modo una vez dadas las condiciones (resultado positivo) quedan "activas". Como se requiere devolver la línea ComprobarLinea() además debe guardarla en un atributo. Luego HayLinea() sólo ha de devolver el valor de FHayLinea y FLinea.


Con esto queda más centrada la lógica. Lo que resta son los detalles menores. Cuando un jugador adquiere un cartón se forman asignaciones, es responsabilidad de TBanca realizar este trabajo y vincular un Carton con un Jugador:




delphi
  1. Jugador.Carton := Carton;




Y además, es necesario vincular al Jugador con la Banca:




delphi
  1. Jugador.Banca := Banca;




Esto gracias a propiedades Carton y Banca, que se traducirá a una asignación a los atributos privados FCarton y FBanca.
Esta asignación del jugador a la banca permite que el jugador le envíe avisos a la banca. Ahora cuando TBanca pida un número al bolillero (o quizá más apropiado sería en el ComprobarCartones) les avisa a las clases TJugador del número. Una buena forma de encararlo es gracias al patrón Observador. Puedes ver una muestra de este patrón en mi último hilo abierto. Tu esquema es más simple, no requiere de interfaces. La idea central es algo como esto:




delphi
  1. TEventoCantarNumero = procedure(NroCantado: integer) of object;




TBanca recorre los jugadores, y dispara el evento que esta última debe implementar:




delphi
  1. for j := 0 to FListaJugadores.Count - 1 do
  2. begin
  3.   Jugador := TJugador(FListaJugadores.Items[j]);
  4.   Jugador.EventoCantarNumero(nro);
  5. end;




En concreto, la respuesta al evento se traduce en un hipotético ComprobarCarton(). Este método habilitará algún botón o lo que fuese... y en términos abstractos se traducirá y resumirá en que le pida a TBanca si efectivamente su cartón es ganador.

TBanca asume el rol de Sujeto, y TJugador de Observador. TBanca entonces tiene la lista de los jugadores y puede recorrer disparando el evento.




delphi
  1. TJugador.EventoCantarNumero(NroCantado: integer);
  2. var linea: integer);
  3. begin
  4.   // algo aquí
  5.   FBanca.ComprobarGanador(FCarton; linea);
  6. end;


Como puede apreciarse, EventoCantarNumero se corresponde justo a la declaración del evento anterior.

Y Listo. Observa que no he tocado en ningún momento cómo está conformado por dentro el cartón. Simplemente lo abstraigo en una propiedad vectorial (o un vector simple). Este es un detalle menor y no hace a la lógica de luego si uno logra ofrecer una interfaz independiente de alguna estructura.


Creo que con todo esto te haces una muy buena idea. Si hace falta (re)explicar algo me avisas.


Saludos,
  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.135 mensajes

Escrito 22 noviembre 2011 - 02:29

Muy buen trabajo Delphius,  Luciano  ¡¡¡ a organizar el asunto !!!!.

Saludos.
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.983 mensajes
  • LocationArgentina

Escrito 23 noviembre 2011 - 12:10

Espero Luciano que se me haya entendido, comenta cualquier cosa. A mi esto del silencio me preocupa... no se si es que se me entendió bien y estás muy concentrado picando el código o si te ha resultado muy chino y estás mudo del silencio con un diccionario en la mano.
Quiero pensar que es la primera opción.


Saludos,
  • 0

#12 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 23 noviembre 2011 - 01:18

Lo que me gusta de la explicación de Delphius es el concepto de la POO (y)
En otro caso solo hubieramos comenzado a "tirar" código.


Saludos!
  • 0

#13 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.005 mensajes
  • LocationSanto Domingo

Escrito 25 noviembre 2011 - 07:39

Gracias Delphius por toda tu explicacion, perdona que no te haya respondido antes, pero como estoy en Estados Unidos y resolviendo unos asuntos de mi hija menor, he estado un poco afanado. Voy a analizar lo que me explicas y lo que no entienda te lo preguntare.
  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.983 mensajes
  • LocationArgentina

Escrito 25 noviembre 2011 - 09:05

Gracias Delphius por toda tu explicacion, perdona que no te haya respondido antes, pero como estoy en Estados Unidos y resolviendo unos asuntos de mi hija menor, he estado un poco afanado. Voy a analizar lo que me explicas y lo que no entienda te lo preguntare.

No hay de que amigo.
No tengo prisas, y menos mal porque yo últimamente no logro sacar tiempo para estar frente a la PC. Como será que cuanto mucho logro estar 4 hs, descontando interrumpciones, frente al monitor.  :o

Tu pega el grito si no se entiende nada; si te surgen dudas, posiblemente tengan o estén relacionadas con el aspecto del patrón Observador. Quizá esa sea la parte que más podría desconcertar.

Lo que me gusta de la explicación de Delphius es el concepto de la POO (y)
En otro caso solo hubieramos comenzado a "tirar" código.


Saludos!

Me alegro de que te haya gustado.
Yo practicamente no me siento a escribir código sin siquiera analizarlo primero y de haber realizado algunos diagramas UML en papel. Tanto me acostumbré a OO, patrones e UML que prácticamente no pienso de forma destructurada.

Saludos,
  • 0

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.983 mensajes
  • LocationArgentina

Escrito 25 noviembre 2011 - 09:17

He editado el post para añadir una corrección menor. Era posible que se interpretara erróneamente, había hablado de una lista de cartones tentativos pero el código expuesto hacía referencia a FListaCartones; la lista original.

Saludos,
  • 0