www.bervini.net/raffaello/
Code:
'Bervini Raffaello Switzerland
'PowerBasic PBWin
'www.bervini.net/raffaello/     for all the bmp
#COMPILE EXE
#DIM ALL
#INCLUDE "win32api.inc"
'------------------------------------------------------------------------------
 %id_fondo  = 100
 %id_info   = 110
 %id_rullo  = 110
 %id_start  = 120
 %id_quick  = 130
 %id_timer1 = 200
 $radice="carta"
'$radice="dado"
 GLOBAL hDlg AS DWORD
'------------------------------------------------------------------------------
 GLOBAL iter,larghezza_finestra,altezza_finestra,id_bmp(),id_tmp,id_cil(),continuo AS LONG
 GLOBAL fondo_bmp AS STRING
 GLOBAL figure,rulli AS LONG
'------------------------------------------------------------------------------
FUNCTION PBMAIN () AS LONG
 LOCAL ff,j,Count,px,py,la,al AS LONG
 RANDOMIZE TIMER
 IF COMMAND$<>"" THEN figure=VAL(PARSE$(COMMAND$," ",2)):rulli=VAL(PARSE$(COMMAND$," ",1))
 IF figure=0 THEN figure=3
 IF rulli=0 THEN rulli=3
 ff=FREEFILE:OPEN $radice+"1.bmp" FOR BINARY AS ff:GET #ff,19,larghezza_finestra:GET #ff,23,altezza_finestra:CLOSE ff
 IF larghezza_finestra=0 THEN larghezza_finestra=150
 IF altezza_finestra=0 THEN altezza_finestra=98
 px=10:py=50:la=larghezza_finestra*rulli+px*2:al=altezza_finestra*3+py*2
 DIALOG NEW PIXELS,0,"Versione 0.1 Bervini Soft",,,la,al,%WS_CAPTION OR %WS_SYSMENU,0*%WS_EX_TOOLWINDOW OR %WS_EX_TOPMOST TO hDlg
 CONTROL ADD GRAPHIC,hDlg,%id_fondo,"",0,0,la,al
 GRAPHIC ATTACH hDlg,%id_fondo,REDRAW
 GRAPHIC RENDER "slot.bmp",(0,0)-(la,al)
 GRAPHIC GET BITS TO fondo_bmp
 CONTROL ADD GRAPHIC,hDlg,%id_info,"",10,10,la-20,py-20
 FOR j=1 TO rulli
  CONTROL ADD GRAPHIC,hDlg,%id_rullo+j,"x",px+(j-1)*larghezza_finestra,py,larghezza_finestra,altezza_finestra*3,%ss_notify
 NEXT

 px=10:la=(la-2*px)/2
 CONTROL ADD GRAPHIC,hDlg,%id_start,"play" ,px,al-py/2-10,la,30,%ss_notify:px=px+la
 GRAPHIC ATTACH hDlg,%id_start:GRAPHIC SET BITS fondo_bmp
 CALL scrivi(%id_start,"PLAY","arial",3,%YELLOW)
 CONTROL ADD GRAPHIC,hDlg,%id_quick,"quick",px,al-py/2-10,la,30,%ss_notify:px=px+la
 CALL scrivi(%id_quick,"QUICK","arial",3,%YELLOW)
 DIALOG SHOW MODAL hDlg,CALL DlgProc

END FUNCTION
'------------------------------------------------------------------------------
CALLBACK FUNCTION DlgProc () AS LONG
 LOCAL j AS LONG
 STATIC idEvent AS LONG

 SELECT CASE CBMSG
  CASE %WM_INITDIALOG
   idEvent=SetTimer(CBHNDL,%ID_TIMER1,10,BYVAL %NULL)
   CALL inizializza
  CASE %WM_TIMER
   IF CBWPARAM = %ID_TIMER1 THEN
    IF continuo=1 THEN CALL quick(altezza_finestra)
   END IF

  CASE %WM_DESTROY
   IF idEvent THEN KillTimer CBHNDL,idEvent

  CASE %WM_COMMAND
   SELECT CASE CBCTL
    CASE %id_start:continuo=0:CALL playwave("cashtill.wav",%SND_aSYNC):SLEEP 100:CALL slot(altezza_finestra):SLEEP 1000
    CASE %id_quick:IF continuo=0 THEN continuo=1 ELSE continuo=0
    CASE %IDCANCEL
     DIALOG END CBHNDL,0
   END SELECT
 END SELECT
END FUNCTION
'-----------------------------------------------------------------------------
SUB PlayWave(BYVAL File AS STRING,modo AS LONG)
 LOCAL zWav AS ASCIIZ*256
 zWav = File$
 PlaySound zWav,BYVAL %NULL,modo
END SUB
'------------------------------------------------------------------------------
SUB color2rgb(colore AS LONG,red AS LONG,green AS LONG,blue AS LONG)
 Red=colore AND &H000000FF
 SHIFT RIGHT colore,8
 Green=colore AND &H000000FF
 SHIFT RIGHT colore,8
 Blue=colore AND &H000000FF
END SUB
'------------------------------------------------------------------------------
SUB muovi(id_mem AS LONG,id AS LONG,py AS SINGLE)
 LOCAL la_win,al_win,id_tmp,j AS LONG
 STATIC al_bmp,la_bmp AS LONG
 GRAPHIC ATTACH hDlg,id,REDRAW
 GRAPHIC GET CLIENT TO la_win,al_win
 IF la_bmp=0 OR al_bmp=0 THEN GRAPHIC ATTACH id_mem,0,REDRAW:GRAPHIC GET CLIENT TO la_bmp,al_bmp
 GRAPHIC BITMAP NEW la_bmp,al_bmp TO id_tmp:GRAPHIC ATTACH id_tmp,0,REDRAW
 IF py>0 THEN
  GRAPHIC COPY id_mem,0,(0,0)-(la_bmp-1,al_bmp-py) TO (0,py)
  GRAPHIC COPY id_mem,0,(0,al_bmp-py)-(la_bmp,al_bmp) TO (0,0)
  GRAPHIC ATTACH id_mem,0,REDRAW:GRAPHIC COPY id_tmp,0,(0,0)-(la_bmp-0,al_bmp-0) TO (0,0):GRAPHIC ATTACH id_tmp,0,REDRAW
 END IF
 GRAPHIC BITMAP END

 GRAPHIC ATTACH hDlg,id,REDRAW
 GRAPHIC COPY id_mem,id,(0,0)-(la_win,al_win) TO (0,0)
 FOR j=3 TO 1 STEP -1
  GRAPHIC LINE (0,al_win/2+j)-(la_win/6,al_win/2+j),RGB(255-j*20,25,25)
  GRAPHIC LINE (5*la_win/6,al_win/2+j)-(la_win,al_win/2+j),RGB(255-j*20,25,25)
 NEXT

'scurisce parte sopra
 LOCAL PixelPtr AS LONG PTR,xsize,ysize,red,green,blue AS LONG,bmp AS STRING,soglia AS SINGLE
 GRAPHIC GET BITS TO bmp:xsize=CVL(bmp,1):ysize=CVL(bmp,5)
 PixelPtr=STRPTR(bmp)+8:soglia=0
 FOR j=1 TO .04*xsize*ysize:INCR PixelPtr:NEXT
 FOR j=.04*xsize*ysize TO xsize*ysize/3:soglia=soglia+.00009:CALL color2rgb(BYCOPY @PixelPtr,red,green,blue):@PixelPtr=RGB(red*soglia,green*soglia,blue*soglia):INCR PixelPtr:NEXT
 FOR j=xsize*ysize/3 TO xsize*ysize:INCR PixelPtr:NEXT

'scurisce parte sotto
 PixelPtr=STRPTR(bmp)+8:soglia=1
 FOR j=1 TO 2*xsize*ysize/3:INCR PixelPtr:NEXT
 FOR j=2*xsize*ysize/3 TO .96*xsize*ysize:soglia=soglia-.0001:CALL color2rgb(BYCOPY @PixelPtr,red,green,blue):@PixelPtr=RGB(red*soglia,green*soglia,blue*soglia):INCR PixelPtr:NEXT
 FOR j=.96*xsize*ysize TO xsize*ysize:INCR PixelPtr:NEXT
 GRAPHIC SET BITS bmp

'linee orizzontali
 GRAPHIC LINE (0,al_win/3-1)-(la_win,al_win/3-1),RGB(255,205,205)
 GRAPHIC LINE (0,2*al_win/3)-(la_win,2*al_win/3),RGB(255,205,205)

'bordi in alto e basso
 FOR j=0 TO .04*al_win      :GRAPHIC LINE (0,j)-(la_win,j),RGB(2255/(j+6),1255/(j+6),1255/(j+60)):NEXT
 FOR j=0.96*al_win TO al_win:GRAPHIC LINE (0,j)-(la_win,j),RGB(2255/(j-.96*al_win+6),1255/(j-.96*al_win+6),1255/(j-.96*al_win+60)):NEXT

 GRAPHIC REDRAW
END SUB
'------------------------------------------------------------------------------
SUB caricaimmagine(nomefile AS STRING,id_bmp AS LONG)
 LOCAL ff,la,al,id_bmp_tmp AS LONG
 IF DIR$(nomefile)="" THEN
  GRAPHIC BITMAP NEW larghezza_finestra,altezza_finestra TO id_bmp
  GRAPHIC ATTACH id_bmp,0,REDRAW
  GRAPHIC CLEAR RGB(RND*255,RND*255,RND*255)
  GRAPHIC COLOR RGB(RND*255,RND*255,RND*255),-2
  GRAPHIC PRINT "qui ci va bmp 150x98"
  GRAPHIC COLOR RGB(RND*255,RND*255,RND*255),-2
  GRAPHIC FONT "arial",16,1
  GRAPHIC PRINT nomefile
  GRAPHIC COPY id_bmp,0
  GRAPHIC WINDOW END
 ELSE
  ff=FREEFILE:OPEN nomefile FOR BINARY AS ff:GET #ff,19,la:GET #ff,23,al:CLOSE ff
  GRAPHIC BITMAP LOAD nomefile,la,al TO id_bmp_tmp
  GRAPHIC BITMAP NEW larghezza_finestra,altezza_finestra TO id_bmp
  GRAPHIC ATTACH id_bmp,0,REDRAW
' GRAPHIC COPY id_bmp_tmp,0
  GRAPHIC STRETCH id_bmp_tmp,0,(0,0)-(la,al) TO (0,0)-(larghezza_finestra,altezza_finestra)
  GRAPHIC WINDOW END
 END IF
END SUB
'------------------------------------------------------------------------------
SUB creacilindro(id() AS LONG,item AS LONG,id_cil AS LONG)
 LOCAL j,la,al,r AS LONG
 IF id_cil<>0 THEN GRAPHIC ATTACH id_cil,0:GRAPHIC WINDOW END
 GRAPHIC ATTACH id(1),0,REDRAW:GRAPHIC GET CLIENT TO la,al
 GRAPHIC BITMAP NEW la,al*item TO id_cil
 GRAPHIC ATTACH id_cil,0,REDRAW
 FOR j=0 TO item-1
  GRAPHIC COPY id(j+1),0 TO (0,al*j)
  GRAPHIC COLOR %GREEN,-2:GRAPHIC SET POS(0,al*j):GRAPHIC PRINT j+1
  GRAPHIC SET PIXEL (1,1+al*j),RGB(j+1,0,0)
 NEXT
 GRAPHIC REDRAW
'salva l'immagine del rullo
'GRAPHIC SAVE "cil"+TRIM$(STR$(%figure))+".bmp"
END SUB
'------------------------------------------------------------------------------
SUB slot(af AS LONG)
 LOCAL y() AS SINGLE
 LOCAL i,j,maxk,k(),finale(),colore_tmp,tot AS LONG,colore AS STRING
 DIM k(0 TO rulli),y(0 TO rulli),finale(0 TO rulli)
 %velocita=24'12
 INCR iter
'randomizza la posizione iniziale del cilindro
 FOR j=1 TO rulli:CALL muovi(id_cil(j),%id_rullo+j,RND(1,figure)*af):NEXT

 FOR j=1 TO rulli
  k(j)=RND(5,figure*12)*af:IF maxk<k(j) THEN maxk=k(j)
 NEXT

 FOR j=1 TO maxk
  FOR i=1 TO rulli
   IF k(i)=>1 THEN y(i)=1+k(i)\%velocita:CALL muovi(id_cil(i),%id_rullo+i,MIN(af,y(i))):k(i)=k(i)-MIN(af,y(i)) ELSE finale(i)=1
  NEXT
  tot=0:FOR i=1 TO rulli:tot=tot+finale(i):NEXT
  IF tot=rulli THEN playwave("Whop.wav",%SND_aSYNC):EXIT FOR
 NEXT

 FOR j=1 TO rulli
  GRAPHIC ATTACH hDlg,%id_rullo+j,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore_tmp
  colore=colore+CHR$(64+colore_tmp)
 NEXT

 CALL esaminavincite(colore)
END SUB
'------------------------------------------------------------------------------
SUB esaminavincite(c AS STRING)
 LOCAL j,colore AS LONG
 STATIC vincita AS LONG
 vincita=vincita-1
 FOR j=1 TO LEN(c)
  IF TALLY(c,CHR$(64+j))=rulli   THEN vincita=vincita+10:EXIT FOR
' IF TALLY(c,CHR$(64+j))=rulli-1 THEN vincita=vincita+2:EXIT FOR
 NEXT
 IF vincita>=0 THEN colore=%GREEN ELSE colore=%RED
 CALL scrivi(%id_info,STR$(iter)+" giocate"+" : "+c+"  Saldo "+STR$(vincita)+" fr","times new roman",3,colore)
END SUB
'------------------------------------------------------------------------------
SUB scrivi(id AS LONG,testo AS STRING,fonte AS STRING,posizione AS LONG,colore AS LONG)
 LOCAL la,al,l,a AS LONG
 GRAPHIC ATTACH hDlg,id,REDRAW
 GRAPHIC GET CLIENT TO la,al
 GRAPHIC CLEAR RGB(80,20,20)
 GRAPHIC SET BITS fondo_bmp
 GRAPHIC FONT fonte,18,0
 GRAPHIC TEXT SIZE testo TO l,a
 IF posizione<0 THEN posizione=al+posizione
 GRAPHIC SET POS((la-l)/2+1,posizione+1):GRAPHIC COLOR %BLACK,-2:GRAPHIC PRINT testo
 GRAPHIC SET POS((la-l)/2,posizione):GRAPHIC COLOR colore,-2:GRAPHIC PRINT testo
 GRAPHIC REDRAW
END SUB
'------------------------------------------------------------------------------
SUB quick(af AS LONG)
 LOCAL i,j,colore_tmp AS LONG,colore AS STRING
 INCR iter
'randomizza la posizione iniziale del cilindro
 FOR j=1 TO rulli:CALL muovi(id_cil(j),%id_rullo+j,RND(1,figure)*af):NEXT
 FOR j=1 TO rulli
  GRAPHIC ATTACH hDlg,%id_rullo+j,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore_tmp
  colore=colore+CHR$(64+colore_tmp)
 NEXT
 CALL esaminavincite(colore)
END SUB
'------------------------------------------------------------------------------
SUB inizializza
 LOCAL j AS LONG
 GRAPHIC ATTACH hDlg,%id_fondo,REDRAW
 GRAPHIC SET BITS fondo_bmp
 DIM id_bmp(0 TO figure),id_cil(0 TO rulli)
 FOR j=1 TO figure:CALL caricaimmagine($radice+TRIM$(STR$(j))+".bmp",id_tmp):id_bmp(j)=id_tmp:NEXT
 FOR j=1 TO rulli:CALL creacilindro(id_bmp(),figure,id_cil(j)):NEXT
 FOR j=1 TO rulli:CALL muovi(id_cil(j),%id_rullo+j,BYCOPY altezza_finestra):NEXT
 CALL scrivi(%id_info,"Slot Machine ("+STR$(rulli)+" rulli e"+STR$(figure)+" figure)"+STR$(figure^rulli),"times new roman",3,%MAGENTA)
END SUB
'------------------------------------------------------------------------------