ThinBasic e il gioco delle tre carte

Torniamo su questo veloce interprete Basic per creare un piccolo gioco, quello delle tre carte, per avvicinarci alle potenzialità di questo motore di scripting.

Per prima cosa abbiamo bisogno della struttura per la creazione e gestione di una dialog già vista in un precedente articolo alla quale però si aggiunge la creazione e gestione dei pulsanti gestita dall'istruzione CONTROL ADD, i parametri richiesti non differiscono molto da quelli necessari per la creazione di una finestra:

  • ClassName: Il nome del tipo di oggetto che verrà creato;
  • hwnd: l'indirizzo della finestra del nostro script;
  • ctrlID: un identificativo univoco associato al controllo creato;
  • txt: l'etichetta del controllo
  • xPos,yPos,Width,Height la posizione nella nostra finestra del controllo oltre ai parametri di larghezza e altezza.
USES "UI"

DIM hwnd as Long
DIM msg as Long
DIM lparam as long
DIM wparam as long

DIALOG NEW 0, "3carte!!!", -1 , -1, 200, 120, %WS_Sysmenu TO hwnd

%ID_BUTTON_1 = 1
%ID_BUTTON_2 = 2
%ID_BUTTON_3 = 3
%ID_BUTTON_4 = 4

CONTROL ADD BUTTON , hwnd, %ID_BUTTON_1, "1", 10, 10, 180, 20 
CONTROL ADD BUTTON , hwnd, %ID_BUTTON_2, "2", 10, 30, 180, 20 
CONTROL ADD BUTTON , hwnd, %ID_BUTTON_3, "3", 10, 50, 180, 20 
CONTROL ADD BUTTON , hwnd, %ID_BUTTON_4, "Reset", 10, 70, 180, 20 

DIALOG SHOW MODELESS hwnd

'Ciclo infinito di "raccolta messaggi"
  WHILE IsWindow(hwnd)                  

  'Ci sono messaggi per lo script?  
   Msg = GetMessage(hwnd, wParam, lParam)

    SELECT CASE Msg
  
      CASE %WM_SYSCOMMAND

        SELECT CASE wParam
            
          CASE %SC_CLOSE
            EXIT WHILE
              
        END SELECT
      
    END SELECT
    
  WEND

DIALOG END hwnd

I primi tre pulsanti rappresentano le tre carte, il quarto permette di rigiocare senza dover riavviare lo script.
Il gioco molto semplicemente ci chiede di scoprire sotto quale "carta" sia nascosta la regina, abbiamo quindi bisogno di un'ulteriore variabile che memorizzi la scelta casuale:

  DIM queen as integer

  'inizializza il generatore dei numeri casuali
  RANDOMIZE

  queen = rnd(1,3)

Quindi alla pressione del tasto bisogna confrontare la scelta effettuata con quella memorizzata, stampare la situazione corrente e disabilitare in seguito i pulsanti relativi alle carte per costringere al "reset" del gioco.

  CASE %WM_COMMAND
     
     if (wparam = queen) then
        win_SetTitle(hwnd,"Hai Vinto!!! :-)")
        control disable hwnd, %ID_BUTTON_1
        control disable hwnd, %ID_BUTTON_2
        control disable hwnd, %ID_BUTTON_3
     else 
        win_SetTitle(hwnd,"Sbagliatooo!!! :-(")   
        control disable hwnd, %ID_BUTTON_1
        control disable hwnd, %ID_BUTTON_2
        control disable hwnd, %ID_BUTTON_3
     endif
          
     if (wparam = %ID_BUTTON_4) then
         win_SetTitle(hwnd,"Riprova ^_^")
         control enable hwnd, %ID_BUTTON_1
         control enable hwnd, %ID_BUTTON_2
         control enable hwnd, %ID_BUTTON_3
         queen = rnd(1,3)  
     endif
Come è possibile notare la funzione CONTROL ENABLE permette di abilitare il controllo avente un certo id della finestra di indirizzo hwnd, la funzione opposta è delegata alla CONTROL DISABLE. Ecco qui il listato completo:
USES "UI"

DIM hwnd as Long
DIM msg as Long
DIM lparam as long
DIM wparam as long
DIM queen as integer

Randomize

queen = rnd(1,3)

DIALOG NEW 0, "3carte!!!", -1 , -1, 200, 120, %WS_Sysmenu TO hwnd

%ID_BUTTON_1 = 1
%ID_BUTTON_2 = 2
%ID_BUTTON_3 = 3
%ID_BUTTON_4 = 4

CONTROL ADD BUTTON , hwnd, %ID_BUTTON_1, "1", 10, 10, 180, 20 
CONTROL ADD BUTTON , hwnd, %ID_BUTTON_2, "2", 10, 30, 180, 20 
CONTROL ADD BUTTON , hwnd, %ID_BUTTON_3, "3", 10, 50, 180, 20 
CONTROL ADD BUTTON , hwnd, %ID_BUTTON_4, "Reset", 10, 70, 180, 20 

DIALOG SHOW MODELESS hwnd

'Ciclo infinito di "raccolta messaggi"
  WHILE IsWindow(hwnd)                  

    'Ci sono messaggi per lo script?  
    Msg = GetMessage(hwnd, wParam, lParam)

    SELECT CASE Msg
      
      CASE %WM_COMMAND
        
          if (wparam = queen) then
             win_SetTitle(hwnd,"Hai Vinto!!! :-)")
             control disable hwnd, %ID_BUTTON_1
             control disable hwnd, %ID_BUTTON_2
             control disable hwnd, %ID_BUTTON_3
          else 
             win_SetTitle(hwnd,"Sbagliatooo!!! :-(")   
             control disable hwnd, %ID_BUTTON_1
             control disable hwnd, %ID_BUTTON_2
             control disable hwnd, %ID_BUTTON_3
          endif
          
         IF (wparam = %ID_BUTTON_4) then
           win_SetTitle(hwnd,"Riprova ^_^")
           control enable hwnd, %ID_BUTTON_1
           control enable hwnd, %ID_BUTTON_2
           control enable hwnd, %ID_BUTTON_3
           queen = rnd(1,3)  
         endif  
      CASE %WM_SYSCOMMAND

        SELECT CASE wParam
            
          CASE %SC_CLOSE
            EXIT WHILE
              
        END SELECT
      
    END SELECT
    
  WEND

DIALOG END hwnd