LA boule Infernal (demandé par studing)

Programmation avancée de jeux en PureBasic
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

LA boule Infernal (demandé par studing)

Message par nemerod »

voila pour studing, vue qu'il fais la version avec TypeScript, voila la version purebasic, j'ai pas ajouté le compteur de vie et pas de score mais le code est commenté pour les personne qui on envie de trituré le code ;)

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 Z et S
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
Dernière modification par nemerod le lun. 08/mai/2023 14:17, modifié 2 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: LA boule Infernal (demandé par studing)

Message par Ar-S »

Merci pour le partage. :wink:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: LA boule Infernal (demandé par studing)

Message par nemerod »

Ar-S a écrit : dim. 07/mai/2023 9:32 Merci pour le partage. :wink:
mais derien :)
je les fais vite fais pour qu'il poste par la suite la version avec typescripte :)

bah, tien en parlent du loup le voila
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: LA boule Infernal (demandé par studing)

Message par venom »

Bonjour,

Merci pour le code nemerod. 8)
Plus rapide que Studing ^^ :P procrastination je suppose






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: LA boule Infernal (demandé par studing)

Message par MLD »

Merci
J'en perd la boule.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: LA boule Infernal (demandé par studing)

Message par Fig »

Code : Tout sélectionner

[11:49:02] Waiting for executable to start...
[11:49:02] Executable type: Windows - x86  (32bit, Unicode)
[11:49:02] Executable started.
[11:49:04] [ERROR] Line: 53
[11:49:04] [ERROR] Invalid memory access. (read error at address 7084977)
:|

Sur PB32 bits, c'est surement la raison...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: LA boule Infernal (demandé par studing)

Message par nemerod »

Fig a écrit : lun. 08/mai/2023 10:50

Code : Tout sélectionner

[11:49:02] Waiting for executable to start...
[11:49:02] Executable type: Windows - x86  (32bit, Unicode)
[11:49:02] Executable started.
[11:49:04] [ERROR] Line: 53
[11:49:04] [ERROR] Invalid memory access. (read error at address 7084977)
:|

Sur PB32 bits, c'est surement la raison...
bon on va faire plus simple comme message, désolé le CMS du forum de purebasic

ne pas utilisé le 32 bit, des variable ne sont pas compatible avec le 32 bit car elle travaille en 64 bit et si meme les dernier version peuvent traité du 64 bit dans un programme 32 bit, il va avoir un problème quant plusieurs type donc du 64bit sont utilisé en meme temps et donc il va perde les pedal car il doit travaillé avec des valeur 32 bit, donc perde d'info ou corruption

j'ai fais une update du code pour pas que vous le lancé en 32 bit
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: LA boule Infernal (demandé par studing)

Message par SPH »

Merci pour ce jeu résumé en quelques lignes de coke... Heu, lignes de code, pardon :D

Ca aurait fait fureur il y a 40 ans sur un TO7 !!

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
threedslider
Messages : 452
Inscription : dim. 01/juil./2018 22:38

Re: LA boule Infernal (demandé par studing)

Message par threedslider »

Cool c'est bien ce jeu ! Je m'amuse bien et pas mal de graphisme on se croirait qu'on joue aux arcanes :mrgreen:

Merci pour le partage ;)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LA boule Infernal (demandé par studing)

Message par Kwai chang caine »

Rigolote cette petite boule :D
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre