http://www.bervini.net/raffaello/


Code:
'Bervini Raffaello Switzerland 'PowerBasic PBCC 'www.bervini.net/raffaello/ for all the bmp #COMPILE EXE #DIM ALL '------------------------------------------------------------------------------ GLOBAL hDlg1,hDlg2,hDlg3,id_cil1,id_cil2,id_cil3,iter AS LONG '%figure=37 '%figure=27 %figure=9 '%figure=13 '%figure=14 '%figure=4 '%figure=3 '------------------------------------------------------------------------------ FUNCTION PBMAIN () AS LONG LOCAL larghezza_finestra,altezza_finestra AS LONG,i AS STRING IF larghezza_finestra=0 THEN larghezza_finestra=150 IF altezza_finestra=0 THEN altezza_finestra=98 GRAPHIC WINDOW "",200+0*larghezza_finestra,200,larghezza_finestra,altezza_finestra*3 TO hDlg1 GRAPHIC WINDOW "",200+1*larghezza_finestra,200,larghezza_finestra,altezza_finestra*3 TO hDlg2 GRAPHIC WINDOW "",200+2*larghezza_finestra,200,larghezza_finestra,altezza_finestra*3 TO hDlg3 CONSOLE SET FOCUS:CONSOLE SET SCREEN 2,80:CONSOLE SET LOC 0,0 PRINT "Studio slot machine ..." PRINT "<Spazio> per giocare, <c> continuo, <esc> per finire" '---- LOCAL j,id_bmp(),id_tmp AS LONG DIM id_bmp(0 TO %figure) FOR j=1 TO %figure:CALL caricaimmagine("carta"+TRIM$(STR$(j))+".bmp",id_tmp):id_bmp(j)=id_tmp:NEXT '---- CALL creacilindro(id_bmp(),%figure,id_cil1) CALL creacilindro(id_bmp(),%figure,id_cil2) CALL creacilindro(id_bmp(),%figure,id_cil3) CALL slot(altezza_finestra) DO: i=INKEY$ SLEEP 100 IF i=CHR$(27) THEN EXIT LOOP SELECT CASE i CASE "c":DO:CALL slot(altezza_finestra):SLEEP 1000:LOOP WHILE NOT INSTAT CASE " ":CALL slot(altezza_finestra) END SELECT LOOP END FUNCTION '------------------------------------------------------------------------------ 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,hDlg AS LONG,py AS LONG) LOCAL la_win,al_win,id_tmp,j AS LONG STATIC al_bmp,la_bmp AS LONG GRAPHIC ATTACH hDlg,0,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,0,REDRAW GRAPHIC COPY id_mem,0,(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 'zigrinatura FOR j=al_win/3 TO 0 STEP -2 ' GRAPHIC LINE (0,j-1)-(la_win,j-1),RGB(j*6-al_win/3,j*6-al_win/3,j*6-al_win/3) GRAPHIC LINE (0,al_win-j)-(la_win,al_win-j),RGB(j*6-al_win/3,j*6-al_win/3,j*6-al_win/3) NEXT 'scurisce 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 xsize*ysize/3:soglia=soglia+.000069:CALL color2rgb(BYCOPY @PixelPtr,red,green,blue):@PixelPtr=RGB(red*soglia,green*soglia,blue*soglia):INCR PixelPtr:NEXT FOR j=2*xsize*ysize/3 TO xsize*ysize:INCR PixelPtr:NEXT PixelPtr=STRPTR(bmp)+8:soglia=1 FOR j=1 TO 2*xsize*ysize/3:INCR PixelPtr:NEXT FOR j=2*xsize*ysize/3 TO xsize*ysize:soglia=soglia-.00008:CALL color2rgb(BYCOPY @PixelPtr,red,green,blue):@PixelPtr=RGB(red*soglia,green*soglia,blue*soglia):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 al_win/12:GRAPHIC LINE (0,j)-(la_win,j),RGB(2255/(j+6),1255/(j+6),1255/(j+6)):NEXT FOR j=11*al_win/12 TO al_win:GRAPHIC LINE (0,j)-(la_win,j),RGB(2255/(j-11*al_win/12+6),1255/(j-11*al_win/12+6),1255/(j-11*al_win/12+6)):NEXT GRAPHIC REDRAW END SUB '------------------------------------------------------------------------------ SUB caricaimmagine(nomefile AS STRING,id_bmp AS LONG) LOCAL ff,la,al AS LONG IF DIR$(nomefile)="" THEN GRAPHIC BITMAP NEW 150,98 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 GRAPHIC ATTACH id_bmp,0,REDRAW GRAPHIC COPY id_bmp,0 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 j,k,k1,k2,k3,ok1,ok2,ok3,y1,y2,y3,finale1,finale2,finale3,colore1,colore2,colore3 AS LONG %velocita=12 INCR iter RANDOMIZE TIMER 'randomizza la posizione iniziale del cilindro CALL muovi(id_cil1,hDlg1,RND(1,%figure)*af):CALL muovi(id_cil2,hDlg2,RND(1,%figure)*af):CALL muovi(id_cil3,hDlg3,RND(1,%figure)*af) 'questo crea errori 'k1=RND(1,%figure)*af*%figure:k2=RND(1,%figure)*af*%figure:k3=RND(1,%figure)*af*%figure 'questo non crea errori k1=RND(5,%figure)*af:k2=RND(5,%figure)*af:k3=RND(5,%figure)*af k=MAX(k1,k2,k3) FOR j=1 TO k IF k1=>1 THEN y1=1+k1\%velocita:CALL muovi(id_cil1,hDlg1,y1):ok1=ok1+y1:k1=k1-y1 ELSE finale1=1 IF k2=>1 THEN y2=1+k2\%velocita:CALL muovi(id_cil2,hDlg2,y2):ok2=ok2+y2:k2=k2-y2 ELSE finale2=1 IF k3=>1 THEN y3=1+k3\%velocita:CALL muovi(id_cil3,hDlg3,y3):ok3=ok3+y3:k3=k3-y3 ELSE finale3=1 'removed IF INKEY$>"" THEN EXIT SUB SLEEP 10 IF finale1+finale2+finale3=3 THEN EXIT FOR NEXT GRAPHIC ATTACH hDlg1,0,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore1 GRAPHIC ATTACH hDlg2,0,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore2 GRAPHIC ATTACH hDlg3,0,REDRAW:GRAPHIC GET PIXEL (1,1+af) TO colore3 CALL esaminavincite(colore1,colore2,colore3) 'scrive nei bordi CALL scrivi(hDlg1,"<space> play",-20) CALL scrivi(hDlg2,"<c> continuo",-20) CALL scrivi(hDlg3,"<esc> end",-20) CALL scrivi(hDlg2,"Giocate"+STR$(iter)+"",5) CALL scrivi(hDlg3,USING$("## ",colore1,colore2,colore3)+" (rullo"+STR$(%figure)+")",5) END SUB '------------------------------------------------------------------------------ SUB esaminavincite(c1 AS LONG,c2 AS LONG,c3 AS LONG) STATIC vincita AS LONG IF c1=c2 AND c2=c3 THEN vincita=vincita+10:CALL scrivi(hDlg1,"Saldo "+STR$(vincita)+"$",5):EXIT SUB IF c1=c2 THEN vincita=vincita+2:CALL scrivi(hDlg1,"Saldo "+STR$(vincita)+"$",5):EXIT SUB IF c1=c3 THEN vincita=vincita+2:CALL scrivi(hDlg1,"Saldo "+STR$(vincita)+"$",5):EXIT SUB IF c2=c3 THEN vincita=vincita+2:CALL scrivi(hDlg1,"Saldo "+STR$(vincita)+"$",5):EXIT SUB vincita=vincita-1 CALL scrivi(hDlg1,"Saldo "+STR$(vincita)+"$",5) END SUB '------------------------------------------------------------------------------ SUB scrivi(hDlg AS LONG,testo AS STRING,posizione AS LONG) LOCAL la,al,l,a AS LONG GRAPHIC ATTACH hDlg,0,REDRAW GRAPHIC GET CLIENT TO la,al GRAPHIC TEXT SIZE testo TO l,a IF posizione<0 THEN posizione=al+posizione GRAPHIC SET POS((la-l)/2,posizione) GRAPHIC COLOR %WHITE,-2 GRAPHIC FONT "arial",10,1 GRAPHIC PRINT testo GRAPHIC REDRAW END SUB '------------------------------------------------------------------------------