
noté que je me suis limité a aucun canvas pour suivre l'idée orignal de studing qui est comme des tuile, donc aucun canvas global, juste des image en grille
noté qu'il y a pas de datasection pour ne pas inclut des sprite car trop facile, vue que le jeu d'origine est hyper simple niveau visuel et donc le code peu etre hyper optimisé mais aucun ligne assembleur et aucun appel a des API externe, seul des image dans un image gadget
UPDATE for 64bit only, raison = "des variable ne sont pas bien traité en 32 bit avec les dernier version ou vielle version"
Code : Tout sélectionner
;/////////////////////////////////////////////////////////////
;// _ _ ____ ___ _ _ _ _____ //
;// | | / \ | __ ) / _ \| | | | | | ____| //
;// | | / _ \ | _ \| | | | | | | | | _| //
;// | |___ / ___ \ | |_) | |_| | |_| | |___| |___ //
;// |_____/_/ \_\ |____/ \___/ \___/|_____|_____| //
;// ___ _ _ _____ _____ ____ _ _ _ _ _____ //
;// |_ _| \ | | ___| ____| _ \| \ | | / \ | | | ____| //
;// | || \| | |_ | _| | |_) | \| | / _ \ | | | _| //
;// | || |\ | _| | |___| _ <| |\ |/ ___ \| |___| |___ //
;// |___|_| \_|_| |_____|_| \_\_| \_/_/ \_\_____|_____| //
;// //
;//=========================================================//
;// //
;// Created in purebasic by Nemerod //
;// original idea by Studing //
;// original post from discord //
;// //
;//=========================================================//
;// //
;// This program work with 64 bit version //
;// Dont launche in 32bit //
;// //
;/////////////////////////////////////////////////////////////
Global eee,tin.q,*grid,g_din
Global qqx.q=015;taille de la grille, les valeur sont ensuit traité par un facteur x16 par la suite
Global qqy.q=025;
Global LBI_number_wall=7;total de mure pour le joeur
Global LBI_number_mine=7;total de piege
Global ppx.q=qqx>>1,tpx=ppx;position par defaut
Global ppy.q=qqy>>1,tpy=ppy;
Global ppa.q=0
Global pps.q=1
CompilerIf #PB_Processor_x64<>#PB_Compiler_Processor
MessageRequester("32 VS 64 bit","se programme utilise des variable et pointeur en 64 bit"+#CRLF$+"vous avais lancé se programme dans une version non prise en charge"+#CRLF$+#CRLF$+"merci de demandé a la personne qui vous a fais se programme de vous donné la version 64 bit"+#CRLF$+"si vous avais lancé se programme depuis le code source"+#CRLF$+"merci de bien vouloir passé sur la version 64 bit",$30):End
CompilerEndIf
*grid=AllocateMemory(qqx*qqy);internal grid of game
#LBI_NONE=$00;nothing ( DONT EDIT )
#LBI_OOBL=$01;out of bound limite
#LBI_MINE=$02;you dead with red
#LBI_WALL=$03;hit me
#LBI_BALL=$10;player
Procedure.q timer(i);4 octet compteur (ecri 0 = reset, 8 flag a 1, 3 octet disponible)
g_din=i
Repeat:Delay(g_din)
tin=((tin+1)&$ffffffff)|$ff00000000
Until eee=#PB_Event_CloseWindow
EndProcedure:CompilerIf #PB_Processor_x64<>#PB_Compiler_Processor:End:CompilerEndIf
Procedure LBI_NewMap(number_wall,number_mine)
ppa=0
temp=0
r0=qqx-1
r1=qqy-1
;generation de la map et vidage de la map si deja crée
For y = 0 To r1
For x = 0 To r0
PokeA(*grid+temp,#LBI_OOBL*Bool(((x*y)*((x-r0)*(y-r1)))=0))
If IsGadget(temp)=0
ImageGadget(temp,(x*16)+8,(y*16)+24,16,16,ImageID(PeekA(*grid+temp)))
Else
SetGadgetState(temp,ImageID(PeekA(*grid+temp)))
EndIf
temp+1
Next
Next
;creation des block de mur en premier
While number_wall>0
r0=Random(qqx-2)+1
r1=Random(qqy-2)+1
r2=0
For a = 1 To qqx-2
r2|PeekA(*grid+a+(r1*qqx));check si il y a de la place sur la ligne, retourne 0 si libre
Next
If PeekA(*grid+r0+(r1*(qqx)))=0 And r2=0 And ppy<>r1;on check si tous les condition sont bonne pour le place et que c'est pas la a position du joueur du moins sur la meme ligne
PokeA(*grid+r0+(r1*(qqx)),#LBI_WALL);grille interne
SetGadgetState(r0+(r1*qqx),ImageID(#LBI_WALL));affichage
number_wall-1
EndIf
Wend
;placement des mine a la fin
While number_mine>0
r0=Random(qqx-2)+1
r1=Random(qqy-2)+1
r2=0
For a = 1 To qqx-2
temp=PeekA(*grid+a+(r1*qqx))
r2|(Bool(temp<>0 And temp<>#LBI_WALL));check si il y a de la place sur la ligne, retourne 0 si libre avec possibilité d'avoir plusieur chose sur la meme ligne mais limité par type
Next
If PeekA(*grid+r0+(r1*(qqx)))=0 And r2=0 And ppy<>r1;on check si tous les condition sont bonne pour le place et que c'est pas la a position du joueur du moins sur la meme ligne
PokeA(*grid+r0+(r1*(qqx)),#LBI_MINE);grille interne
SetGadgetState(r0+(r1*qqx),ImageID(#LBI_MINE));affichage
number_mine-1
EndIf
Wend
EndProcedure:CompilerIf #PB_Processor_x64<>#PB_Compiler_Processor:End:CompilerEndIf
Procedure D_XOR(x,y,r0,r1):ProcedureReturn r0!r1:EndProcedure;operation XOR avancé car purebasic, voila pas ouf
Procedure D_SET(x,y,r0,r1):ProcedureReturn r0 :EndProcedure;operation dessin tous channel forcé
;dessin des tuile vide, peu etre utilisé pour crée un background
If CreateImage(#LBI_NONE,16,16,32,-1)=0 Or StartDrawing(ImageOutput(#LBI_NONE))=0:End:EndIf
DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@D_SET())
StopDrawing()
;dessin du block pour les limite
If CreateImage(#LBI_OOBL,16,16,32,-1)=0 Or StartDrawing(ImageOutput(#LBI_OOBL))=0:End:EndIf
DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@D_XOR())
Box(00,00,16,16,$ff00ff00):Box(02,02,12,12,$ff00ff00)
StopDrawing()
;dessin des mine depuis le jeu original XD :)
If CreateImage(#LBI_MINE,16,16,32,-1)=0 Or StartDrawing(ImageOutput(#LBI_MINE))=0:End:EndIf
DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@D_XOR())
Box(00,00,02,02,$ff0000ff);dot (miss drawing original 0,0 ?) ;remove me ?
Box(00,14,16,02,$ff0000ff);
Box(04,10,08,06,$ff0000ff);
Box(02,12,08,04,$ff0000ff);
Box(04,04,06,02,$ff0000ff);
Box(02,06,10,02,$ff0000ff);
Box(08,02,02,06,$ff0000ff);
Box(12,08,02,02,$ff0000ff);
Box(14,10,02,02,$ff0000ff);
StopDrawing()
;dessin du block MUR
If CreateImage(#LBI_WALL,16,16,32,-1)=0 Or StartDrawing(ImageOutput(#LBI_WALL))=0:End:EndIf
DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@D_SET())
Box(00,00,11,3,$ff00ffff):Box(12,00,04,3,$ff00ffff)
Box(05,04,11,3,$ff00ffff):Box(00,04,04,3,$ff00ffff)
Box(00,08,11,3,$ff00ffff):Box(12,08,04,3,$ff00ffff)
Box(05,12,11,3,$ff00ffff):Box(00,12,04,3,$ff00ffff)
StopDrawing()
;dessin de la balle
If CreateImage(#LBI_BALL,16,16,32,-1)=0 Or StartDrawing(ImageOutput(#LBI_BALL))=0:End:EndIf
DrawingMode(#PB_2DDrawing_CustomFilter):CustomFilterCallback(@D_SET())
Box(04,00,08,16,$ffff0080)
Box(02,02,12,12,$ffff0080)
Box(00,04,16,08,$ffff0080)
Box(02,06,02,04,$00000000)
Box(04,04,02,02,$00000000)
StopDrawing()
OpenWindow(0,0,0,(qqx*16)+16,(qqy*16)+32,"La Boule Infernale (Purebasic version)",#PB_Window_ScreenCentered):CompilerIf #PB_Processor_x64<>#PB_Compiler_Processor:End:CompilerEndIf
SetWindowColor(0,$ff000000);background color, affect every sprite with ALPHA enable
LBI_NewMap(LBI_number_wall,LBI_number_mine);creation de la Map
GLOBAL_SYSTEME_TIN=CreateThread(@timer() ,60);creation thread pour le timer
Repeat:eee=WindowEvent()
Select eee
Case $000;aucun event
If tin&$100000000:tin!$100000000;autorisation de rendu si le timer global l'autorise
If ppa<0:tpy-1:ppa+1:EndIf;déplacement vertical si bouton ou roulette souri utilisé de 1 cran par frame
If ppa>0:tpy+1:ppa-1:EndIf;
tpx=ppx+pps;deplacement sur l'axe X
If tpx <000:tpx=000:EndIf:If tpx=>qqx:tpx=qqx-1:EndIf;vrai limitation
If tpy <000:tpy=000:EndIf:If tpy=>qqy:tpy=qqy-1:EndIf;
Select PeekA(*grid+tpx+(tpy*qqx));pre-limitation des deplacement
Case #LBI_NONE
Case #LBI_WALL;on évite de gratté le block pour avoir du déplacement propre
tpy=ppy
Case #LBI_OOBL;on ne quite la zone si il y a rien apres la limite de la carte
tpy=ppy
Case #LBI_MINE;eviton l'instant gameover vertical
ppa=000
tpy=ppy
EndSelect
Select PeekA(*grid+tpx+(tpy*qqx));gameplay logic ici
Case #LBI_NONE
Case #LBI_WALL;kick du mur et changement de direction
SetGadgetState(tpx+(ppy*qqx),ImageID(#LBI_NONE))
PokeA(*grid+tpx+(ppy*qqx),#LBI_NONE)
tpx=ppx
pps!-2
Case #LBI_OOBL;changement de direction
tpx=ppx
pps!-2
Case #LBI_MINE;recreation de la map soft
LBI_NewMap(LBI_number_wall,LBI_number_mine)
EndSelect
If tpx<>ppx Or tpy<>ppy;update visuel des gadget requi
SetGadgetState(tpx+(tpy*qqx),ImageID(#LBI_BALL))
SetGadgetState(ppx+(ppy*qqx),ImageID(#LBI_NONE))
ppx=tpx;vrai postition depuis position de test
ppy=tpy
;detection victoir :)
temp=(qqx+1)*(qqy+1):r2=0
For a = 0 To temp
r2|Bool(PeekA(*grid+a)=#LBI_WALL)
Next
If r2=0:LBI_NewMap(LBI_number_wall,LBI_number_mine):EndIf
EndIf
Else
Delay(1)
EndIf
Case $20A:ppa-(1-(Bool(EventwParam()&$8000000)*2));roulette souri pour déplacement
Case $100;event au clavier en direct sans utilisé directX mais depuis les event ;)
Select EventwParam()
Case $26,$5A,$68:ppa-1;HAUT (flech, pavé numeric 8 et 2, lettre Z et S)
Case $28,$53,$62:ppa+1;BAS
Case $74;recreate new map debug with F5
LBI_NewMap(7,7)
Default;:Debug EventwParam()
EndSelect
Default
EndSelect
Until eee=#PB_Event_CloseWindow
Debug "Thank for play the game (ft. studing)"
Debug "created in purebasic by Nemerod"
Debug "original idea by studing"
Debug "original post from discord"
le jeu peu etre joué avec les bouton HAUT et BAS direction
le jeu peu etre joué avec les bouton 8 et 2 du pavé numerique vernum activé ou non
le jeu peu etre joué avec molette de la souri
vous pouvais changé le background color a la ligne 125 par défaut pour l'avoir avec une autre couleur
vous pouvais changé le total de block brick et mine et la taille de la grille via les valeur en début de code
ligne 2,3,4 et 5