Puissance 4

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Puissance 4

Message par microdevweb »

Bonjour à tous,

Voila le début d'un code pour un jeux puissance 4, je bloque un peux sur le gameLogic et y travaille (toute suggestion est d'ailleurs la bienvenue)

:arrow: http://www.alldev.be/ALLDEV_WEB/TUTO/Puis4/Main.zip

Image

Code : Tout sélectionner

;**********************************************************************************************************************************************
;Nom: Puissance 4
;Vers: 1.0
;© Microdevweb
;Description : Adaptation du jeux puissance 4
;**********************************************************************************************************************************************
;-* Inititialisation 
EnableExplicit
UsePNGImageDecoder()
RandomSeed(7)
;} FIN Inititialisation
;-* Constantes
;------- Form
Enumeration Form
      #MainForm
EndEnumeration
;------- Sprite
Enumeration Sprite
      #Sprite_Bas
      #Sprite_Haut
      #Sprite_pion_Rouge  
      #Sprite_pion_Jaune 
      #Sprite_Cursor
EndEnumeration
;------- Taille
#PawnWidth=95
#Velocity=10
;} FIN Constantes
;-* Structures
;-------- Pos
Structure Pos
      X.i
      Y.i
      W.i
      H.i
EndStructure
Structure Pawn
      ColumnNumber.i ;Le numéro de colonne
      LineNumber.i ;Le numéro de ligne
      Player.b ;Vrai si il s'agit d'un pion du joueur
      myPos.Pos;La position que devra avoir le pion
      Y.i ;La position réel du pion en Y pour l'animation
EndStructure
;} FIN Structures
;-* Variables globales
;------- Taille Ecran
Global gMainWidth=1024,gMainHeight=768
;------- Titre application
Global gTitle$="Puissance 4 vers 1.0"
;------- Evénement
Global gEvent
;------- La colonne survolée par la souris
Global gColumnOver
;------- Liste / Map
;La position du plateau de jeux
Global myPosGameArea.Pos
;La liste des pions
Global NewMap  myPawn.Pawn()
;Pour bloquer le jeux
Global gGameLocked.b=#False
;Pour savoir si c'est au tour de l'ordinateur
Global gComputerPlay.b=#False
;Pour connaitre la position de la suite de pion
Global gNuColumn,gNuLine
;} FIN Variables globales
;-* Déclaration
Declare AddPawn(Player.b=#True)
Declare TesteEmpty(Line,Column)
;} FIN déclaration
;-* Procédures
;-------- TestPawnX(Player.b,NumberPawn)
Procedure TestPawnX(Player.b,NumberPawn)
      Protected Line,Column,nbLine=6,nbColumn=7,Key$,Number
      For Line=1 To nbLine ;Pour toutes les lignes
            Number=0
            For Column=1 To nbColumn ;Pour toutes les colonnes
                  ;Génére la clé pour la map
                  Key$=Str(Line)+"\"+Str(Column)+"\"
                  ;Complète la clé en fonction de la recherche pour le joueur ou pas
                  If Player
                        Key$+"P"
                  Else
                        Key$+"C"
                  EndIf
                  If FindMapElement(myPawn(),Key$)<>0
                        Number+1
                  Else
                        Number=0
                  EndIf
                  ;Si égale à séquence recherchée
                  If Number=NumberPawn
                        ;Si sur la première ligne
                        If Line=1
                              ;Regarde si case libre à gauche
                              If Column-NumberPawn>NumberPawn
                                    If TesteEmpty(Line,Column-NumberPawn)
                                          gColumnOver=Column-NumberPawn
                                          AddPawn(#False)
                                          ProcedureReturn #True
                                    EndIf
                              EndIf
                              ;Regarde si case libre à droite
                              If Column<nbColumn
                                    If TesteEmpty(Line,Column+1)
                                          gColumnOver=Column+1
                                          AddPawn(#False)
                                          ProcedureReturn #True
                                    EndIf
                              EndIf
                        Else
                              ;Regarde si case libre à gauche
                              If Column>NumberPawn
                                    ;Teste qu'il y un pion sous la case
                                    If Not TesteEmpty(Line-1,Column-NumberPawn)
                                          If TesteEmpty(Line,Column-NumberPawn)
                                                gColumnOver=Column-NumberPawn
                                                AddPawn(#False)
                                                ProcedureReturn #True
                                          EndIf
                                    EndIf
                              EndIf 
                              ;Regarde si case libre à droite
                              If Column<nbColumn
                                    If Not TesteEmpty(Line-1,Column-NumberPawn)
                                          If TesteEmpty(Line,Column-NumberPawn)
                                                gColumnOver=Column+1
                                                AddPawn(#False)
                                                ProcedureReturn #True
                                          EndIf
                                    EndIf
                              EndIf
                        EndIf
                  EndIf
            Next
      Next
      ProcedureReturn #False
EndProcedure
;-------- TestPawnY(Player.b,NumberPawn)
Procedure TestPawnY(Player.b,NumberPawn)
      Protected Line,Column,nbLine=6,nbColumn=7,Key$,Number
      For Column=1 To nbColumn
            Number=0
            For Line=1 To nbLine
                  Key$=Str(Line)+"\"+Str(Column)+"\"
                  If Player
                        Key$+"P"
                  Else
                        Key$+"C"
                  EndIf
                  If FindMapElement(myPawn(),Key$)<>0
                        Number+1    
                  Else
                        Number=0   
                  EndIf
                  If Number=NumberPawn
                        If TesteEmpty(Line+1,Column)
                              gColumnOver=Column
                              AddPawn(#False)
                              ProcedureReturn #True
                        EndIf
                  EndIf
            Next
      Next
      ProcedureReturn  #False
EndProcedure
;-------- TesteEmpty(Line,Column)
Procedure TesteEmpty(Line,Column)
      Protected Key$
      Key$=Str(Line)+"\"+Str(Column)+"\"
      If FindMapElement(myPawn(),Key$+"P")<>0
            ProcedureReturn #False
      EndIf
      If FindMapElement(myPawn(),Key$+"C")<>0
            ProcedureReturn #False
      EndIf
      ProcedureReturn #True
EndProcedure
;-------- PlayRandom()
Procedure PlayRandom()
      Protected Line,NbLine=6,Ok.b=#False,Column,Number,N
      For Line=1 To NbLine
            OK=#False 
            While OK=#False 
                  Column=Random(7,1)
                  If TesteEmpty(Line,Column):OK=#True:EndIf
                  Number=0
                  ;Teste pour voir si toutes la lignes est remplie
                  For N=1 To 7
                        If Not TesteEmpty(Line,N)
                              Number+1
                        EndIf
                  Next
                  If Number=7
                        OK=#True
                  EndIf
            Wend
            If OK=#True And Number<7 :Break :EndIf
      Next
      gColumnOver=Column
      AddPawn(#False)
EndProcedure
;--------- ComputerPlay()
Procedure ComputerPlay()
      ;O= pion X=case vide
      Protected Key$,N
      gComputerPlay=#False
      ;-* Blocage du joueur
      ;Teste 000 sur X
      If TestPawnX(#True,3):ProcedureReturn :EndIf
      ;Teste 000 sur Y
      If TestPawnY(#True,3):ProcedureReturn :EndIf
      ;} FIN Blocage du joueur
      ;-* Jeux de l'ordinateur
      ;Recherche séquence 000 en X
      If TestPawnX(#False,3) :ProcedureReturn :EndIf
      ;Recherche séquence 000 en Y
      If TestPawnY(#False,3) :ProcedureReturn :EndIf
      ;Recherche séquence 00 en X
      If TestPawnX(#False,2) :ProcedureReturn :EndIf
      ;Jeux aléatoir
      PlayRandom()
      ;} FIN Jeux de l'ordinateur
EndProcedure
;--------- DisplayPawn()
Procedure DisplayPawn()
      Protected PawnSprite
      ;Par défaut le jeux n'est pas bloquer
      gGameLocked=#False
      ForEach myPawn()
            With myPawn()
                  ;Détermine le sprite à utilisé si il s'agis du joueur ou pas
                  If \Player=#True
                        PawnSprite=#Sprite_pion_Rouge
                  Else
                        PawnSprite=#Sprite_pion_Jaune
                  EndIf
                  ;Affiche le pion
                  DisplayTransparentSprite(PawnSprite,\myPos\X,\Y)
                  ;Bouge le pion si nécessaire
                  If \myPos\Y>\Y
                        \Y+#Velocity
                        ;Bloquer le jeux pour laisser le temps à l'animation er permettre à l'ordinateur de jouer
                        gGameLocked=#True
                        If \y>\myPos\Y
                              \Y=\myPos\Y
                        EndIf
                  EndIf
            EndWith
      Next
EndProcedure
;--------- AddPawn()
Procedure AddPawn(Player.b=#True)
      Protected NumberPawn=0,Key$
      ;Le jeux est bloqué on sort ou L'ordinateur n'a pas encore jouer on sort
      If gGameLocked=#True Or gComputerPlay=#True :ProcedureReturn :EndIf
      ;Calcul du nombre de pions existants dans cette colonne
            ForEach myPawn()
                  If myPawn()\ColumnNumber=gColumnOver
                        NumberPawn+1
                  EndIf
            Next
            ;Ajout à la liste
            ;Calcul de la clé
            Key$=Str(NumberPawn+1)+"\"+Str(gColumnOver)+"\"
            If Player
                  Key$+"P"
            Else
                   Key$+"C"
             EndIf
      AddMapElement(myPawn(),Key$)
      With myPawn()
            ;Calcul de la position ou doit arriver le pion
            ;La position sur X (qui ne changera pas)
            Select gColumnOver
                  Case 1
                        \myPos\X=myPosGameArea\X+10
                  Case 2
                        \myPos\X=myPosGameArea\X+110
                  Case 3
                        \myPos\X=myPosGameArea\X+210
                  Case 4
                        \myPos\X=myPosGameArea\X+310
                  Case 5
                        \myPos\X=myPosGameArea\X+410
                  Case 6
                        \myPos\X=myPosGameArea\X+510
                  Case 7
                        \myPos\X=myPosGameArea\X+610
            EndSelect
            
            ;La position sur Y (on démare du bas)
            Select NumberPawn
                  Case 0
                         \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-115)
                  Case 1
                        \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-215)
                  Case 2
                        \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-315)
                  Case 3
                        \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-415)
                  Case 4
                        \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-515)
                  Case 5
                        \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-615)
                  Case 6
                        \myPos\Y=((myPosGameArea\Y+myPosGameArea\H)-715)
            EndSelect
           
            ;Le numéro de ligne
            \LineNumber=NumberPawn+1
            ;Le numéro de colonne
            \ColumnNumber=gColumnOver
            ;C'est un pion au joueur
            \Player=Player
            ;On démare le pion en Haut
            \Y=myPosGameArea\Y
      EndWith
      ;Si c'est le player qui ajoute pion on signale que c'est à l'ordi de jouer
      If Player=#True
            gComputerPlay=#True
      Else
            gComputerPlay=#False
      EndIf
EndProcedure
;--------- DisplayCursor()
Procedure DisplayCursor()
      Protected X,N,W_Column,margin=15
      ;Regarde si on est sur le plateau de jeux et sur quel colonne
      With myPosGameArea
            ;Si le jeux est bloqué
            If gGameLocked=#True Or gComputerPlay=#True
                  ClipSprite(#Sprite_Cursor,0,0,64,64) ; le sprite interdit
                  ;Affiche le sprite à la position de la souris
                  DisplayTransparentSprite(#Sprite_Cursor,MouseX(),MouseY())
                  ProcedureReturn 
            EndIf
            ;la largeur d'une colonne
            W_Column=80
            ;Par défaut on est pas sur une colonne
            gColumnOver=-1
            ;Vérifie la position sur l'axe Y
            If MouseY()>=\Y And MouseY()<=(\Y+\H)
                  ;Teste les 7 colonnes dans un boucle
                  X=\X+margin
                  For N=1 To 7
                        If MouseX()>=X And MouseX()<=X+(W_Column-margin)
                              gColumnOver=N
                              Break
                        EndIf
                        X+(W_Column+margin)
                  Next
            EndIf
            ;Change le cursseur de la souris suivant que l'on est sur une colonne ou pas
            If gColumnOver>-1
                  ClipSprite(#Sprite_Cursor,64,0,64,64) ; Le sprite fleche verte
            Else
                  ClipSprite(#Sprite_Cursor,0,0,64,64) ; le sprite interdit
            EndIf
            ;Affiche le sprite à la position de la souris
            DisplayTransparentSprite(#Sprite_Cursor,MouseX(),MouseY())
      EndWith
EndProcedure
;--------- OpenMainForm()
Procedure OpenMainForm()
      ;{ Initialisation des différents moteurs
      ;{              Initialisation du moteur de sprite
      If InitSprite()=0
            MessageRequester(gTitle$,"Impossible d'initialisé le moteur de sprite...")
            End
      EndIf
      ;}               FIN Initialisation du moteur de sprite
      ;{               Initialisation du moteur de sond
      If InitSound()=0
            MessageRequester(gTitle$,"Impossible d'initialisé le moteur de sond...")
            End
      EndIf
      ;}              FIN Initialisation du moteur de sond
       ;{               Initialisation du moteur de souris
      If InitMouse()=0
            MessageRequester(gTitle$,"Impossible d'initialisé le moteur de souris...")
            End
      EndIf
      ;}              FIN Initialisation du moteur de souris
       ;{               Initialisation du moteur de clavier
      If InitKeyboard()=0
            MessageRequester(gTitle$,"Impossible d'initialisé le moteur de clavier...")
            End
      EndIf
      ;}        
      ;} FIN Initialisation des différents moteurs
      Protected Flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
      If OpenWindow(#MainForm,0,0,gMainWidth,gMainHeight,gTitle$,Flag)
            If Not OpenWindowedScreen(WindowID(#MainForm),0,0,gMainWidth,gMainHeight)
                  MessageRequester(gTitle$,"Impossible d'ouvrir l'écran de jeux...")
                  End
            EndIf
      Else
            MessageRequester(gTitle$,"Impossible d'ouvrir la fenêtre...")
            End
      EndIf
      ;-* Load Sprite
      ; Le bas du plateau de jeux
      CatchSprite(#Sprite_Bas,?Bas,#PB_Sprite_AlphaBlending)
      ; Le haut du plateau de jeux
      CatchSprite(#Sprite_Haut,?Haut,#PB_Sprite_AlphaBlending)
      ; Le pion rouge
      CatchSprite(#Sprite_pion_Rouge,?Pion_Rouge,#PB_Sprite_AlphaBlending)
      ; Le pion jaune
      CatchSprite(#Sprite_pion_Jaune,?Pion_Jaune,#PB_Sprite_AlphaBlending)
      ; Les curseur de la souris
      CatchSprite(#Sprite_Cursor,?Cursor,#PB_Sprite_AlphaBlending)
      ;} Fin Sprite
      ;Calcul de la position central du plateau de jeux
      With myPosGameArea
            \W=SpriteWidth(#Sprite_Bas)
            \H=SpriteHeight(#Sprite_Bas)
            \X=(gMainWidth/2)-(\W/2)
            \Y=(gMainHeight/2)-(\H/2)
      EndWith
EndProcedure
;--------- UpdateGame()
Procedure UpdateGame()
      With myPosGameArea 
            ;Affiche le bas du plateau
            DisplaySprite(#Sprite_Bas,\X,\Y)
            ;Affiche les pions
            DisplayPawn()
            ;Affiche le haut du plateau
            DisplayTransparentSprite(#Sprite_Haut,\X,\Y)
            ;Affiche le curseur de la souris
            DisplayCursor()
            ;si le jeux n'est pas bloquer (pour l'animation) et l'ordinateur n'a pas encore jouer
            If gGameLocked=#False And gComputerPlay=#True
                  ComputerPlay()
            EndIf
      EndWith
EndProcedure
;} FIN Procédures
;-* Start Game
OpenMainForm()
;} FIN Start Game
;-* Boucle Evenementiele
Repeat
      ;{ Boucle pour la fenêtre
      Repeat
            gEvent=WindowEvent()
            ;Fin du jeux si l'utilisateur ferme la fenêtre
            If gEvent=#PB_Event_CloseWindow:End:EndIf
      Until gEvent=0
      ;} FIN Boucle pour la fenêtre
      FlipBuffers() ;Inverse les buffers
      ClearScreen(RGB(0,0,0)) ; Efface l'air de jeux avec un écran noir
      ExamineKeyboard()  ;Lit les événement clavier 
      ExamineMouse()     ;Lit les événement souris
      UpdateGame()       ; Mise à jour du jeux
      ;Si le joueur est sur une colonne et fait un clique gauche
      If gColumnOver<>-1 And MouseButton(#PB_MouseButton_Left)
            ;Ajoute le pion
            AddPawn()
            Delay(50)
      EndIf
;Fin du jeux si l'utilisateur tape Esc      
Until KeyboardPushed(#PB_Key_Escape) 
;} FIN Boucle Evenementiele
;-* Data Section
DataSection
      Haut:
      IncludeBinary "Image\Haut.png"
      Bas:
      IncludeBinary "Image\Bas.png"
      Pion_Rouge:
      IncludeBinary "Image\Pion_rouge.png"
      Pion_Jaune:
      IncludeBinary "Image\Pion_jaune.png"
      Cursor:
      IncludeBinary "Image\Cursor.png"
EndDataSection
;} FIN Data Section
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Puissance 4

Message par Kwai chang caine »

En tout cas super debut, je le trouve super beau 8O 8)
Ca tombe bien j'en ai jamais eu à noel :cry:
Merci MicroDevWeb 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Puissance 4

Message par Lord Nelson »

Salut, bien jouer :)

Code : Tout sélectionner

Ca tombe bien j'en ai jamais eu à noel :cry:
KCC tu sais que t'es grave quand tu t'y met :mrgreen:
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Puissance 4

Message par Micheao »

merci microdevweb
quand j’étais jeune j'ai eu un puissance 4 à noel mais c'est la première que je joue à Puissance 4 sur un pc
tu as fait du très bon boulot , je te félicite :D
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Puissance 4

Message par venom »

Simple, efficace bravo.
Bonne continuation.





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
wkoinnen
Messages : 4
Inscription : jeu. 11/déc./2014 3:08

Re: Puissance 4

Message par wkoinnen »

merci microdevweb. Meme si c'est un peu difficile pour moi. :P :P :P coque samsung galaxy A5 housse galaxy A5
Dernière modification par wkoinnen le mer. 17/déc./2014 2:46, modifié 1 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Puissance 4

Message par microdevweb »

Merci à tous,

wkoinnen si à des questions n'hésite pas à demander
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Linda13
Messages : 3
Inscription : mar. 13/janv./2015 7:25

Re: Puissance 4

Message par Linda13 »

merci microdevweb,bonne journée :D

-------------
housse samsung galaxy alpha
coque galaxy alpha
Dernière modification par Linda13 le dim. 18/janv./2015 8:54, modifié 1 fois.
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Puissance 4

Message par G-Rom »

Linda13 a écrit :merci microdevweb,bonne journée :D
Un nouveau type de bot ?
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: Puissance 4

Message par Mindphazer »

G-Rom a écrit :
Linda13 a écrit :merci microdevweb,bonne journée :D
Un nouveau type de bot ?
Un bot souriant, alors :mrgreen:
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Répondre