Page 1 of 7

JUEGO BINGO

Posted: Thu Jan 11, 2024 6:19 pm
by LOUIS
Buenas tardes a todos.

Hice un programa para jugar Bingo en casa, el código está bien, sacando números aleatorios del 1 al 75, pero tengo 2 inconvenientes :oops:

Primero que no puedo pausar el juego si alguien grita !Bingo! ... Debo detener (pausar) el juego, para revisar el cartón del jugador vs los números que han salido en la pantalla ... (creo que todos hemos jugado esto alguna vez) :mrgreen:

Si el Bingo es correcto, termino el juego, pero si no lo es, debo continuarlo hasta que haya un ganador.

El segundo problemilla es que debe capturar la variable del número (M4) y hacer que la computadora lo lea.
En VFP sí lo hice con Createobject("SAPI.SPVoice"), pero aquí no tengo la idea de cómo hacerlo

En fin, si por lo menos pudiera pausarlo y luego hacer que continúe o termine el juego, estaré contento ... ya lo otro, tendré que afinar la garganta para cantar los números :lol:

Os dejo adjunto el ejecutable y el código también para que lo revisen y me den una manito, luego esto quedará aquí para distracción de todos nosotros.

Gracias de antemano.

Re: JUEGO BINGO

Posted: Fri Jan 12, 2024 4:28 pm
by danielmaximiliano
hola es asi

Code: Select all

#include <hmg.ch>

Function Main
Public oVoz := CreateObject("SAPI.SpVoice")

        Load Window Main
        Main.Center
        Main.Activate

Return

Function Hola( cVoz )
oVoz:Speak( cVoz )
return

Re: JUEGO BINGO

Posted: Fri Jan 12, 2024 11:28 pm
by LOUIS
Muchas gracias Daniel

Ya le adapté tu colaboración que agradezco mucho, ya la compu canta los números que van saliendo :mrgreen:

Pero ahora sólo falta poder pausar el juego si yo toco una tecla (cuando van saliendo los números aleatoriamente), porque como dije antes, si alguien dice BINGO ! a los 58 números jugados, yo debo pausar el juego para proceder a la revisión y luego terminar el Bingo si fue correcto o continuar si no hubo Bingo.

Sólo eso nos faltaría y quedaría cool el programita para todos nosotros.

Ojalá alguien se anime a colaborar y nos eche una manito (ver líneas 67 al 72)

Nuevamente gracias Daniel !

Code: Select all

*******************************************
* PROGRAMADO EN HMG 3.0.46 EL 09/01/2024  *
* PROGRAMADO PARA BINGO DE 75 BOLAS       *
* PARA JUGAR ENTRE AMIGOS O FAMILIA       *
*******************************************

#include "HMG.CH"

* SCREEN 1360x768

FUNCTION MAIN()

PUBLIC n,L,C,M4
Public oVoz := CreateObject("SAPI.SpVoice")

DEFINE WINDOW PRINCE AT 0,0 WIDTH 0 HEIGHT 0 BACKCOLOR {0,125,250} NOCAPTION MAIN
        @ 000,000 LABEL L0 VALUE "JUGANDO BINGO EN CASA" WIDTH 1200 HEIGHT 99 FONT "ALGERIAN" SIZE 72 BOLD UNDER ITALIC FONTCOLOR WHITE TRANSP

	@ 725,1180 BUTTON BUTTON_1 CAPTION "S T A R T" WIDTH 75 HEIGHT 30 ONCLICK BUSCANUME()
	@ 725,1260 BUTTON BUTTON_2 CAPTION "E X I T"   WIDTH 75 HEIGHT 30 ONCLICK SALIR()

	ON KEY ESCAPE ACTION SALIR()
END WINDOW

PRINCE.MAXIMIZE
PRINCE.ACTIVATE

RETURN


*-----------------
FUNCTION BUSCANUME

LOCAL NNUM
MSGINFO ("ATENCION POR FAVOR, EMPEZARA EL JUEGO !")
aleatorio:=ARRAY(75)
FOR n=1 TO 75
   PASE:=.T.
   DO WHILE PASE
      NNUM:=HB_RANDOMINT(1,75)
      IF VALTYPE(aleatorio[NNUM])="U"
         aleatorio[NNUM]:=NNUM
         PASE:=.F.
      ENDIF
   ENDDO

   CVAR1:="NUME"+ALLTRIM(STR(n))		&& ETIQUETA QUE VA AUMENTANDO EN 1
   CVAR2:=ALLTRIM(STR(NNUM))			&& NUMERO PURO ALEATORIO
   CVAR3:="LAST"+ALLTRIM(STR(n))		&& ETIQUETA PARA ULTIMO NUMERO JUGADO

   M4=NNUM
   CANTA()
   PINTANUME()
   @ L,C LABEL &CVAR1 PARENT PRINCE VALUE CVAR2 WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}

   L1:="L"+ ALLTRIM(STR(n))		&& VARIABLE PARA LABELS
   INKEY(0.5)				&& TIEMPO ENTRE UN NUMERO Y OTRO (SE LO PUEDE AMPLIAR)
   IF n=75
      n=74
      @ 5,1200 LABEL &L1 PARENT PRINCE VALUE TRAN(n+1,'99') WIDTH 111 HEIGHT 99 FONT "ALGERIAN" SIZE 72 BOLD FONTCOLOR GREEN BACKCOLOR {0,125,250}
      EXIT
    ELSE
      @ 5,1200 LABEL &L1 PARENT PRINCE VALUE TRAN(n+1,'99') WIDTH 111 HEIGHT 99 FONT "ALGERIAN" SIZE 72 BOLD FONTCOLOR GREEN BACKCOLOR {0,125,250}
   ENDIF
   @ 700,0 LABEL &CVAR3 PARENT PRINCE VALUE "ULTIMO NUMERO QUE SALIO --->"+CVAR2 WIDTH 1255 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLUE BACKCOLOR {0,125,250}

***ESTO ES SOLO PARA PAUSAR EL JUEGO, PERO DEBE SER DE OTRA MANERA
   IF n=10 .OR. n=30 .OR. n=55		&& EN VEZ PREGUNTAR POR n DEBE SER AL PULSAR UNA TECLA CUALQUIERA QUE HAGA UNA PAUSA
      MSGINFO("BUSCAR COMO PAUSAR EL PROGRAMA" +CHR(13)+CHR(13)+ " ... PULSANDO YO UNA TECLA !!!"+CHR(13))		&& BUSCAR OTRA FORMA DE PAUSAR EL PROGRAMA MANUALMENTE
      EXIT		&& AL PAUSAR EL PROGRAMA NO DEBE SALIR, EL JUEGO DEBE CONTINUAR O PREGUNTAR SI CONTINÚA
   ENDIF
***ESTO ES SOLO PARA PAUSAR, PERO DEBE SER DE OTRA MANERA

NEXT

RETU


*-----------------
FUNCTION PINTANUME

IF M4<6
   C=0
ENDIF
IF M4>5 .AND. M4<11
   C=90
ENDIF
IF M4>10 .AND. M4<16
   C=180
ENDIF
IF M4>15 .AND. M4<21
   C=270
ENDIF
IF M4>20 .AND. M4<26
   C=360
ENDIF
IF M4>25 .AND. M4<31
   C=450
ENDIF
IF M4>30 .AND. M4<36
   C=540
ENDIF
IF M4>35 .AND. M4<41
   C=630
ENDIF
IF M4>40 .AND. M4<46
   C=720
ENDIF
IF M4>45 .AND. M4<51
   C=810
ENDIF
IF M4>50 .AND. M4<56
   C=900
ENDIF
IF M4>55 .AND. M4<61
   C=990
ENDIF
IF M4>60 .AND. M4<66
   C=1080
ENDIF
IF M4>65 .AND. M4<71
   C=1170
ENDIF
IF M4>70
   C=1260
ENDIF

IF M4=1 .OR. M4=6 .OR. M4=11 .OR. M4=16 .OR. M4=21 .OR. M4=26 .OR. M4=31 .OR. M4=36 .OR. M4=41 .OR. M4=46 .OR. M4=51 .OR. M4=56 .OR. M4=61 .OR. M4=66 .OR. M4=71
   L=120
ENDIF
IF M4=2 .OR. M4=7 .OR. M4=12 .OR. M4=17 .OR. M4=22 .OR. M4=27 .OR. M4=32 .OR. M4=37 .OR. M4=42 .OR. M4=47 .OR. M4=52 .OR. M4=57 .OR. M4=62 .OR. M4=67 .OR. M4=72
   L=240
ENDIF
IF M4=3 .OR. M4=8 .OR. M4=13 .OR. M4=18 .OR. M4=23 .OR. M4=28 .OR. M4=33 .OR. M4=38 .OR. M4=43 .OR. M4=48 .OR. M4=53 .OR. M4=58 .OR. M4=63 .OR. M4=68 .OR. M4=73
   L=360
ENDIF
IF M4=4 .OR. M4=9 .OR. M4=14 .OR. M4=19 .OR. M4=24 .OR. M4=29 .OR. M4=34 .OR. M4=39 .OR. M4=44 .OR. M4=49 .OR. M4=54 .OR. M4=59 .OR. M4=64 .OR. M4=69 .OR. M4=74
   L=480
ENDIF
IF M4=5 .OR. M4=10 .OR. M4=15 .OR. M4=20 .OR. M4=25 .OR. M4=30 .OR. M4=35 .OR. M4=40 .OR. M4=45 .OR. M4=50 .OR. M4=55 .OR. M4=60 .OR. M4=65 .OR. M4=70 .OR. M4=75
   L=600
ENDIF

RETU


*-------------
FUNCTION SALIR

PRINCE.RELEASE
QUIT
RETU


*-------------
FUNCTION CANTA

cVoz:= M4
oVoz:Speak( cVoz )

return

Re: JUEGO BINGO

Posted: Sat Jan 13, 2024 12:10 am
by LOUIS
Hola a todos los Amigos del HMG

Le hice un pequeño cambio a los primeros 9 números, para que los ponga en pantalla con el 0 adelante y se vea mejor cuadrada su presentación ...

No se olviden lo que está pendiente :oops:

Lo que añadí (o cambié) son 6 líneas, desde el IF VAL hasta el ENDIF

Code: Select all

   M4=NNUM
   CANTA()
   PINTANUME()

IF VAL(CVAR2)<10
   CVAR2='0'+ALLTRIM(CVAR2)
   @ L,C LABEL &CVAR1 PARENT PRINCE VALUE CVAR2 WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}
ELSE
   @ L,C LABEL &CVAR1 PARENT PRINCE VALUE CVAR2 WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}
ENDIF

   L1:="L"+ ALLTRIM(STR(n))		&& VARIABLE PARA LABELS
   INKEY(0.5)				&& TIEMPO ENTRE UN NUMERO Y OTRO (SE LO PUEDE AMPLIAR)

Re: JUEGO BINGO

Posted: Sat Jan 13, 2024 4:57 am
by danielmaximiliano
Hola: Hice unas mejoras visuales a los numero que van saliendo, de esta manera es mas correcta los numeros en el carton para un seguimiento

Code: Select all

*******************************************
* PROGRAMADO EN HMG 3.0.46 EL 09/01/2024  *
* PROGRAMADO PARA BINGO DE 75 BOLAS       *
* PARA JUGAR ENTRE AMIGOS O FAMILIA       *
*******************************************

#include "HMG.CH"

* SCREEN 1360x768

FUNCTION MAIN()

PUBLIC nCount, nLine, nColumn, M4
Public oVoz := CreateObject("SAPI.SpVoice")

DEFINE WINDOW PRINCE AT 0,0 WIDTH 0 HEIGHT 0 BACKCOLOR {0,125,250} NOCAPTION MAIN
    @ 000,000 LABEL L0 ;
	          VALUE "JUGANDO BINGO EN CASA" ;
			  WIDTH 1200 HEIGHT 99 ;
			  FONT "ALGERIAN" SIZE 72 BOLD UNDERLINE  ITALIC ;
			  FONTCOLOR WHITE TRANSPARENT 
			  
          @ 725 ,1000 SLIDER Volumen;
                     RANGE 0 , 100  VALUE 50 ;
					 WIDTH  180 HEIGHT 30  TOOLTIP "Volumen Speech";
					 ON CHANGE Volume()
	@ 725,1180 BUTTON BUTTON_1 CAPTION "S T A R T" WIDTH 75 HEIGHT 30 ONCLICK BUSCANUME()
	@ 725,1260 BUTTON BUTTON_2 CAPTION "E X I T"   WIDTH 75 HEIGHT 30 ONCLICK SALIR()

	ON KEY ESCAPE ACTION SALIR()
END WINDOW

PRINCE.MAXIMIZE
PRINCE.ACTIVATE

RETURN

FUNCTION Volume
oVoz:Volume := PRINCE.Volumen.value
oVoz:Speak( "Volumen "+ str (PRINCE.Volumen.value ))
Return 

FUNCTION BUSCANUME

LOCAL nNum
MSGINFO ("ATENCION POR FAVOR, EMPEZARA EL JUEGO !")
nAleatorio:=ARRAY(75)
FOR nCount=1 TO 75
   PASE:=.T.
   DO WHILE PASE
      nNum:=HB_RANDOMINT(1,75)
      IF VALTYPE(nAleatorio[nNum])="U"
         nAleatorio[nNum]:=nNum
         PASE:=.F.
      ENDIF
   ENDDO

   cVar1:="NUME"+ALLTRIM(STR(nCount))		&& ETIQUETA QUE VA AUMENTANDO EN 1
   cVar2:=ALLTRIM(STR(nNum))			&& NUMERO PURO ALEATORIO
   cVar3:="LAST"+ALLTRIM(STR(nCount))		&& ETIQUETA PARA ULTIMO NUMERO JUGADO

   M4=nNum
   CANTA()
   PINTANUME()
   
   
IF VAL(cVar2)<10
   cVar2='0'+ALLTRIM(cVar2)
      @ nLine,nColumn LABEL &CVAR1 PARENT PRINCE VALUE CVAR2 WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}
ELSE
   @ nLine,nColumn LABEL &CVAR1 PARENT PRINCE VALUE CVAR2 WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}
ENDIF
    L1:="L"+ ALLTRIM(STR(nCount))		&& VARIABLE PARA LABELS
   INKEY(0.5)				&& TIEMPO ENTRE UN NUMERO Y OTRO (SE LO PUEDE AMPLIAR)
   IF nCount=75
      nCount=74
      @ 5,1200 LABEL &L1 PARENT PRINCE VALUE TRAN(nCount+1,'99') WIDTH 111 HEIGHT 99 FONT "ALGERIAN" SIZE 72 BOLD FONTCOLOR GREEN BACKCOLOR {0,125,250}
      EXIT
    ELSE
      @ 5,1200 LABEL &L1 PARENT PRINCE VALUE TRAN(nCount+1,'99') WIDTH 111 HEIGHT 99 FONT "ALGERIAN" SIZE 72 BOLD FONTCOLOR GREEN BACKCOLOR {0,125,250}
   ENDIF
   @ 700,0 LABEL &cVar3 PARENT PRINCE VALUE "ULTIMO NUMERO QUE SALIO --->"+cVar2 WIDTH 1255 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLUE BACKCOLOR {0,125,250}



NEXT

RETURN


*-----------------
FUNCTION PINTANUME

IF M4  >0  .AND. M4 < 16
   nLine=120 
ENDIF

IF M4 > 15 .AND. M4 < 31
   nLine=240 
ENDIF

IF M4 >=31  .AND. M4 <= 45
   nLine=360
ENDIF

IF M4 >= 46 .AND. M4 <= 60
   nLine=480
ENDIF

IF M4 >= 61 .AND. M4 <= 75
   nLine=600
ENDIF

IF M4 = 1 .OR. M4 = 16 .OR. M4 = 31 .OR. M4 = 46 .OR. M4 = 61 
   nColumn=0
ENDIF

IF M4 = 2 .OR. M4 = 17 .OR. M4 = 32 .OR. M4 = 47 .OR. M4 = 62
  nColumn=90
ENDIF

IF M4 = 3 .OR. M4 = 18 .OR. M4 = 33 .OR. M4 = 48 .OR. M4 = 63
  nColumn=180
ENDIF

IF M4 = 4 .OR. M4 = 19 .OR. M4 = 34 .OR. M4 = 49 .OR. M4 = 64 
   nColumn=270
ENDIF

IF M4 = 5 .OR. M4 = 20 .OR. M4 = 35 .OR. M4 = 50 .OR. M4 = 65 
 nColumn=360
ENDIF

IF M4 = 6 .OR. M4 = 21 .OR. M4 = 36 .OR. M4 = 51 .OR. M4 = 66
 nColumn=450
ENDIF

IF M4 = 7 .OR. M4 = 22 .OR. M4 = 37 .OR. M4 = 52 .OR. M4 = 67
 nColumn=540
ENDIF

IF M4 = 8 .OR. M4 = 23 .OR. M4 = 38 .OR. M4 = 53 .OR. M4 = 68
 nColumn=630
ENDIF

IF M4 = 9 .OR. M4 = 24 .OR. M4 = 39 .OR. M4 = 54 .OR. M4 = 69
   nColumn=720
ENDIF

IF M4 = 10 .OR. M4 = 25 .OR. M4 = 40 .OR. M4 = 55 .OR. M4 = 70
   nColumn=810
ENDIF

IF M4 = 11 .OR. M4 = 26 .OR. M4 = 41 .OR. M4 = 56 .OR. M4 = 71
   nColumn=900
ENDIF

IF M4 = 12 .OR. M4 = 27 .OR. M4 = 42 .OR. M4 = 57 .OR. M4 = 72
   nColumn=990
ENDIF

IF M4 = 13 .OR. M4 = 28 .OR. M4 = 43 .OR. M4 = 58 .OR. M4 = 73
   nColumn=1080
ENDIF

IF M4 = 14 .OR. M4 = 29 .OR. M4 = 44 .OR. M4 = 59 .OR. M4 = 74
   nColumn=1170
ENDIF

IF M4 = 15 .OR. M4 = 30 .OR. M4 = 45 .OR. M4 = 60 .OR. M4 = 75
   nColumn=1260
ENDIF
 
RETU




*-------------
FUNCTION SALIR

PRINCE.RELEASE
QUIT
RETU


*-------------
FUNCTION CANTA

cVoz:= M4
oVoz:Speak( cVoz )

return

Re: JUEGO BINGO

Posted: Sat Jan 13, 2024 4:40 pm
by edk
Agregué la capacidad de pausar, detener y reiniciar el sorteo. Optimicé el código.

Code: Select all

*******************************************
* PROGRAMADO EN HMG 3.0.46 EL 09/01/2024  *
* PROGRAMADO PARA BINGO DE 75 BOLAS       *
* PARA JUGAR ENTRE AMIGOS O FAMILIA       *
*******************************************

#include "HMG.CH"

//SpVoice Flags
#define  SVSFDefault            0
#define  SVSFlagsAsync          1
#define  SVSFPurgeBeforeSpeak   2
#define  SVSFIsFilename         4
#define  SVSFIsXML              8
#define  SVSFIsNotXML           16
#define  SVSFPersistXML         32


* SCREEN 1360x768

FUNCTION MAIN()

Public oVoice := CreateObject( "SAPI.SpVoice" )

DEFINE WINDOW PRINCE AT 0,0 WIDTH 0 HEIGHT 0 BACKCOLOR {0,125,250} NOCAPTION MAIN
    @ 000,000 LABEL L0 ;
	          VALUE "JUGANDO BINGO EN CASA" ;
			  WIDTH 1200 HEIGHT 99 ;
			  FONT "ALGERIAN" SIZE 72 BOLD UNDERLINE  ITALIC ;
			  FONTCOLOR WHITE TRANSPARENT
		  
    @ 5 ,1200 LABEL L1 ;
              VALUE "" ;
              WIDTH 111 HEIGHT 99 ;
              FONT "ALGERIAN" SIZE 72 BOLD ;
              FONTCOLOR GREEN BACKCOLOR {0,125,250}

    @ 690,0   LABEL L2 ;
              VALUE "" ;
              WIDTH 1055 HEIGHT 62 ;
              FONT "ALGERIAN" SIZE 48 BOLD ;
              FONTCOLOR BLUE BACKCOLOR {0,125,250}

              
    @ 735 ,1065 SLIDER Volumen;
                     RANGE 0 , 100  VALUE oVoice:Volume ;
					 WIDTH  235 HEIGHT 30  TOOLTIP "Volumen Speech";
					 ON CHANGE Volume()
					 
					 
	@ 700,1065 BUTTON BUTTON_1 CAPTION "S T A R T" WIDTH 75 HEIGHT 30 ONCLICK BUSCANUME()
	@ 700,1145 BUTTON BUTTON_2 CAPTION "E X I T"   WIDTH 75 HEIGHT 30 ONCLICK SALIR()
	@ 700,1225 BUTTON BUTTON_3 CAPTION "PAUSE"     WIDTH 75 HEIGHT 30 ONCLICK Pause()
	PRINCE.BUTTON_3.Enabled := .F.

	ON KEY ESCAPE ACTION SALIR()
END WINDOW

PRINCE.MAXIMIZE
PRINCE.ACTIVATE

RETURN

*-------------
FUNCTION Volume
oVoice:Volume := PRINCE.Volumen.value
Speak ( "Volumen "+ str ( oVoice:Volume ), .F. )
Return 

*-------------
FUNCTION Speak ( cSpeak, lWait )
Local nFlagSpVoice
Default lWait := .T.

IF lWait
    nFlagSpVoice := SVSFDefault
ELSE
    nFlagSpVoice := SVSFlagsAsync + SVSFPurgeBeforeSpeak
ENDIF
oVoice:Speak( cSpeak, nFlagSpVoice )
Return 

*-------------
Function Pause ()
PRINCE.BUTTON_3.Caption := IF( PRINCE.BUTTON_3.Caption = "PAUSE", "Continue", "PAUSE" )
DO EVENTS
Return    

*-------------
FUNCTION BUSCANUME
LOCAL nNum, nAleatorio, nCount, nLine := 0, nColumn := 0

IF PRINCE.BUTTON_1.Caption = "STOP"
    PRINCE.BUTTON_1.Caption := "S T A R T"
    PRINCE.BUTTON_3.Caption := "PAUSE"
    DO EVENTS
    RETURN
ENDIF

PRINCE.BUTTON_1.Caption := "STOP"
PRINCE.BUTTON_3.Caption := "PAUSE"
PRINCE.BUTTON_3.Enabled := .T.
PRINCE.BUTTON_3.SetFocus

DO EVENTS

nAleatorio := {}

DO WHILE Len( nAleatorio ) < 75
    DO WHILE .T.
      nNum := HB_RANDOMINT(1,75)
      IF ASCAN ( nAleatorio, nNum ) = 0
        AAdd ( nAleatorio, nNum )
        IF _IsControlDefined ( StrZero ( nNum, 2 ) , "PRINCE" )
            DoMethod ( "PRINCE", StrZero ( nNum, 2 ), "Release" )
        ENDIF
        EXIT
      ENDIF
      DO EVENTS
   ENDDO
   DO EVENTS
ENDDO

MSGINFO ("ATENCION POR FAVOR, EMPEZARA EL JUEGO !")

FOR nCount := 1 TO Len( nAleatorio )

    DO WHILE PRINCE.BUTTON_3.Caption = "Continue"
        DO EVENTS
    ENDDO
    
    IF PRINCE.BUTTON_1.Caption = "S T A R T"
        EXIT
    ENDIF

   PINTANUME( nAleatorio [ nCount ], @nLine, @nColumn )
   
   @ nLine,nColumn LABEL &(StrZero ( nAleatorio [ nCount ], 2 )) PARENT PRINCE VALUE STRZero( nAleatorio [ nCount ], 2 ) WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}

   DO EVENTS
   
   PRINCE.L1.VALUE := StrZero ( nCount, 2 )
   PRINCE.L2.VALUE := "ULTIMO NUMERO QUE SALIO --->" + STRZero( nAleatorio [ nCount ], 2 )

   Speak ( nAleatorio [ nCount ] )

   DO EVENTS

   INKEY(0.5)				&& TIEMPO ENTRE UN NUMERO Y OTRO (SE LO PUEDE AMPLIAR)
   
NEXT

PRINCE.BUTTON_3.Caption := "PAUSE"
PRINCE.BUTTON_3.Enabled := .F.
PRINCE.BUTTON_1.Caption := "S T A R T"
PRINCE.BUTTON_1.SetFocus
DO EVENTS
RETURN

*-----------------
FUNCTION PINTANUME( nNum, nLine, nColumn )

IF nNum  >0  .AND. nNum < 16
   nLine=120 
ENDIF

IF nNum > 15 .AND. nNum < 31
   nLine=240 
ENDIF

IF nNum >=31  .AND. nNum <= 45
   nLine=360
ENDIF

IF nNum >= 46 .AND. nNum <= 60
   nLine=480
ENDIF

IF nNum >= 61 .AND. nNum <= 75
   nLine=600
ENDIF

IF nNum = 1 .OR. nNum = 16 .OR. nNum = 31 .OR. nNum = 46 .OR. nNum = 61 
   nColumn=0
ENDIF

IF nNum = 2 .OR. nNum = 17 .OR. nNum = 32 .OR. nNum = 47 .OR. nNum = 62
  nColumn=90
ENDIF

IF nNum = 3 .OR. nNum = 18 .OR. nNum = 33 .OR. nNum = 48 .OR. nNum = 63
  nColumn=180
ENDIF

IF nNum = 4 .OR. nNum = 19 .OR. nNum = 34 .OR. nNum = 49 .OR. nNum = 64 
   nColumn=270
ENDIF

IF nNum = 5 .OR. nNum = 20 .OR. nNum = 35 .OR. nNum = 50 .OR. nNum = 65 
 nColumn=360
ENDIF

IF nNum = 6 .OR. nNum = 21 .OR. nNum = 36 .OR. nNum = 51 .OR. nNum = 66
 nColumn=450
ENDIF

IF nNum = 7 .OR. nNum = 22 .OR. nNum = 37 .OR. nNum = 52 .OR. nNum = 67
 nColumn=540
ENDIF

IF nNum = 8 .OR. nNum = 23 .OR. nNum = 38 .OR. nNum = 53 .OR. nNum = 68
 nColumn=630
ENDIF

IF nNum = 9 .OR. nNum = 24 .OR. nNum = 39 .OR. nNum = 54 .OR. nNum = 69
   nColumn=720
ENDIF

IF nNum = 10 .OR. nNum = 25 .OR. nNum = 40 .OR. nNum = 55 .OR. nNum = 70
   nColumn=810
ENDIF

IF nNum = 11 .OR. nNum = 26 .OR. nNum = 41 .OR. nNum = 56 .OR. nNum = 71
   nColumn=900
ENDIF

IF nNum = 12 .OR. nNum = 27 .OR. nNum = 42 .OR. nNum = 57 .OR. nNum = 72
   nColumn=990
ENDIF

IF nNum = 13 .OR. nNum = 28 .OR. nNum = 43 .OR. nNum = 58 .OR. nNum = 73
   nColumn=1080
ENDIF

IF nNum = 14 .OR. nNum = 29 .OR. nNum = 44 .OR. nNum = 59 .OR. nNum = 74
   nColumn=1170
ENDIF

IF nNum = 15 .OR. nNum = 30 .OR. nNum = 45 .OR. nNum = 60 .OR. nNum = 75
   nColumn=1260
ENDIF
 
RETURN

*-------------
FUNCTION SALIR

PRINCE.RELEASE
QUIT
RETURN

Re: JUEGO BINGO

Posted: Sat Jan 13, 2024 8:28 pm
by LOUIS
Muchas pero muchas Gracias a Daniel Maximiliano y a Mr. EDK

Ha quedado muy muy bonito el programa y está a disposición de todos ...

Sus contribuciones fueron Estupendas !!!!

Nuevamente Mil Gracias !!!

Re: JUEGO BINGO

Posted: Mon Jan 15, 2024 12:25 am
by danielmaximiliano
Hola : Unas mejoras, eliminar "Ultimo numero que salio" y la cantidad de numero que esta saliendo, se agrega el orden de los numero salientes para eliminar el problema de que en el repaso de Bingo otra persona no haya cantada Bingo anteriormente porque no escucho un numero, "nosé si se entiende"

Code: Select all

*******************************************
* PROGRAMADO EN HMG 3.0.46 EL 09/01/2024  *
* PROGRAMADO PARA BINGO DE 75 BOLAS       *
* PARA JUGAR ENTRE AMIGOS O FAMILIA       *
*******************************************

#include "HMG.CH"

//SpVoice Flags
#define  SVSFDefault            0
#define  SVSFlagsAsync          1
#define  SVSFPurgeBeforeSpeak   2
#define  SVSFIsFilename         4
#define  SVSFIsXML              8
#define  SVSFIsNotXML           16
#define  SVSFPersistXML         32


* SCREEN 1360x768

FUNCTION MAIN()
Public cSalieron := ""
Public oVoice := CreateObject( "SAPI.SpVoice" )

DEFINE WINDOW PRINCE AT 0,0 WIDTH 0 HEIGHT 0 BACKCOLOR {0,125,250} NOCAPTION MAIN
    @ 000,000 LABEL L0 ;
	          VALUE " JUGANDO BINGO EN CASA " ;
			  WIDTH 1340 HEIGHT 99 ;
			  FONT "ALGERIAN" SIZE 72 BOLD UNDERLINE  ITALIC ;
			  FONTCOLOR WHITE TRANSPARENT

    @ 690,0   LABEL L1 ;
              VALUE "" ;
              WIDTH 1055 HEIGHT 70 ;
              FONT "ALGERIAN" SIZE 16 BOLD ;
              FONTCOLOR BLUE BACKCOLOR {0,125,250}

    @ 735 ,1065 SLIDER Volumen;
                     RANGE 0 , 100  VALUE oVoice:Volume ;
					 WIDTH  235 HEIGHT 30  TOOLTIP "Volumen Speech";
					 ON CHANGE Volume()
					 				 
	@ 700,1065 BUTTON BUTTON_1 CAPTION "S T A R T" WIDTH 75 HEIGHT 30 ONCLICK BUSCANUME()
	@ 700,1145 BUTTON BUTTON_2 CAPTION "E X I T"   WIDTH 75 HEIGHT 30 ONCLICK SALIR()
	@ 700,1225 BUTTON BUTTON_3 CAPTION "PAUSE"     WIDTH 75 HEIGHT 30 ONCLICK Pause()
	PRINCE.BUTTON_3.Enabled := .F.

	ON KEY ESCAPE ACTION SALIR()
END WINDOW

PRINCE.MAXIMIZE
PRINCE.ACTIVATE

RETURN

*-------------
FUNCTION Volume
oVoice:Volume := PRINCE.Volumen.value
Speak ( "Volumen "+ str ( oVoice:Volume ), .F. )
Return 

*-------------
FUNCTION Speak ( cSpeak, lWait )
Local nFlagSpVoice
Default lWait := .T.

IF lWait
    nFlagSpVoice := SVSFDefault
ELSE
    nFlagSpVoice := SVSFlagsAsync + SVSFPurgeBeforeSpeak
ENDIF
oVoice:Speak( cSpeak, nFlagSpVoice )
Return 

*-------------
Function Pause ()
PRINCE.BUTTON_3.Caption := IF( PRINCE.BUTTON_3.Caption = "PAUSE", "Continue", "PAUSE" )
DO EVENTS
Return    

*-------------
FUNCTION BUSCANUME
LOCAL nNum, nAleatorio, nCount, nLine := 0, nColumn := 0

IF PRINCE.BUTTON_1.Caption = "STOP"
    PRINCE.BUTTON_1.Caption := "S T A R T"
    PRINCE.BUTTON_3.Caption := "PAUSE"
    DO EVENTS
    RETURN
ENDIF

PRINCE.BUTTON_1.Caption := "STOP"
PRINCE.BUTTON_3.Caption := "PAUSE"
PRINCE.BUTTON_3.Enabled := .T.
PRINCE.BUTTON_3.SetFocus

DO EVENTS

nAleatorio := {}

DO WHILE Len( nAleatorio ) < 75
    DO WHILE .T.
      nNum := HB_RANDOMINT(1,75)
      IF ASCAN ( nAleatorio, nNum ) = 0
        AAdd ( nAleatorio, nNum )
        IF _IsControlDefined ( StrZero ( nNum, 2 ) , "PRINCE" )
            DoMethod ( "PRINCE", StrZero ( nNum, 2 ), "Release" )
        ENDIF
        EXIT
      ENDIF
      DO EVENTS
   ENDDO
   DO EVENTS
ENDDO

MSGINFO ("ATENCION POR FAVOR, EMPEZARA EL JUEGO !")

FOR nCount := 1 TO Len( nAleatorio )

    DO WHILE PRINCE.BUTTON_3.Caption = "Continue"
        DO EVENTS
    ENDDO
    
    IF PRINCE.BUTTON_1.Caption = "S T A R T"
        EXIT
    ENDIF

   PINTANUME( nAleatorio [ nCount ], @nLine, @nColumn )
   
   @ nLine,nColumn LABEL &(StrZero ( nAleatorio [ nCount ], 2 )) PARENT PRINCE VALUE STRZero( nAleatorio [ nCount ], 2 ) WIDTH 74 HEIGHT 66 FONT "ALGERIAN" SIZE 48 BOLD FONTCOLOR BLACK BACKCOLOR {0,125,250}

   DO EVENTS
   
   
   PRINCE.L1.VALUE := cSalieron += " " + STRZero( nAleatorio [ nCount ], 2 ) 

   Speak ( nAleatorio [ nCount ] )

   DO EVENTS

   INKEY(0.5)				&& TIEMPO ENTRE UN NUMERO Y OTRO (SE LO PUEDE AMPLIAR)
   
NEXT

PRINCE.BUTTON_3.Caption := "PAUSE"
PRINCE.BUTTON_3.Enabled := .F.
PRINCE.BUTTON_1.Caption := "S T A R T"
PRINCE.BUTTON_1.SetFocus
DO EVENTS
RETURN

*-----------------
FUNCTION PINTANUME( nNum, nLine, nColumn )

IF nNum  >0  .AND. nNum < 16
   nLine=120 
ENDIF

IF nNum > 15 .AND. nNum < 31
   nLine=240 
ENDIF

IF nNum >=31  .AND. nNum <= 45
   nLine=360
ENDIF

IF nNum >= 46 .AND. nNum <= 60
   nLine=480
ENDIF

IF nNum >= 61 .AND. nNum <= 75
   nLine=600
ENDIF

IF nNum = 1 .OR. nNum = 16 .OR. nNum = 31 .OR. nNum = 46 .OR. nNum = 61 
   nColumn=0
ENDIF

IF nNum = 2 .OR. nNum = 17 .OR. nNum = 32 .OR. nNum = 47 .OR. nNum = 62
  nColumn=90
ENDIF

IF nNum = 3 .OR. nNum = 18 .OR. nNum = 33 .OR. nNum = 48 .OR. nNum = 63
  nColumn=180
ENDIF

IF nNum = 4 .OR. nNum = 19 .OR. nNum = 34 .OR. nNum = 49 .OR. nNum = 64 
   nColumn=270
ENDIF

IF nNum = 5 .OR. nNum = 20 .OR. nNum = 35 .OR. nNum = 50 .OR. nNum = 65 
 nColumn=360
ENDIF

IF nNum = 6 .OR. nNum = 21 .OR. nNum = 36 .OR. nNum = 51 .OR. nNum = 66
 nColumn=450
ENDIF

IF nNum = 7 .OR. nNum = 22 .OR. nNum = 37 .OR. nNum = 52 .OR. nNum = 67
 nColumn=540
ENDIF

IF nNum = 8 .OR. nNum = 23 .OR. nNum = 38 .OR. nNum = 53 .OR. nNum = 68
 nColumn=630
ENDIF

IF nNum = 9 .OR. nNum = 24 .OR. nNum = 39 .OR. nNum = 54 .OR. nNum = 69
   nColumn=720
ENDIF

IF nNum = 10 .OR. nNum = 25 .OR. nNum = 40 .OR. nNum = 55 .OR. nNum = 70
   nColumn=810
ENDIF

IF nNum = 11 .OR. nNum = 26 .OR. nNum = 41 .OR. nNum = 56 .OR. nNum = 71
   nColumn=900
ENDIF

IF nNum = 12 .OR. nNum = 27 .OR. nNum = 42 .OR. nNum = 57 .OR. nNum = 72
   nColumn=990
ENDIF

IF nNum = 13 .OR. nNum = 28 .OR. nNum = 43 .OR. nNum = 58 .OR. nNum = 73
   nColumn=1080
ENDIF

IF nNum = 14 .OR. nNum = 29 .OR. nNum = 44 .OR. nNum = 59 .OR. nNum = 74
   nColumn=1170
ENDIF

IF nNum = 15 .OR. nNum = 30 .OR. nNum = 45 .OR. nNum = 60 .OR. nNum = 75
   nColumn=1260
ENDIF
 
RETURN

*-------------
FUNCTION SALIR

PRINCE.RELEASE
QUIT
RETURN

Re: JUEGO BINGO

Posted: Mon Jan 15, 2024 2:05 pm
by edk
Puede simplificar aún más la función PINTANUME().

Code: Select all

*-----------------
FUNCTION PINTANUME( nNum, nLine, nColumn )
Local nMod 

nMod := nNum / 15
IF nMod == Int ( nMod )
    nMod --
ENDIF
nLine := ( Int( nMod ) + 1 ) * 120

nMod := nNum % 15
IF nMod = 0
    nMod := 15
ENDIF

nColumn := 15 + ( nMod - 1 ) * 90
 
RETURN
Daniel, no puedo cambiar la voz con la que se dicen los números. En mi sistema tiene dos voces, pero incluso cuando quiero asignar la primera voz (predeterminada), obtengo RTE. ¿Este también es tu caso? ¿Algunas ideas? El mismo problema ocurre cuando quiero cambiar a una salida de audio diferente.

Code: Select all

oVoice:Voice := oVoice:GetVoices():Item(0) 		//:Item (0) - 1st voice; :Item (1) - 2nd voice; etc.

oVoice:AudioOutput := oVoice:GetAudioOutputs():Item(0)  //:Item (0) - 1st output; :Item (1) - 2nd output; etc.

Re: JUEGO BINGO

Posted: Mon Jan 15, 2024 10:32 pm
by danielmaximiliano
Hola : en mi pc hay 3 narradores se pueden agregar mas pulsando Windows+ctrl+n en narradores agregar, tamb se puede modificar la salida predeterminada.

Code: Select all

*-------------
FUNCTION Volume
LOCAL oVoces, nFor, cDescription, nIndex
nIndex := 0

oVoice:Volume := PRINCE.Volumen.value
Speak ( "Volumen "+ str ( oVoice:Volume ), .F. )

 * list installed voices

  FOR EACH oVoces IN oVoice:GetVoices()
           cDescription = oVoces:GetDescription()
		   MSGinfo( cDescription, "Index : " + STR( nIndex, 2))
           nIndex := nIndex + 1
  ENDFOR

Return