Speed Tetris

Partagez votre expérience de PureBasic avec les autres utilisateurs.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Speed Tetris

Message par erix14 »

Bonjour,
je passe sur le forum chaque semaine, et ça fait pourtant plusieurs mois que je n'ai rien postés. Aujourd'hui je compte me rattraper, en vous offrant ce jeu. J'espère qu'il vous apportera quelque chose, aussi bien au niveau de la programmation qu'au niveau du divertissement.
J'attends vos chronos avec impatience, mon meilleur chrono et pour l'instant de deux minutes 35 secondes et 46 centièmes en mode sprint.

Code : Tout sélectionner

;/
;/                   -  Speed Tetris  - Programme Erix14 (2004)
;/                  Windows XP SP2 - PureBasic 3.91 - jaPBe 2.4.7.17
;/
#WindowWidth = 800
#WindowHeight = 600
Structure Classement
          Mode.b
          NomJoueur.b[16]
          Chrono.l
EndStructure
Enumeration
          #ElementVide
          #ElementVert
          #ElementRouge
          #ElementBleu
          #ElementMarron
          #ElementJaune 
          #ElementViolet
          #ElementGris
          #Image1
          #Image2
          #Image3
          #Image4
          #Image5
          #BkJeu
          #Jeu
          #BkFuturElement
          #Classement
          #Chrono
          #Perdu
          #CmptARebour
EndEnumeration
Enumeration
          #Window
          #NouvellePartie
          #Regle
          #Mode
          #Efface
          #Quitter
EndEnumeration
Global hWnd,NouvellePartie,ElementX,ElementY,Element,Rotation,Points,m_hMidiOut,m_MIDIOpen.b
Global StartChrono,StopChrono,FuturElement,Nom$,Mode
NewList ListeClassementSprint.Classement()
NewList ListeClassementEndurance.Classement()
Dim TableauJeu.b(10,17)
Dim Forme.l(7,4)
Forme(1,1)=%0100010001000100 : Forme(1,2)=%0000111100000000 : Forme(1,3)=%0100010001000100 : Forme(1,4)=%0000111100000000
Forme(2,1)=%0000011001100000 : Forme(2,2)=%0000011001100000 : Forme(2,3)=%0000011001100000 : Forme(2,4)=%0000011001100000
Forme(3,1)=%0110010001000000 : Forme(3,2)=%1110001000000000 : Forme(3,3)=%0010001001100000 : Forme(3,4)=%1000111000000000
Forme(4,1)=%1110010000000000 : Forme(4,2)=%0010011000100000 : Forme(4,3)=%0000010011100000 : Forme(4,4)=%1000110010000000
Forme(5,1)=%1100011000000000 : Forme(5,2)=%0100110010000000 : Forme(5,3)=%1100011000000000 : Forme(5,4)=%0100110010000000
Forme(6,1)=%0110110000000000 : Forme(6,2)=%1000110001000000 : Forme(6,3)=%0110110000000000 : Forme(6,4)=%1000110001000000
Forme(7,1)=%0110001000100000 : Forme(7,2)=%0010111000000000 : Forme(7,3)=%0100010001100000 : Forme(7,4)=%1110100000000000
Procedure.l BoutonImage(ImageIndex.l, longueur.l, hauteur.l, Texte.s)
          ImageID.l = CreateImage(ImageIndex, longueur, hauteur)
          a.f = 150 / hauteur
          StartDrawing(ImageOutput())
          For T = 0 To hauteur 
                    c = (hauteur-T)*a + 60
                    Line(0,T,longueur,0, RGB(0,c,0)) 
          Next
          DrawingMode(1)
          Locate(10, 2)
                    FrontColor(0,0,0)
          DrawText(Texte)
          StopDrawing()
          ProcedureReturn ImageID
EndProcedure
Procedure ElementImage(ImageIndex,r,g,b)
          CreateSprite(ImageIndex,30,30)
          StartDrawing(SpriteOutput(ImageIndex))
                    Box(1,1,28,28,RGB(r,g,b))
                    Line(0,0,29,0,RGB(r*1.5,g*1.5,b*1.5))
                    Line(0,0,0,29)
                    Line(0,29,29,0,RGB(r*0.4,g*0.4,b*0.4))
                    Line(29,0,0,29)
          StopDrawing() 
EndProcedure
Procedure.s StrChrono(Chro)
          m = Chro / 60000
          Chro = Chro % 60000
          s = Chro / 1000
          Chro = Chro % 1000
          c = Chro / 10
          ProcedureReturn RSet(Str(m),2,"0")+":"+RSet(Str(s),2,"0")+":"+RSet(Str(c),2,"0")
EndProcedure
Procedure AfficheJeu()
          For y=0 To 16
                    For x=0 To 9
                              If TableauJeu(x,y) > 0
                                        DisplaySprite(TableauJeu(x,y),10+x*30,10+y*30)
                              EndIf
                    Next
          Next
EndProcedure
Procedure AfficheElement()
          DisplaySprite(#Jeu,0,0)
          AfficheJeu()
          iPos = %1000000000000000
          iForme = Forme(Element,Rotation)
          For y=0 To 3
                    For x=0 To 3
                              If (iForme & iPos) > 0
                                        DisplaySprite(Element,10+x*30+ElementX*30,10+y*30+ElementY*30)
                              EndIf
                              iPos >> 1
                    Next
          Next
          FlipBuffers()
EndProcedure
Procedure Affiche_Chrono_Points()
          If NouvellePartie = 1 : StopChrono = GetTickCount_() : EndIf
          BKJeu_DC = StartDrawing(WindowOutput())
                    DrawImage(UseImage(#Chrono),35,210)
                    DrawingMode(1)
                    DrawingFont(LoadFont(0,"Times New Roman",20,#PB_Font_Bold))
                    FrontColor(32,32,32)
                    Locate(59,254) : DrawText(StrChrono(StopChrono - StartChrono));Affiche le Chrono
                    l = (110 - TextLength(Str(Points))) / 2
                    Locate(55+l,345) : DrawText(Str(Points));Affiche les points de partie en cour
          StopDrawing()
EndProcedure
Procedure Box3D(x,y,longueur,hauteur)
          Line(x,y,longueur,0,$FFFFFF)
          Line(x,y,0,hauteur)
          Line(x,y+hauteur,longueur,0,$000000)
          Line(x+longueur,y,0,hauteur+1)
EndProcedure
Procedure Box3DI(x,y,longueur,hauteur)
          Line(x,y,longueur,0,$000000)
          Line(x,y,0,hauteur)
          Line(x,y+hauteur,longueur,0,$FFFFFF)
          Line(x+longueur,y,0,hauteur+1)
EndProcedure
Procedure PlaqueMetal(x,y,longueur,hauteur)
          Box3D(x,y,longueur,hauteur)
          Box3D(x+4,y+4,3,3)
          Box3D(x+4,y+hauteur-7,3,3)
          Box3D(x+longueur-7,y+4,3,3)
          Box3D(x+longueur-7,y+hauteur-7,3,3)
EndProcedure
Procedure AfficheFuturElement()
          iPos = %1000000000000000
          iForme = Forme(FuturElement,Rotation)
          StartDrawing(WindowOutput())
          DrawImage(UseImage(#BkFuturElement),80,450)
          For y=0 To 3
                    For x=0 To 3
                              If (iForme & iPos) > 0
                                        Box(80+x*20,450+y*20,19,19,RGB(128,128,200))
                                        Box3D(80+x*20,450+y*20,19,19)
                              EndIf
                              iPos >> 1
                    Next
          Next
          StopDrawing()
EndProcedure
Procedure.b Collision(eX,eY)
          iPos = %1000000000000000
          iForme = Forme(Element,Rotation)
          For y=0 To 3
                    For x=0 To 3
                              If ((eX + x) > 9 Or (eX + x) < 0) And (iForme & iPos) > 0
                                        ProcedureReturn 1
                              ElseIf (eY + y) > 16 And (iForme & iPos) > 0
                                        ProcedureReturn 1
                              ElseIf (iForme & iPos) > 0 And TableauJeu(eX+x,eY+y) > 0
                                        ProcedureReturn 1
                              EndIf
                              iPos >> 1
                    Next
          Next
          ProcedureReturn 0
EndProcedure
Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
          dwFlags.l = nStatus | nCanal | (nData1 << 8) | (nData2 << 16)
          temp.l = midiOutShortMsg_(m_hMidiOut,dwFlags);
          If temp<>0 
                    MessageRequester("Problème", "Erreur dans l'envoi du message MIDI",0)
          EndIf
EndProcedure
Procedure MIDIOpen()
          If m_MIDIOpen = 0
                    If midiOutOpen_(@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0 
                              MessageRequester("Problème", "Impossible d'ouvrir le périphérique MIDI",0)
                    Else
                              SendMIDIMessage($C0,0,0,0)
                              m_MIDIOpen = 1
                    EndIf
          EndIf
EndProcedure
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
          If m_MIDIOpen
                    SendMIDIMessage($80 | Canal,0,Note,VelociteDown)
                    SendMIDIMessage($90 | Canal,0,Note,VelociteUp)
          EndIf          
EndProcedure
Procedure ChargeInstrument(Canal.b,Instrument.b)
          If m_MIDIOpen
                    SendMIDIMessage($C0 | Canal,0,Instrument,0)
          EndIf          
EndProcedure
Procedure AfficheClassement()
          StartDrawing(WindowOutput()) 
          DrawImage(UseImage(#Classement),540,60)
          DrawingFont(LoadFont(0,"Arial",12,#PB_Font_Bold))
          DrawingMode(1) : FrontColor(32,32,32) : T = 0
          If Mode
                    ForEach ListeClassementEndurance()
                              Locate(555,120+T*20) : DrawText(RSet(Str(T+1),2,"0"))
                              NomJ.s = "" : For c=0 To 15 : NomJ + Chr(ListeClassementEndurance()\NomJoueur[c])
                              If TextLength(NomJ) > 80 : Break : EndIf :Next
                    Locate(585,120+T*20) : DrawText(NomJ)
                              Locate(680,120+T*20) : DrawText(StrChrono(ListeClassementEndurance()\Chrono))
                              T + 1
                    Next
          Else
                    ForEach ListeClassementSprint()
                              Locate(555,120+T*20) : DrawText(RSet(Str(T+1),2,"0"))
                              NomJ.s = "" : For c=0 To 15 : NomJ + Chr(ListeClassementSprint()\NomJoueur[c])
                              If TextLength(NomJ) > 80 : Break : EndIf :Next
                              Locate(585,120+T*20) : DrawText(NomJ)
                              Locate(680,120+T*20) : DrawText(StrChrono(ListeClassementSprint()\Chrono))
                              T + 1
                    Next
          EndIf
          FrontColor(64,32,32)
          If Mode : Locate(590,527) : DrawText("Mode endurance")
          Else : Locate(605,527) : DrawText("Mode sprint")
          EndIf
          StopDrawing()
EndProcedure
Procedure ChargeClassement()
          ClearList(ListeClassementSprint()) 
          ClearList(ListeClassementEndurance()) 
          iFichier = ReadFile(#PB_Any,"c:\SpeedTetris.dat")
          If iFichier 
                    While Eof(iFichier) = 0
                              ReadData(@ListeClassement.Classement,SizeOf(Classement))
                              If ListeClassement\Mode
                                        AddElement(ListeClassementEndurance())
                                        ListeClassementEndurance()\Mode = ListeClassement\Mode
                                        For c=0 To 15 : ListeClassementEndurance()\NomJoueur[c] = ListeClassement\NomJoueur[c] : Next
                                        ListeClassementEndurance()\Chrono = ListeClassement\Chrono
                              Else
                                        AddElement(ListeClassementSprint())
                                        ListeClassementSprint()\Mode = ListeClassement\Mode
                                        For c=0 To 15 : ListeClassementSprint()\NomJoueur[c] = ListeClassement\NomJoueur[c] : Next
                                        ListeClassementSprint()\Chrono = ListeClassement\Chrono
                              EndIf
                    Wend
                    CloseFile(iFichier)
          EndIf
EndProcedure
Procedure SauveClassement()
          iFichier = CreateFile(#PB_Any,"c:\SpeedTetris.dat")
          If iFichier 
                    ForEach ListeClassementSprint()
                              WriteData(@ListeClassementSprint(),SizeOf(Classement))
                    Next
                    ForEach ListeClassementEndurance()
                              WriteData(@ListeClassementEndurance(),SizeOf(Classement))
                    Next
                    CloseFile(iFichier)
          EndIf
EndProcedure
Procedure FinDeLaPartie()
          StopChrono = GetTickCount_()
          NouvellePartie = 0
          Chrono = StopChrono - StartChrono
          iPlace = 0
          If Mode
                    ForEach ListeClassementEndurance()
                              If Chrono <= ListeClassementEndurance()\Chrono
                                        Break
                              EndIf
                              iPlace + 1
                    Next
                    If iPlace > 18 : ProcedureReturn : EndIf
                    Nom$ = InputRequester("Bravo, tu es le N° "+Str(iPlace+1),"Entre ton nom :",Nom$)
                    SelectElement(ListeClassementEndurance(),iPlace)
                    If iPlace = CountList(ListeClassementEndurance())
                              AddElement(ListeClassementEndurance())
                    Else
                              InsertElement(ListeClassementEndurance())
                    EndIf
                    For c=0 To 15 : ListeClassementEndurance()\NomJoueur[c] = Asc(Mid(Nom$,c+1,1)) : Next
                    ListeClassementEndurance()\Mode = Mode
                    ListeClassementEndurance()\Chrono = Chrono
                    If CountList(ListeClassementEndurance()) > 19
                              LastElement(ListeClassementEndurance())
                              DeleteElement(ListeClassementEndurance())
                    EndIf
          Else
                    ForEach ListeClassementSprint()
                              If Chrono <= ListeClassementSprint()\Chrono
                                        Break
                              EndIf
                              iPlace + 1
                    Next
                    If iPlace > 18 : ProcedureReturn : EndIf
                    Nom$ = InputRequester("Bravo, tu es le N° "+Str(iPlace+1),"Entre ton nom :",Nom$)
                    SelectElement(ListeClassementSprint(),iPlace)
                    If iPlace = CountList(ListeClassementSprint())
                              AddElement(ListeClassementSprint())
                    Else
                              InsertElement(ListeClassementSprint())
                    EndIf
                    For c=0 To 15 : ListeClassementSprint()\NomJoueur[c] = Asc(Mid(Nom$,c+1,1)) : Next
                    ListeClassementSprint()\Mode = Mode
                    ListeClassementSprint()\Chrono = Chrono
                    If CountList(ListeClassementSprint()) > 19
                              LastElement(ListeClassementSprint())
                              DeleteElement(ListeClassementSprint())
                    EndIf
          EndIf
          SauveClassement()
EndProcedure
Procedure MemorisePosition()
          iPos = %1000000000000000
          iForme = Forme(Element,Rotation)
          For y=0 To 3
                    For x=0 To 3
                              If (iForme & iPos) > 0
                                        TableauJeu(ElementX+x,ElementY+y) = Element
                              EndIf
                              iPos >> 1
                    Next
          Next
          PlayNoteMIDI(0,64,127,127)
          NbLigne = 0
          For y=0 To 16
                    Ligne = 0
                    For x=0 To 9
                              If TableauJeu(x,y) > 0
                                        Ligne + 1
                              EndIf
                    Next
                    If Ligne = 10
                              For xx=0 To 9
                                        For yy=y To 1 Step -1
                                                  TableauJeu(xx,yy) = TableauJeu(xx,yy-1)
                                        Next
                                        TableauJeu(xx,0) = 0
                              Next
                              DisplaySprite(#Jeu,0,0)
                              AfficheJeu()
                              FlipBuffers()
                              NbLigne + 1
                              Points + 5 + NbLigne*5
                              Affiche_Chrono_Points()
                              PlayNoteMIDI(1,64,127,127)
                              If Points >= 500 And Mode = 0
                                        FinDeLaPartie()
                                        ProcedureReturn
                              EndIf
                              If Points >= 5000 And Mode = 1
                                        FinDeLaPartie()
                                        ProcedureReturn
                              EndIf
                              Delay(100)
                    EndIf
          Next
          Element = FuturElement
          x = Random(6)+1
          While x = FuturElement
                    x = Random(6)+1
          Wend
          FuturElement = x
          Rotation = 1
          ElementX = 5
          ElementY = 0
          If Collision(ElementX,ElementY) > 0
                    NouvellePartie = 0
                    PlayNoteMIDI(1,80,127,127)
                    DisplaySprite(#Jeu,0,0)
                    AfficheJeu()
                    DisplayTransparentSprite(#Perdu,20,200)
                    FlipBuffers()
          Else
                    AfficheElement()
                    AfficheFuturElement()
          EndIf
EndProcedure
Procedure LanceNouvellePartie()
          Element = Random(6)+1
          x = Random(6)+1
          While x = Element
                    x = Random(6)+1
          Wend
          FuturElement = x
          Rotation = 1
          ElementX = 4
          ElementY = 0
          Points = 0
          Chrono = 0
          For y=0 To 16
                    For x=0 To 9
                              TableauJeu(x,y) = 0
                    Next
          Next
          StopChrono = StartChrono
          Affiche_Chrono_Points()
          For T=4 To 0 Step -1
                    PlayNoteMIDI(1,64,127,127)
                    DisplaySprite(#Jeu,0,0)
                    DisplayTransparentSprite(#CmptARebour+T,80,120)
                    FlipBuffers()
                    Delay(1000)
          Next
          PlayNoteMIDI(2,64,127,127)
          Delay(200)
          PlayNoteMIDI(2,69,127,127)
          Delay(200)
          DisplaySprite(#Jeu,0,0)
          AfficheElement()
          FlipBuffers()
          StartChrono = GetTickCount_()
          AfficheFuturElement()
          NouvellePartie = 1
EndProcedure
Procedure mycallback(WindowID, Message, lParam, wParam)
          result = #PB_ProcessPureBasicEvents
          Select Message
                    Case #WM_PAINT;        création de l'arrière plan de la fenêtre 
                              hRgnTitre = CreateRoundRectRgn_(0,0,#WindowWidth,50,50,50)
                              hRgn = CreateRoundRectRgn_(20,0,#WindowWidth-20,#WindowHeight,50,50)
                              CombineRgn_(hRgn, hRgn, hRgnTitre, #RGN_OR)
                              Hdc = GetDC_(hWnd)
                              ;         création de la première image
                              hSrcDC = CreateCompatibleDC_(Hdc)
                              hBmpSrc = CreateCompatibleBitmap_(Hdc,#WindowWidth,#WindowHeight)
                              SelectObject_(hSrcDC,hBmpSrc)
                              UseImage(#BkJeu)
                              BKJeu_DC = StartDrawing(ImageOutput()) 
                                        BitBlt_(hSrcDC,0,0,#WindowWidth,#WindowHeight,BKJeu_DC,0,0,#SRCCOPY)
                              StopDrawing() 
                              ;         création de la deuxième image
                              hDestDC = CreateCompatibleDC_(Hdc)
                              hBmpDest = CreateCompatibleBitmap_(Hdc,#WindowWidth,#WindowHeight)
                              SelectObject_(hDestDC,hBmpDest)
                              brush = CreateSolidBrush_($FFFFFF)
                              SelectObject_(hDestDC,brush)
                              pen = CreatePen_(0,4,RGB(0,0,0))
                              SelectObject_(hDestDC,pen)
                              RoundRect_(hDestDC,21,1,#WindowWidth-21,#WindowHeight-1,48,48)
                              RoundRect_(hDestDC,1,1,#WindowWidth-1,48,48,48)
                              ;         synthèse des deux images
                              BitBlt_(hDestDC,0,0,#WindowWidth,#WindowHeight,hSrcDC,0,0,#SRCAND)
                              ;         on affecte l'arrière plan à la fenêtre
                              hBrush = CreatePatternBrush_(hBmpDest)
                              SetClassLong_(hWnd,#GCL_HBRBACKGROUND, hBrush)
                              InvalidateRect_(hWnd,#Null, #True)
                              SetWindowRgn_(hWnd, hRgn, #True)
                              DeleteObject_(hRgn)
                              DeleteObject_(hRgnTitre)
                              DeleteObject_(hSrcDC)
                              DeleteObject_(hDestDC)
                              DeleteObject_(hBmpSrc)
                              DeleteObject_(hBmpDest)
                              DeleteObject_(pen)
                              DeleteObject_(brush)
                              DeleteObject_(hBrush)
                              ReleaseDC_(hWnd,Hdc)
                              DeleteDC_(Hdc)
                              DisplaySprite(#Jeu,0,0)
                              AfficheJeu()
                              If NouvellePartie : AfficheElement() : EndIf
                              FlipBuffers()
                              AfficheClassement()
                              Affiche_Chrono_Points()
          EndSelect
          ProcedureReturn result
EndProcedure
;- Debut du Programme
If InitSprite() = 0 : End : EndIf
SystemPath.s=Space(255)
GetSystemDirectory_(SystemPath,255)
hWnd = OpenWindow(#Window, 0, 0, #WindowWidth, #WindowHeight, #PB_Window_BorderLess | #PB_Window_ScreenCentered, "SpeedTetris")
SendMessage_(hWnd,#wm_seticon,#False,ExtractIcon_(0,SystemPath+"\shell32.dll",130));      affecte un icon au programme
OpenWindowedScreen(hWnd, 200,55,320,535,0,0,0)
Timer = SetTimer_(hWnd, 0, 1000, 0)
ChargeClassement()
MIDIOpen()
ChargeInstrument(0,13)
ChargeInstrument(1,14)
ChargeInstrument(2,55)
;{/ Image du classement
CreateImage(#Classement, 220, 500)
StartDrawing(ImageOutput())
For y=0 To 500 Step 2
          For x=0 To 220
                    c = 150 + Random(30)
                    Plot(x,y,RGB(c,c,c))
          Next
          For x=0 To 220
                    c = 120 + Random(30)
                    Plot(x,y+1,RGB(c,c,c+30))
          Next
Next
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",18,#PB_Font_Bold))
FrontColor(50,50,50)
Locate(27,12) : DrawText("CLASSEMENT")
FrontColor(250,250,250)
Locate(25,10) : DrawText("CLASSEMENT")
PlaqueMetal(0,0,220,500)
PlaqueMetal(15,10,190,40)
PlaqueMetal(15,460,190,30)
StopDrawing();}
;{/ Image Chrono & Points
CreateImage(#Chrono, 150, 200)
StartDrawing(ImageOutput())
For y=0 To 200 Step 2
          For x=0 To 150
                    c = 150 + Random(30)
                    Plot(x,y,RGB(c,c,c))
          Next
          For x=0 To 150
                    c = 120 + Random(30)
                    Plot(x,y+1,RGB(c,c,c+30))
          Next
Next
PlaqueMetal(0,0,150,200)
PlaqueMetal(10,30,130,60)
Box(20,40,110,40,RGB(100,160,100))
Box3DI(20,40,110,40)
PlaqueMetal(10,120,130,60)
Box(20,130,110,40,RGB(100,160,100))
Box3DI(20,130,110,40)
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",12))
FrontColor(50,50,50)
Locate(52,7) : DrawText("Chrono")
Locate(52,97) : DrawText("Points")
FrontColor(250,250,250)
Locate(50,5) : DrawText("Chrono")
Locate(50,95) : DrawText("Points")
StopDrawing();}
;{/ image de fond principal
CreateImage(#BkJeu,#WindowWidth,#WindowHeight)
BKJeu_DC = StartDrawing(ImageOutput())
iCouleur.f = 150 / 45
For y = 1 To 45 : Line(0,y,#WindowWidth,0,RGB(64,100 + iCouleur*y,64)) : Next
For y=46 To #WindowHeight
          iCouleur.f = y * 150/#WindowHeight 
          Line(0,y,800,0,RGB(80-iCouleur/2,80-iCouleur/2,160-iCouleur))
Next
For y=46 To #WindowHeight Step 10 : Line(0,y,#WindowWidth,0,RGB(0,0,0)) : Next
For y=0 To #WindowWidth Step 10 : Line(y,46,0,#WindowHeight,RGB(0,0,0)) : Next
DrawingMode(1)
DrawingFont(LoadFont(0,"Arial",24,#PB_Font_Bold))
FrontColor(32,32,32)
Locate(275,5) : DrawText("SPEED TETRIS");         Affiche l'ombre du Titre
FrontColor(255,255,0)
Locate(270,0) : DrawText("SPEED TETRIS");         Affiche le Titre
DrawingFont(LoadFont(0,"Comic Sans MS",12))
FrontColor(150,150,250)
Locate(580,565) : DrawText("Programme ERIX14")
DrawImage(UseImage(#Chrono),35,210)
DrawImage(UseImage(#Classement),540,60)
StopDrawing();}
;{/ Image Perdu
CreateSprite(#Perdu, 280, 80)
StartDrawing(SpriteOutput(#Perdu))
DrawingMode(1)
DrawingFont(LoadFont(0,"Comic Sans MS",64,#PB_Font_Bold))
FrontColor(32,32,32)
Locate(-2,-27) : DrawText("PERDU")
Locate(2,-27) : DrawText("PERDU")
Locate(-2,-23) : DrawText("PERDU")
Locate(2,-23) : DrawText("PERDU")
FrontColor(255,255,255)
Locate(0,-25) : DrawText("PERDU")
*Ptr.LONG = DrawingBuffer()
For y=0 To 79
          For x=0 To 279
                    If *Ptr\l > $202020 : *Ptr\l = $FFFF00-y*$300 : EndIf
                    *Ptr + 4
          Next
Next
StopDrawing();}
;{/ Images 5 4 3 2 1
For T = 0 To 4
          CreateSprite(#CmptARebour+T, 170, 256)
          StartDrawing(SpriteOutput(#CmptARebour+T))
          DrawingMode(1)
          DrawingFont(LoadFont(0,"Comic Sans MS",200,#PB_Font_Bold))
          FrontColor(32,32,32)
          Locate(0,-77) : DrawText(Str(T+1))
          Locate(4,-77) : DrawText(Str(T+1))
          Locate(0,-73) : DrawText(Str(T+1))
          Locate(4,-73) : DrawText(Str(T+1))
          FrontColor(255,255,255)
          Locate(2,-75) : DrawText(Str(T+1))
          *Ptr.LONG = DrawingBuffer()
          For y=0 To 255
                    For x=0 To 169
                              If *Ptr\l > $202020 : *Ptr\l = $FFFF00-y*$100 : EndIf
                              *Ptr + 4
                    Next
          Next
          StopDrawing()
Next;}
GrabImage(#BkJeu,#BkFuturElement,80,450,80,80)
;{/         création de l'aire de jeu
CreateSprite(#Jeu, 320, 535)
Jeu_DC = StartDrawing(SpriteOutput(#Jeu)) 
Box(0,0,320,535,$E0A0A0)
DrawingMode(1)
SetTextColor_(Jeu_DC,$F0B0B0)
Font = CreateFont_(24,0,300,0,#FW_BOLD,0,0,0,0,0,0,0,0,"Arial")
SelectObject_(Jeu_DC,Font)
For y=0 To 720 Step 60
          Locate(0,y)
          DrawText("SPEED TETRIS  SPEED TETRIS  SPEED")
          Locate(-30,y+48)
          DrawText("SPEED TETRIS  SPEED TETRIS  SPEED")
Next
Box3D(0,0,319,534)
Box3D(1,1,317,532)
DeleteObject_(Font)
StopDrawing();} 
;{/         création des Elements
ElementImage(#ElementVert,0,160,0)
ElementImage(#ElementRouge,160,0,0)
ElementImage(#ElementBleu,0,100,160)
ElementImage(#ElementMarron,128,64,0)
ElementImage(#ElementJaune,160,160,0)
ElementImage(#ElementViolet,128,0,160)
ElementImage(#ElementGris,64,64,64)
;}/
CreateGadgetList(hWnd)
ButtonImageGadget(#NouvellePartie, 40, 70, 140, 20, BoutonImage(#Image1,140,20,"Nouvelle partie"))
ButtonImageGadget(#Regle, 40, 95, 140, 20, BoutonImage(#Image2,140,20,"Règle du jeu"))
ButtonImageGadget(#Mode, 40, 120, 140, 20, BoutonImage(#Image3,140,20,"Mode de jeu"))
ButtonImageGadget(#Efface, 40, 145, 140, 20, BoutonImage(#Image4,140,20,"Efface classement"))
ButtonImageGadget(#Quitter, 40, 170, 140, 20, BoutonImage(#Image5,140,20,"Quitter"))
SetWindowCallback(@mycallback())
;- Boucle Principale
Repeat
          Select WaitWindowEvent()
                    Case #PB_EventGadget;{        Gestion des bouttons
                              Select EventGadgetID()
                                        Case #NouvellePartie
                                                  LanceNouvellePartie()
                                                  Affiche_Chrono_Points()
                                        Case #Efface
                                                  If Mode : ClearList(ListeClassementEndurance())
                                                  Else : ClearList(ListeClassementSprint())
                                                  EndIf
                                                  SauveClassement()
                                                  SendMessage_(hWnd,#WM_PAINT,0,0)
                                        Case #Regle
                                                  Texte.s = "       Il faut assembler des éléments formés de carrés,"+Chr(13)
                                                  Texte + "de telle façon à obtenir des lignes pleines. Chaque ligne"+Chr(13)
                                                  Texte + "pleine disparaît et vous donne des points :"+Chr(13)
                                                  Texte + "     - une ligne      10 points"+Chr(13)
                                                  Texte + "     - deux lignes   25 points"+Chr(13)
                                                  Texte + "     - trois lignes    45 points"+Chr(13)
                                                  Texte + "     - quatre lignes 70 points"+Chr(13)
                                                  Texte + "En mode sprint il faut obtenir 500 points."+Chr(13)
                                                  Texte + "En mode endurance il faut obtenir 5000 points."+Chr(13)
                                                  Texte + "Ceux qui auront fait cela le plus rapidement possible"+Chr(13)
                                                  Texte + "entreront dans le classement. Le but étant d'être"+Chr(13)
                                                  Texte + " le plus rapide..."+Chr(13)+Chr(13)
                                                  Texte + " - flèche haut      : rotation"+Chr(13)
                                                  Texte + " - flèche droite    : décalage à droite"+Chr(13)
                                                  Texte + " - flèche gauche  : décalage à gauche"+Chr(13)
                                                  Texte + " - flèche bas       : chute"+Chr(13)
                                                  If NouvellePartie = 0 : MessageRequester("Règle du jeu",Texte,#PB_MessageRequester_Ok) : EndIf
                                        Case #Mode
                                                  If Mode = 0 And NouvellePartie = 0: Mode =1
                                                  Else : Mode = 0
                                                  EndIf
                                                  AfficheClassement()
                                        Case #Quitter
                                                  End
                              EndSelect;}
                    Case #WM_TIMER;{    Timer une seconde
                              If NouvellePartie
                                        If Collision(ElementX,ElementY+1) : MemorisePosition()
                                        Else : ElementY + 1 : AfficheElement()
                                        EndIf
                                        Affiche_Chrono_Points()
                              EndIf;}
                    Case #WM_KEYDOWN;{  Commande clavier
                              If NouvellePartie
                                        Select EventwParam()
                                        Case 37
                                                  If Collision(ElementX-1,ElementY)=0 : ElementX - 1 : AfficheElement() : EndIf
                                        Case 39
                                                  If Collision(ElementX+1,ElementY)=0 : ElementX + 1 : AfficheElement() : EndIf
                                        Case 38
                                                  Rotation + 1
                                                  If Rotation > 4 : Rotation = 1 : EndIf
                                                  If Collision(ElementX,ElementY)
                                                            Rotation - 1
                                                            If Rotation < 1 : Rotation = 4 : EndIf
                                                  Else : AfficheElement()
                                                  EndIf
                                        Case 40
                                                  While Collision(ElementX,ElementY+1) = 0
                                                            ElementY + 1
                                                  Wend
                                                  MemorisePosition()
                                        EndSelect
                              EndIf;}
                    Case #WM_LBUTTONDOWN;{        Deplacement de la fenetre
                              my.l = WindowMouseY()
                              If my > 0 And my < 45
                                        SendMessage_(hWnd, #WM_NCLBUTTONDOWN, #HTCAPTION, NULL) 
                              EndIf;}
                    Case #PB_Event_CloseWindow: End
          EndSelect
ForEver
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Bravo 8O :D 8O :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

vraiment très bien. bravo :twisted:
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je suis impressionné par l'interface, je m'attendais pas à ce que ce soit si bien présenté.

:D
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Chapeau bas :D ! tres bon boulot je m'attendais pas a une tel finition !
A oui juste un truc si on passe sur une autre fenêtre et qu'on revient au jeu la fenêtre ne se rafraichit pas completement...
Mais bon c'est histoire de chipoter !! :roll:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

encore une fois je re-itère mon bravo...

pour pinailler aussi un peu,
une des règles du gameplay de tetris que j'aimerais voir incluse :

fleches vers le bas = descente accélérée de la pièce et non direct en bas
Image
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

8O Glaps vraiment impressionant (Aucun sprite et super bien presenter BRAVO) Bon boulot :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ouaip ! rien a dire , chui ecoeuré , je retourne aprendre !! :D
bravo ! du grand art ! :D
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D Oué dobro retourne nous faire un aussi beau jeux au lieu de peindre comme un malade (Meme si tes peinture sont du grand arts :lol: )
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Wow !! Rien à dire, c'est parfait.

Superbe travail.

A+
Guimauve
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Heuh, est-ce que c'est moi ou les scores ne sont pas sauvegardés correctement ? :?

A+
Guimauve
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

tout a été dit , bravo 8O
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

peut etre devrais-tu proposer à Fred de mettre un lien de ton jeu sur le site purebasic. un exemple probant des capacités de pure à mon avis.
Image
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ouaip et l'envoyer à codeFR :)
cookie
Messages : 71
Inscription : mar. 27/janv./2004 21:08
Contact :

Message par cookie »

impressionnant :10:
encore bravo :D
Cookie
Répondre