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)
http://www.alldev.be/ALLDEV_WEB/TUTO/Puis4/Main.zip
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