Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Une premiere version de puissance 4 | |
| | |
Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Une premiere version de puissance 4 Sam 24 Déc 2016 - 11:32 | |
| Bonjour, c'est les vacances. Pour ne pas perdre trop la main, j'ai fais une première version de puissance 4 J'aimerais y faire 2 changements si j'ai le temps et par intérêt: 1/ Récupérer le travail sur le serveur FTP pour faire une partie multijoueur (se connecter sur un serveur voir si quelqu'un attend un partenaire ou lancer une partie puis gérer les tours de jeu par échange de "messages" de façon invisible pour le joueur et une sécurité en cas de perte de connexion ou de temps trop long avec possibilité de pouvoir reprendre une partie dans ce cas (genre en stockant l'identifiant des joueurs)) 2/ Un vieux truc que j'aimerais faire mais que je n'ai jamais eu le courage d'attaquer: faire un mode contre l'ordinateur mais pas avec des coups aléatoires parmi les possibles mais via un calcul de plusieurs coups à l'avance pour voir si on peut gagner en un coup, 2 coups ou 3 coups tout en ne donnant pas à son adversaire la possibilité de le faire Après si l'un ou l'autre est mis en place, j'améliorerais sans doute les graphisme ou alors je n'en aurais pas le temps et ça en restera là. On verra bien. En tout cas joyeux Noël à tous. - Code:
-
' Puissance 4 version 1 (Simple) ' Mode 2 joueurs alternativement sur le même ordinateur ' Dessin simple sans animation
' Définir le type pour une case de la grille ' Case = 0 => ROUGE; 1 => JAUNE; 2 => VIDE DIM ROUGE% : ROUGE% = -1 DIM JAUNE% : JAUNE% = 1 DIM VIDE% : VIDE% = 0
' Définir la grille de jeu DIM NB_COLONNES% : NB_COLONNES% = 7 DIM NB_LIGNES% : NB_LIGNES% = 6 DIM NB_VIDES% : NB_VIDES% = NB_COLONNES% * NB_LIGNES%
' La grille de jeu avec une bordure supplémentaire DIM Grille%(NB_COLONNES%, NB_LIGNES%) DIM Colonnes%(NB_COLONNES%)
' Programmation du mode de debuggage DIM Debug% : Debug% = 0 : ' Mettre à 1 pour activer le mode debug DIM F_Debug% : F_Debug% = 1 DIM M_Debug%
' Tailles des éléments du jeu DIM Marge% : Marge% = 20 DIM Bordure% : Bordure% = 10 DIM Largeur_pion% : Largeur_pion% = 60
' Définition des numéro d'objet DIM N_Grille% : N_Grille% = 10
DIM Num%, Message$ DIM Tour%
LABEL Clic
Retourne_Dimension_Bandeau_Et_Bord() :' retourne bandeau%,bord% pour portabilité
INIT() AIDE() IF Debug% = 1 THEN CREER_FENETRE_DEBUG()
CREER_GRILLE() VIDER() SHOW 0 Tour% = JAUNE% : 2D_TARGET_IS 0 :Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) ON_CLICK N_Grille%,clic END
SUB CREER_GRILLE() DIM_LOCAL Decal_x,Decal_y, i%, j%, r PICTURE N_Grille% : LEFT N_Grille%, Marge% : TOP N_Grille%, Marge% WIDTH N_Grille%, Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) HEIGHT N_Grille%, Bordure% + NB_LIGNES% * (Largeur_pion% + Bordure%) COLOR N_Grille%,0,0,255 : 2D_FILL_COLOR 50,50,50 2D_TARGET_IS N_Grille% r = Largeur_pion% / 2 Decal_y = Bordure%
FOR i% = 1 TO NB_LIGNES% Decal_x = Bordure% FOR j% = 1 TO NB_COLONNES% 2D_CIRCLE Decal_x + r, Decal_y + r, r Decal_x = Decal_x + Largeur_pion% + Bordure% NEXT j% Decal_y = Decal_y + Largeur_pion% + Bordure% NEXT i% END_SUB
SUB INIT() DIM_LOCAL Largeur%, Hauteur%, ind% HIDE 0 Largeur% = Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% WIDTH 0, Largeur% Hauteur% = 2*Bordure% + (NB_LIGNES% + 1 ) * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% HEIGHT 0, Hauteur% + bandeau% CAPTION 0," P U I S S A N C E 4" ind% = 3 : ALPHA ind% : LEFT ind%, Marge% + 10 : TOP ind%, (NB_LIGNES%)* (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2 FONT_SIZE ind%,22 : FONT_NAME ind%,"Times New Roman" : CAPTION ind%,"C'est au tour de jouer de : " END_SUB
SUB VIDER() DIM_LOCAL i%, j% : ' parcourir les cases de la grille pour la vider FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = VIDE% NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = 0 NEXT j% END_SUB
SUB CREER_FENETRE_DEBUG() DIM_LOCAL i%,j%, ind% ind% = 200 FORM F_Debug% LEFT F_Debug%, WIDTH(0) +50 CAPTION F_Debug%,"Debug" M_Debug% = ind% ALPHA ind% : PARENT ind%, F_Debug% LEFT ind%, 10 : WIDTH ind%, WIDTH(F_Debug%) - 20 TOP ind%, 10 END_SUB
rem ====================================' détection des dimensions de la fenêtre SUB Retourne_Dimension_Bandeau_Et_Bord() ' controle de la position de la procédure dans le programme IF NUMBER_OBJECTS>0 MESSAGE "La SUB 'Retourne_Dimension_Bandeau_Et_Bord' doit être placée avant la création du premier objet !" TERMINATE END_IF ' création des VARIABLES GLOBALES IF VARIABLE("bandeau%")=0 THEN DIM bandeau% IF VARIABLE("bord%")=0 THEN DIM bord% ' Calcul de bandeau% et bord% DIM_LOCAL w0%,h0%,w1%,h1%,w2%,h2% w0%=WIDTH(0) : h0%=HEIGHT(0) PICTURE 1 : FULL_SPACE 1 : w1%=WIDTH(1) : h1%=HEIGHT(1) w2%=w0%-w1% : h2%=h0%-h1% : bandeau%=h2%-(w2%/2) : bord%=w2%/2 ' Suppression du Picture devenu inutile DELETE 1 END_SUB
SUB AIDE() DIM_LOCAL a$ ' Système d`aide du programme APPLICATION_TITLE "Règles du jeu PUISSANCE 4" a$=" Le but du jeu est d'aligner 4 pions de sa couleur dans le sens"+chr$(13) a$=a$+"horizontal, vertical ou diagonal. Le premier qui réalise cela a"+chr$(13) a$=a$+"gagné et le jeu s'arrête. Si toutes les cases du jeu sont remplies"+chr$(13) a$=a$+"sans que cela ait pu être réalisé, alors la partie est nulle."+chr$(13)+chr$(13) a$=a$+"Cliquez dans une colonne avec au moins un emplacement de libre"+chr$(13) a$=a$+"pour lacher le pion dans cette colonne" MESSAGE a$ END_SUB
SUB Dessine_Pion(Col%,Ligne,Couleur%) IF Couleur% = JAUNE% 2D_FILL_COLOR 230,230,50 ELSE 2D_FILL_COLOR 240,50,50 END_IF 2D_CIRCLE Col% * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Ligne * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Largeur_pion% / 2 END_SUB
SUB Fin() wait 2000 Terminate END_SUB
SUB Verifie_victoire(COLONNE%,LIGNE%) dim_local i%,j%,k%, pions%, resultat%,a$ resultat%=0 for i%=1 to 4 for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%+k%) next k% if pions%=4 or pions%=-4 then resultat%=pions% next j% next i% for i%=4 to 7 for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%-k%,j%+k%) next k% if pions%=4 or pions%=-4 then resultat%=pions% next j% next i%
i%=COLONNE% for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%,j%+k%) next k% if pions%=4 or pions%=-4 then resultat%=pions% next j%
j% = LIGNE% for i%=1 to 4 : rem Horizontale pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%) next k% if pions%=4 or pions%=-4 then resultat%=pions% next i%
if resultat%<>0 beep a$="Bravo, la partie est finie"+ chr$(13) + "LES " if resultat%= 4 then a$=a$+"JAUNES" if resultat%=-4 then a$=a$+"ROUGES" a$ = a$ + " ONT GAGNE !" if message_confirmation_ok(a$) > -1 then Fin() if Debug% = 1 caption M_Debug%, Message$ end_if end_if END_SUB
Clic: OFF_CLICK N_Grille% Num% = INT((MOUSE_X_POSITION(N_Grille%) - 0.5 * Bordure%) / (Largeur_pion% + Bordure%)) + 1 Message$ = "Clic sur la colonne n°" + STR$(Num%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ IF Colonnes%(Num%) < NB_LIGNES% Colonnes%(Num%) = Colonnes%(Num%) + 1 Grille%(Num%, Colonnes%(Num%)) = Tour% 2D_TARGET_IS N_Grille% : Dessine_Pion(Num% -1, NB_LIGNES% - Colonnes%(Num%),Tour%) NB_VIDES% = NB_VIDES% - 1 Verifie_victoire(Num%, Colonnes%(Num%)) IF NB_VIDES% = 0 THEN Fin() IF Tour% = JAUNE% Tour% = ROUGE% ELSE Tour% = JAUNE% END_IF 2D_TARGET_IS 0 : Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) END_IF ON_CLICK N_Grille%,clic RETURN | |
| | | papydall
Nombre de messages : 7006 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Une premiere version de puissance 4 Sam 24 Déc 2016 - 12:07 | |
| Salut Jicehel.
Il y a un minibug (pas notre ami, mais dans le programme).
Le jeton jaune (celui de la 2ème ligne à partir du bas, le plus à gauche) est mal placé. En fait, j’ai cliqué sur la case juste en dessus, mais il s’est placé une ligne plus bas. D’ailleurs ce comportement se répète pour d’autres cases.
C'est tout bon, bravo Jicehel !
Dernière édition par papydall le Sam 24 Déc 2016 - 17:52, édité 1 fois | |
| | | Minibug
Nombre de messages : 4566 Age : 57 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Une premiere version de puissance 4 Sam 24 Déc 2016 - 13:01 | |
| Bonjour Jicehel ! Je n'ai pas encore regardé ton programme mais comme tu parle de FTP ça m'interpelle puisque c'est ce sur quoi je travaille actuellement. Je suis d’ailleurs plutôt sur une version 'Serveur partagé', mais j'ai aussi préparé une version 'FTP' avec les fonctions de la DLL de Klaus qui est pratiquement finalisée. Le problème, c'est la possibilité d'utilisé le FTP depuis le WEB. J'ai démarré avec mon ftpperso.free.fr mais il n'autorise qu'un accés à la fois donc pour chatter ou jouer à plusieurs c'est pas très pratique !! Et pour créer un FTP en ligne style sur un site WEB, etc. je ne connais pas assez. Peut être que certaines personnes ici ont les compétences... | |
| | | Marc
Nombre de messages : 2391 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Une premiere version de puissance 4 Sam 24 Déc 2016 - 16:48 | |
| Bonjour à tous ! Merci et bravo Jicehel ! Vivement la suite ... @Papydall Je ne pense pas qu’il y a un bug pour ce jeu : ce sont des colonnes verticales dans lesquelles on lâche un pion qui va descendre le plus bas possible. Impossible d’y jouer sans gravité ! | |
| | | papydall
Nombre de messages : 7006 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Une premiere version de puissance 4 Sam 24 Déc 2016 - 18:00 | |
| Salut Marc37. Tu as parfaitement raison. J’ai raturé mon message ci-haut pour ne pas inquiéter notre ami Jicehel. Bravo Jicehel pour ce jeu | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Dim 25 Déc 2016 - 20:42 | |
| Content que ça vous plaise. Un grand classique mais facile à programmer et amusant à deux. On peut faire très simplement un mode 2 joueurs mais le rendre intéressant (en ne faisant pas jouer l'ordinateur aléatoirement ou presque) c'est déjà plus compliqué et ça c'est un truc pour lequel j'ai toujours eu du mal. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Mer 4 Jan 2017 - 0:02 | |
| Ce soir javais envie de coder un peu alors j'ai commencé une version contre l'ordi du puissance4 mais il y a de grosses améliorations à faire et des corrections aussi car il y a à priori des comportements anormaux. En tous cas voici la version de ce soir: - Code:
-
' Puissance 4 version 1 (Simple) ' Mode contre l'ordinateur ' Dessin simple sans animation ' Les jaunes commencent toujours
' Définir le type pour une case de la grille ' Case = 0 => ROUGE; 1 => JAUNE; 2 => VIDE DIM ROUGE% : ROUGE% = -1 DIM JAUNE% : JAUNE% = 1 DIM VIDE% : VIDE% = 0 DIM C_ORDI% :' Couleur des pions de l'odinateur
' Définir la grille de jeu DIM NB_COLONNES% : NB_COLONNES% = 7 DIM NB_LIGNES% : NB_LIGNES% = 6 DIM NB_VIDES% : NB_VIDES% = NB_COLONNES% * NB_LIGNES%
' La grille de jeu avec une bordure supplémentaire DIM Grille%(NB_COLONNES%, NB_LIGNES%) DIM Sauve_Grille%(NB_COLONNES%, NB_LIGNES%) DIM Colonnes%(NB_COLONNES%),Sauve_Colonnes%(NB_COLONNES%)
' Programmation du mode de debuggage DIM Debug% : Debug% = 0 : ' Mettre à 1 pour activer le mode debug DIM F_Debug% : F_Debug% = 1 DIM M_Debug%, Tps_Msg_Debug% : Tps_Msg_Debug% = 1500
' Tailles des éléments du jeu DIM Marge% : Marge% = 20 DIM Bordure% : Bordure% = 10 DIM Largeur_pion% : Largeur_pion% = 60
' Définition des numéro d'objet DIM N_Grille% : N_Grille% = 10
DIM Num%, Message$, resultat% DIM Tour%, Aff_tour%
LABEL Clic
Retourne_Dimension_Bandeau_Et_Bord() :' retourne bandeau%,bord% pour portabilité
INIT() AIDE() IF Debug% = 1 THEN CREER_FENETRE_DEBUG()
CREER_GRILLE() VIDER() SHOW 0 C_ORDI% = JAUNE% IF Tour% = C_ORDI% THEN Ajoute_Pion(4) : Dessine_Pion2(4) : Change_Tour() IF Debug% = 1 THEN DEBUG_GRILLE() ON_CLICK N_Grille%,clic END
SUB CREER_GRILLE() DIM_LOCAL Decal_x,Decal_y, i%, j%, r PICTURE N_Grille% : LEFT N_Grille%, Marge% : TOP N_Grille%, Marge% WIDTH N_Grille%, Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) HEIGHT N_Grille%, Bordure% + NB_LIGNES% * (Largeur_pion% + Bordure%) COLOR N_Grille%,0,0,255 : 2D_FILL_COLOR 50,50,50 2D_TARGET_IS N_Grille% r = Largeur_pion% / 2 Decal_y = Bordure%
FOR i% = 1 TO NB_LIGNES% Decal_x = Bordure% FOR j% = 1 TO NB_COLONNES% 2D_CIRCLE Decal_x + r, Decal_y + r, r Decal_x = Decal_x + Largeur_pion% + Bordure% NEXT j% Decal_y = Decal_y + Largeur_pion% + Bordure% NEXT i% END_SUB
SUB INIT() DIM_LOCAL Largeur%, Hauteur%, ind% HIDE 0 Largeur% = Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% WIDTH 0, Largeur% Hauteur% = 2*Bordure% + (NB_LIGNES% + 1 ) * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% HEIGHT 0, Hauteur% + bandeau% CAPTION 0," P U I S S A N C E 4" Tour% = JAUNE% ind% = 3 : ALPHA ind% : LEFT ind%, Marge% + 10 : TOP ind%, (NB_LIGNES%)* (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2 FONT_SIZE ind%,22 : FONT_NAME ind%,"Times New Roman" : CAPTION ind%,"C'est au tour de jouer de : " 2D_TARGET_IS 0 :Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) Aff_tour% = 1 END_SUB
SUB VIDER() DIM_LOCAL i%, j% : ' parcourir les cases de la grille pour la vider FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = VIDE% NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = 0 NEXT j% END_SUB
SUB CREER_FENETRE_DEBUG() DIM_LOCAL i%,j%, ind% ind% = 200 FORM F_Debug% LEFT F_Debug%, WIDTH(0) +50 CAPTION F_Debug%,"Debug" M_Debug% = ind% ALPHA ind% : PARENT ind%, F_Debug% LEFT ind%, 10 : WIDTH ind%, WIDTH(F_Debug%) - 20 TOP ind%, 10 FOR i% = 1 TO NB_LIGNES% + 2 ALPHA ind%+i% : PARENT ind%+i%, F_Debug% LEFT ind%+i%, 10 : WIDTH ind%+i%, WIDTH(F_Debug%) - 20 TOP ind%+i%, 10 + 13*(NB_LIGNES% - i% +4) NEXT i% END_SUB
SUB DEBUG_GRILLE() DIM_LOCAL i%,j%, ind%, T$ ind% = 200 FOR i% = 1 TO NB_LIGNES% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Grille%(j%, i%)),3) NEXT j% CAPTION ind%+i%, T$ NEXT i% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Colonnes%(j%)),3) NEXT j% CAPTION ind%+NB_LIGNES% + 2, T$ END_SUB
rem ====================================' détection des dimensions de la fenêtre SUB Retourne_Dimension_Bandeau_Et_Bord() ' controle de la position de la procédure dans le programme IF NUMBER_OBJECTS>0 MESSAGE "La SUB 'Retourne_Dimension_Bandeau_Et_Bord' doit être placée avant la création du premier objet !" TERMINATE END_IF ' création des VARIABLES GLOBALES IF VARIABLE("bandeau%")=0 THEN DIM bandeau% IF VARIABLE("bord%")=0 THEN DIM bord% ' Calcul de bandeau% et bord% DIM_LOCAL w0%,h0%,w1%,h1%,w2%,h2% w0%=WIDTH(0) : h0%=HEIGHT(0) PICTURE 1 : FULL_SPACE 1 : w1%=WIDTH(1) : h1%=HEIGHT(1) w2%=w0%-w1% : h2%=h0%-h1% : bandeau%=h2%-(w2%/2) : bord%=w2%/2 ' Suppression du Picture devenu inutile DELETE 1 END_SUB
SUB AIDE() DIM_LOCAL a$ ' Système d`aide du programme APPLICATION_TITLE "Règles du jeu PUISSANCE 4" a$=" Le but du jeu est d'aligner 4 pions de sa couleur dans le sens"+chr$(13) a$=a$+"horizontal, vertical ou diagonal. Le premier qui réalise cela a"+chr$(13) a$=a$+"gagné et le jeu s'arrête. Si toutes les cases du jeu sont remplies"+chr$(13) a$=a$+"sans que cela ait pu être réalisé, alors la partie est nulle."+chr$(13)+chr$(13) a$=a$+"Cliquez dans une colonne avec au moins un emplacement de libre"+chr$(13) a$=a$+"pour lacher le pion dans cette colonne" MESSAGE a$ END_SUB
SUB Dessine_Pion(Col%,Ligne,Couleur%) IF Couleur% = JAUNE% 2D_FILL_COLOR 230,230,50 ELSE 2D_FILL_COLOR 240,50,50 END_IF 2D_CIRCLE Col% * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Ligne * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Largeur_pion% / 2 END_SUB
SUB Fin() wait 2000 Terminate END_SUB
SUB Verifie_victoire(COLONNE%,LIGNE%) dim_local i%,j%,k%, pions% resultat%=0 for i%=1 to NB_COLONNES% - 3 for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j% next i%
for i%=4 to NB_COLONNES% for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%-k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j% next i%
i%=COLONNE% for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j%
j% = LIGNE% for i%=1 to (NB_COLONNES% - 3) : rem Horizontale pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next i%
END_SUB
SUB Change_Tour() IF Tour% = JAUNE% Tour% = ROUGE% ELSE Tour% = JAUNE% END_IF IF Aff_tour% = 1 THEN 2D_TARGET_IS 0 : Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) END_SUB
SUB Sauve_grille() dim_local i%,j% FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Sauve_Grille%(j%,i%) = Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Sauve_Colonnes%(j%) = Colonnes%(j%) NEXT j% END_SUB
SUB Restore_grille() dim_local i%,j% NB_VIDES% = NB_VIDES% + 1 FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = Sauve_Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = Sauve_Colonnes%(j%) NEXT j% END_SUB
SUB Ordi_joue() dim_local i%,j%, sortie%
sortie% = 0 Sauve_grille() ' Essaye de gagner FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF resultat% = 4 * C_Ordi% Dessine_Pion2(j%) Victoire() j% = NB_COLONNES% : sortie% = 1 ELSE Restore_grille() END_IF END_IF NEXT j% ' Empèche l'adversaire de gagner IF sortie% = 0 Aff_tour% = 0 : Change_tour() FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF abs(resultat%) = 4 Message$ = "Jeu auto en" + STR$(j%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Restore_grille(): Change_tour() Ajoute_Pion(j%) : Dessine_Pion2(j%) j% = NB_COLONNES% : sortie%= 1 : Change_tour() ELSE Restore_grille() END_IF END_IF NEXT j% Aff_tour% = 1 : Change_tour() END_IF ' A développer pour autres cas ' Sinon joue où il y a de la place j% = 1 WHILE ((j% < NB_COLONNES%) AND (sortie% = 0)) IF Colonnes%(j%) < NB_LIGNES% AND sortie% = 0 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(j%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(j%) Dessine_Pion2(j%) sortie% = 1 END_IF j% = j%+1 END_WHILE
END_SUB
SUB Ajoute_Pion(Col%) Colonnes%(Col%) = Colonnes%(Col%) + 1 Grille%(Col%, Colonnes%(Col%)) = Tour% NB_VIDES% = NB_VIDES% - 1 END_SUB
SUB Dessine_Pion2(Colonne%) 2D_TARGET_IS N_Grille% Dessine_Pion(Colonne% -1, NB_LIGNES% - Colonnes%(Colonne%),Tour%) END_SUB
SUB Victoire() BEEP message$="Bravo, la partie est finie"+ CHR$(13) + "LES " IF resultat%= 4*JAUNE% THEN message$=message$+"JAUNES" IF resultat%= 4*ROUGE% THEN message$=message$+"ROUGES" message$=message$ + " ONT GAGNE !" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_SUB
Clic: OFF_CLICK N_Grille% Num% = INT((MOUSE_X_POSITION(N_Grille%) - 0.5 * Bordure%) / (Largeur_pion% + Bordure%)) + 1 Message$ = "Clic sur la colonne n°" + STR$(Num%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ IF Colonnes%(Num%) < NB_LIGNES% Ajoute_Pion(Num%) Dessine_Pion2(Num%) Verifie_victoire(Num%, Colonnes%(Num%)) IF resultat%<>0 THEN Victoire() IF NB_VIDES% = 0 message$="Partie nulle, la grille est pleine" +CHR$(13) message$=message$+"Personne n'a réussi à gagner" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_IF IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() END_IF Ordi_joue() IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() ON_CLICK N_Grille%,clic RETURN | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Mer 4 Jan 2017 - 8:13 | |
| Bravo Jicehel,
Je viens de faire une dizaine de parties avec ce dernier code.
Je n'ai rien constaté d'anormale dans le déroulement du jeu. Je n'ai pas gagné à tous les coups, mais ça reste assez facile.
Une remarque: une erreur de frappe: "c'est le tour de jouer de :"
Sinon, j'ai remarqué que l'ordi commence toujours sa partie dans la même colonne. Ce qui permet au joueur de gagner à tous les coups (dès qu'il a trouvé une première fois, il lui suffit de refaire pareil à chaque fois).
En tous cas bravo ! | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Mer 4 Jan 2017 - 8:30 | |
| Un exemple de configuration ou je gagne à tous les coups. | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Mer 4 Jan 2017 - 10:24 | |
| Oui, on est d'accord la dessus Jean-Claude, j'ai fait les 2 premiers cas (le test pour gagner et pour empêcher l'autre de gagner) et il était tard alors j'ai rapidement codé un petit truc pour que l'ordi joue dans les autres cas mais il n'a aucune stratégie ni aucun aléa. Là je suis au boulot, mais il faudrait qu'il estime s'il joue dans un case si l'adversaire risque de gagner au tour suivant pour éliminer cette case s'il peut jouer ailleurs. Il faudrait un petit tableau avec les colonnes où il peut jouer puis qu'il fasse un tirage aléatoire pour jouer dans une de ces colonnes. Je pense que je pourrais coder ça ce soir et ça rendra le jeu plus intéressant et moins prévisible. | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Mer 4 Jan 2017 - 11:13 | |
| L'important, c'est que l'ordinateur recherche en priorité à bloquer son adversaire dès que celui-çi a aligné trois pions. C'est déjà le cas dans ton code. Si son adversaire n'a pas encore aligné 3 pions, alors tu peux autoriser l'ordinateur à placer son pion de manière aléatoire. J'espère que mon explication n'est pas trop brouillonne. Pour le premier pion, là tu peux le faire aléatoire d'entrée. A+ | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Mer 4 Jan 2017 - 20:47 | |
| Je pense que c'est la case vide (ligne 3 colonne 5) qui n'a pas été prise en compte.A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Jeu 5 Jan 2017 - 0:34 | |
| Non, non, pas de problème. Si tu regardes bien, ils ont bien gagné en diagonal entre la colonne 1 et la colonne 4 J'ai codé le coté aléatoire qui va rendre le jeu un peu plus intéressant, un peu plus compliqué aussi mais faisable pour rester amusant car l'ordinateur ne joue qu'en défense sans stratégie d'attaque. Bon jeu à vous. Il reste des conditions de fin à vérifier (Je n'ai pas contrôlé le décompte des pions mais il est tard et je vais aller me coucher) mais il y a de quoi s'amuser et si vous voyez des bugs, je sais que vous me les direz PS: Le source et libre alors si vous voulez l'optimiser, améliorer le source, ajouter des commentaires ou autres modifications, faites vous plaisir. - Code:
-
' Puissance 4 version 1 (Simple) ' Mode contre l'ordinateur ' Dessin simple sans animation ' Les jaunes commencent toujours
' Définir le type pour une case de la grille ' Case = 0 => ROUGE; 1 => JAUNE; 2 => VIDE DIM ROUGE% : ROUGE% = -1 DIM JAUNE% : JAUNE% = 1 DIM VIDE% : VIDE% = 0 DIM C_ORDI% :' Couleur des pions de l'odinateur
' Définir la grille de jeu DIM NB_COLONNES% : NB_COLONNES% = 7 DIM NB_LIGNES% : NB_LIGNES% = 6 DIM NB_VIDES% : NB_VIDES% = NB_COLONNES% * NB_LIGNES%
' La grille de jeu avec une bordure supplémentaire DIM Grille%(NB_COLONNES%, NB_LIGNES%) DIM Sauve_Grille%(NB_COLONNES%, NB_LIGNES%) DIM Colonnes%(NB_COLONNES%),Sauve_Colonnes%(NB_COLONNES%)
' Programmation du mode de debuggage DIM Debug% : Debug% = 1 : ' Mettre à 1 pour activer le mode debug DIM F_Debug% : F_Debug% = 1 DIM M_Debug%, Tps_Msg_Debug% : Tps_Msg_Debug% = 1500
' Tailles des éléments du jeu DIM Marge% : Marge% = 20 DIM Bordure% : Bordure% = 10 DIM Largeur_pion% : Largeur_pion% = 60
' Définition des numéro d'objet DIM N_Grille% : N_Grille% = 10
DIM Num%, Message$, resultat% DIM Tour%, Aff_tour%, sortie%
DIM NB_jouables%, col_jouables%(NB_COLONNES%)
LABEL Clic
Retourne_Dimension_Bandeau_Et_Bord() :' retourne bandeau%,bord% pour portabilité
INIT() AIDE() IF Debug% = 1 THEN CREER_FENETRE_DEBUG()
CREER_GRILLE() VIDER() SHOW 0 C_ORDI% = JAUNE% IF Tour% = C_ORDI% THEN Ajoute_Pion(4) : Dessine_Pion2(4) : Change_Tour() IF Debug% = 1 THEN DEBUG_GRILLE() ON_CLICK N_Grille%,clic END
SUB CREER_GRILLE() DIM_LOCAL Decal_x,Decal_y, i%, j%, r PICTURE N_Grille% : LEFT N_Grille%, Marge% : TOP N_Grille%, Marge% WIDTH N_Grille%, Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) HEIGHT N_Grille%, Bordure% + NB_LIGNES% * (Largeur_pion% + Bordure%) COLOR N_Grille%,0,0,255 : 2D_FILL_COLOR 50,50,50 2D_TARGET_IS N_Grille% r = Largeur_pion% / 2 Decal_y = Bordure%
FOR i% = 1 TO NB_LIGNES% Decal_x = Bordure% FOR j% = 1 TO NB_COLONNES% 2D_CIRCLE Decal_x + r, Decal_y + r, r Decal_x = Decal_x + Largeur_pion% + Bordure% NEXT j% Decal_y = Decal_y + Largeur_pion% + Bordure% NEXT i% END_SUB
SUB INIT() DIM_LOCAL Largeur%, Hauteur%, ind% HIDE 0 Largeur% = Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% WIDTH 0, Largeur% Hauteur% = 2*Bordure% + (NB_LIGNES% + 1 ) * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% HEIGHT 0, Hauteur% + bandeau% CAPTION 0," P U I S S A N C E 4" Tour% = JAUNE% ind% = 3 : ALPHA ind% : LEFT ind%, Marge% + 10 : TOP ind%, (NB_LIGNES%)* (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2 FONT_SIZE ind%,22 : FONT_NAME ind%,"Times New Roman" : CAPTION ind%,"C'est au tour de jouer de : " 2D_TARGET_IS 0 :Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) Aff_tour% = 1 END_SUB
SUB VIDER() DIM_LOCAL i%, j% : ' parcourir les cases de la grille pour la vider FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = VIDE% NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = 0 NEXT j% END_SUB
SUB CREER_FENETRE_DEBUG() DIM_LOCAL i%,j%, ind% ind% = 200 FORM F_Debug% LEFT F_Debug%, WIDTH(0) +50 CAPTION F_Debug%,"Debug" M_Debug% = ind% ALPHA ind% : PARENT ind%, F_Debug% LEFT ind%, 10 : WIDTH ind%, WIDTH(F_Debug%) - 20 TOP ind%, 10 FOR i% = 1 TO NB_LIGNES% + 2 ALPHA ind%+i% : PARENT ind%+i%, F_Debug% LEFT ind%+i%, 10 : WIDTH ind%+i%, WIDTH(F_Debug%) - 20 TOP ind%+i%, 10 + 13*(NB_LIGNES% - i% +4) NEXT i% END_SUB
SUB DEBUG_GRILLE() DIM_LOCAL i%,j%, ind%, T$ ind% = 200 FOR i% = 1 TO NB_LIGNES% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Grille%(j%, i%)),3) NEXT j% CAPTION ind%+i%, T$ NEXT i% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Colonnes%(j%)),3) NEXT j% CAPTION ind%+NB_LIGNES% + 2, T$ END_SUB
rem ====================================' détection des dimensions de la fenêtre SUB Retourne_Dimension_Bandeau_Et_Bord() ' controle de la position de la procédure dans le programme IF NUMBER_OBJECTS>0 MESSAGE "La SUB 'Retourne_Dimension_Bandeau_Et_Bord' doit être placée avant la création du premier objet !" TERMINATE END_IF ' création des VARIABLES GLOBALES IF VARIABLE("bandeau%")=0 THEN DIM bandeau% IF VARIABLE("bord%")=0 THEN DIM bord% ' Calcul de bandeau% et bord% DIM_LOCAL w0%,h0%,w1%,h1%,w2%,h2% w0%=WIDTH(0) : h0%=HEIGHT(0) PICTURE 1 : FULL_SPACE 1 : w1%=WIDTH(1) : h1%=HEIGHT(1) w2%=w0%-w1% : h2%=h0%-h1% : bandeau%=h2%-(w2%/2) : bord%=w2%/2 ' Suppression du Picture devenu inutile DELETE 1 END_SUB
SUB AIDE() DIM_LOCAL a$ ' Système d`aide du programme APPLICATION_TITLE "Règles du jeu PUISSANCE 4" a$=" Le but du jeu est d'aligner 4 pions de sa couleur dans le sens"+chr$(13) a$=a$+"horizontal, vertical ou diagonal. Le premier qui réalise cela a"+chr$(13) a$=a$+"gagné et le jeu s'arrête. Si toutes les cases du jeu sont remplies"+chr$(13) a$=a$+"sans que cela ait pu être réalisé, alors la partie est nulle."+chr$(13)+chr$(13) a$=a$+"Cliquez dans une colonne avec au moins un emplacement de libre"+chr$(13) a$=a$+"pour lacher le pion dans cette colonne" MESSAGE a$ END_SUB
SUB Dessine_Pion(Col%,Ligne,Couleur%) IF Couleur% = JAUNE% 2D_FILL_COLOR 230,230,50 ELSE 2D_FILL_COLOR 240,50,50 END_IF 2D_CIRCLE Col% * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Ligne * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Largeur_pion% / 2 END_SUB
SUB Fin() wait 2000 Terminate END_SUB
SUB Verifie_victoire(COLONNE%,LIGNE%) dim_local i%,j%,k%, pions% resultat%=0 for i%=1 to NB_COLONNES% - 3 for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j% next i%
for i%=4 to NB_COLONNES% for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%-k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j% next i%
i%=COLONNE% for j%=1 to (NB_LIGNES% - 3) pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j%
j% = LIGNE% for i%=1 to (NB_COLONNES% - 3) : rem Horizontale pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next i%
END_SUB
SUB Change_Tour() IF Tour% = JAUNE% Tour% = ROUGE% ELSE Tour% = JAUNE% END_IF IF Aff_tour% = 1 THEN 2D_TARGET_IS 0 : Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) END_SUB
SUB Sauve_grille() dim_local i%,j% FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Sauve_Grille%(j%,i%) = Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Sauve_Colonnes%(j%) = Colonnes%(j%) NEXT j% END_SUB
SUB Restore_grille() dim_local i%,j% NB_VIDES% = NB_VIDES% + 1 FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = Sauve_Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = Sauve_Colonnes%(j%) NEXT j% END_SUB
SUB Ordi_essai_gagne() dim_local j% FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF resultat% = 4 * C_Ordi% Dessine_Pion2(j%) Victoire() j% = NB_COLONNES% : sortie% = 1 ELSE Restore_grille() END_IF END_IF NEXT j% END_SUB
SUB Ordi_empeche_victoire() dim_local j% Aff_tour% = 0 : Change_tour() FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF ABS(resultat%) = 4 Message$ = "Jeu auto en" + STR$(j%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Restore_grille() Change_tour() Ajoute_Pion(j%) Dessine_Pion2(j%) j% = NB_COLONNES% : sortie%= 1 : Change_tour() ELSE Restore_grille() END_IF END_IF NEXT j% Aff_tour% = 1 : Change_tour() END_SUB
SUB Ordi_empeche_victoire_suiv() dim_local i%,j% Aff_tour% = 0 : NB_jouables% = 0 FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < (NB_LIGNES% - 1) Ajoute_Pion(j%) : Change_tour() : Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF ABS(resultat%) <> 4 NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% END_IF Restore_grille(): NB_VIDES% = NB_VIDES% + 1 : Change_tour() ELSE IF Colonnes%(j%) = NB_LIGNES% NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% Restore_grille() END_IF END_IF NEXT j% IF NB_jouables% = 0 FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% END_IF NEXT j% i%=INT(RND(NB_jouables%))+1 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(col_jouables%(i%)) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(col_jouables%(i%)) Dessine_Pion2(col_jouables%(i%)) sortie% = 1 ELSE i%=INT(RND(NB_jouables%))+1 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(col_jouables%(i%)) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(col_jouables%(i%)) Dessine_Pion2(col_jouables%(i%)) sortie% = 1 END_IF Aff_tour% = 1 END_SUB
SUB Ordi_joue() dim_local i%,j%
sortie% = 0 Sauve_grille() Ordi_essai_gagne() IF sortie% = 0 THEN Ordi_empeche_victoire() IF sortie% = 0 AND NB_VIDES% > 1 THEN Ordi_empeche_victoire_suiv() END_SUB
SUB Ajoute_Pion(Col%) Colonnes%(Col%) = Colonnes%(Col%) + 1 Grille%(Col%, Colonnes%(Col%)) = Tour% NB_VIDES% = NB_VIDES% - 1 END_SUB
SUB Dessine_Pion2(Colonne%) 2D_TARGET_IS N_Grille% Dessine_Pion(Colonne% -1, NB_LIGNES% - Colonnes%(Colonne%),Tour%) END_SUB
SUB Victoire() BEEP message$="Bravo, la partie est finie"+ CHR$(13) + "LES " IF resultat%= 4*JAUNE% THEN message$=message$+"JAUNES" IF resultat%= 4*ROUGE% THEN message$=message$+"ROUGES" message$=message$ + " ONT GAGNE !" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_SUB
Clic: OFF_CLICK N_Grille% Num% = INT((MOUSE_X_POSITION(N_Grille%) - 0.5 * Bordure%) / (Largeur_pion% + Bordure%)) + 1 Message$ = "Clic sur la colonne n°" + STR$(Num%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ IF Colonnes%(Num%) < NB_LIGNES% Ajoute_Pion(Num%) Dessine_Pion2(Num%) Verifie_victoire(Num%, Colonnes%(Num%)) IF resultat%<>0 THEN Victoire() IF NB_VIDES% = 0 message$="Partie nulle, la grille est pleine" +CHR$(13) message$=message$+"Personne n'a réussi à gagner" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_IF IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() END_IF Ordi_joue() IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() ON_CLICK N_Grille%,clic RETURN | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Jeu 5 Jan 2017 - 7:50 | |
| Bonjour à tous, @Jicehel J'ai eu un crash au premier essai. Dommage car le jeu se passait bien. La stratégie de défense de l'ordinateur est impitoyable, ça en deviendrait presque une forme de stratégie d'attaque. Pour le bug j'ai réussi à capturer en 2 temps, tout y est. PS : Ce n'est pas très visible sur l'image: "Debug (ne répond pas)" Précision: je vennais de jouer en colonne 6.
A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Ven 6 Jan 2017 - 1:12 | |
| En effet, j'ai trouvé 2 grosses erreurs de logique dans mon programme (ça ne veut pas dire qu'il n'y en a pas d'autres ) J'ai corrigé et j'ai testé un peu, ça marche plutôt bien. Pour moi ça me convient dans l'état pour le moment. Mais si vous voulez améliorer, corriger des petites choses ou faire vos versions à vous, faites vous plaisir. - Code:
-
' Puissance 4 version 1 (Simple) ' Mode contre l'ordinateur ' Dessins simples sans animation ' Les jaunes commencent toujours et sont jou par l'ordinateur
' Définir le type pour une case de la grille ' Case = 0 => ROUGE; 1 => JAUNE; 2 => VIDE DIM ROUGE% : ROUGE% = -1 DIM JAUNE% : JAUNE% = 1 DIM VIDE% : VIDE% = 0 DIM C_ORDI% :' Couleur des pions de l'odinateur
' Définir la grille de jeu DIM NB_COLONNES% : NB_COLONNES% = 7 DIM NB_LIGNES% : NB_LIGNES% = 6 DIM NB_VIDES% : NB_VIDES% = NB_COLONNES% * NB_LIGNES%
' La grille de jeu avec une bordure supplémentaire DIM Grille%(NB_COLONNES%, NB_LIGNES%) DIM Sauve_Grille%(NB_COLONNES%, NB_LIGNES%) DIM Colonnes%(NB_COLONNES%),Sauve_Colonnes%(NB_COLONNES%)
' Programmation du mode de debuggage DIM Debug% : Debug% = 0 : ' Mettre à 1 pour activer le mode debug DIM F_Debug% : F_Debug% = 1 DIM M_Debug%, Tps_Msg_Debug% : Tps_Msg_Debug% = 1500
' Tailles des éléments du jeu DIM Marge% : Marge% = 20 DIM Bordure% : Bordure% = 10 DIM Largeur_pion% : Largeur_pion% = 60
' Définition des numéro d'objet DIM N_Grille% : N_Grille% = 10
DIM Num%, Message$, resultat% DIM Tour%, Aff_tour%, sortie%
DIM NB_jouables%, col_jouables%(NB_COLONNES%)
LABEL Clic
Retourne_Dimension_Bandeau_Et_Bord() :' retourne bandeau%,bord% pour portabilité
INIT() AIDE() IF Debug% = 1 THEN CREER_FENETRE_DEBUG()
CREER_GRILLE() VIDER() SHOW 0 C_ORDI% = JAUNE% IF Tour% = C_ORDI% THEN Ajoute_Pion(4) : Dessine_Pion2(4) : Change_Tour() IF Debug% = 1 THEN DEBUG_GRILLE() ON_CLICK N_Grille%,clic END
SUB CREER_GRILLE() DIM_LOCAL Decal_x,Decal_y, i%, j%, r PICTURE N_Grille% : LEFT N_Grille%, Marge% : TOP N_Grille%, Marge% WIDTH N_Grille%, Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) HEIGHT N_Grille%, Bordure% + NB_LIGNES% * (Largeur_pion% + Bordure%) COLOR N_Grille%,0,0,255 : 2D_FILL_COLOR 50,50,50 2D_TARGET_IS N_Grille% r = Largeur_pion% / 2 Decal_y = Bordure%
FOR i% = 1 TO NB_LIGNES% Decal_x = Bordure% FOR j% = 1 TO NB_COLONNES% 2D_CIRCLE Decal_x + r, Decal_y + r, r Decal_x = Decal_x + Largeur_pion% + Bordure% NEXT j% Decal_y = Decal_y + Largeur_pion% + Bordure% NEXT i% END_SUB
SUB INIT() DIM_LOCAL Largeur%, Hauteur%, ind% HIDE 0 Largeur% = Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% WIDTH 0, Largeur% Hauteur% = 2*Bordure% + (NB_LIGNES% + 1 ) * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% HEIGHT 0, Hauteur% + bandeau% CAPTION 0," P U I S S A N C E 4" Tour% = JAUNE% ind% = 3 : ALPHA ind% : LEFT ind%, Marge% + 10 : TOP ind%, (NB_LIGNES%)* (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2 FONT_SIZE ind%,22 : FONT_NAME ind%,"Times New Roman" : CAPTION ind%,"C'est au tour de jouer de : " 2D_TARGET_IS 0 :Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) Aff_tour% = 1 END_SUB
SUB VIDER() DIM_LOCAL i%, j% : ' parcourir les cases de la grille pour la vider FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = VIDE% NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = 0 NEXT j% END_SUB
SUB CREER_FENETRE_DEBUG() DIM_LOCAL i%,j%, ind% ind% = 200 FORM F_Debug% LEFT F_Debug%, WIDTH(0) +50 : WIDTH F_Debug%,600 CAPTION F_Debug%,"Debug" M_Debug% = ind% ALPHA ind% : PARENT ind%, F_Debug% LEFT ind%, 10 : WIDTH ind%, WIDTH(F_Debug%) - 20 TOP ind%, 10 FOR i% = 1 TO NB_LIGNES% + 2 ALPHA ind%+i% : PARENT ind%+i%, F_Debug% LEFT ind%+i%, 10 : WIDTH ind%+i%, WIDTH(F_Debug%) - 20 TOP ind%+i%, 10 + 13*(NB_LIGNES% - i% +4) NEXT i% END_SUB
SUB DEBUG_GRILLE() DIM_LOCAL i%,j%, ind%, T$ ind% = 200 FOR i% = 1 TO NB_LIGNES% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Grille%(j%, i%)),3) NEXT j% CAPTION ind%+i%, T$ NEXT i% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Colonnes%(j%)),3) NEXT j% CAPTION ind%+NB_LIGNES% + 2, T$ END_SUB
rem ====================================' détection des dimensions de la fenêtre SUB Retourne_Dimension_Bandeau_Et_Bord() ' controle de la position de la procédure dans le programme IF NUMBER_OBJECTS>0 MESSAGE "La SUB 'Retourne_Dimension_Bandeau_Et_Bord' doit être placée avant la création du premier objet !" TERMINATE END_IF ' création des VARIABLES GLOBALES IF VARIABLE("bandeau%")=0 THEN DIM bandeau% IF VARIABLE("bord%")=0 THEN DIM bord% ' Calcul de bandeau% et bord% DIM_LOCAL w0%,h0%,w1%,h1%,w2%,h2% w0%=WIDTH(0) : h0%=HEIGHT(0) PICTURE 1 : FULL_SPACE 1 : w1%=WIDTH(1) : h1%=HEIGHT(1) w2%=w0%-w1% : h2%=h0%-h1% : bandeau%=h2%-(w2%/2) : bord%=w2%/2 ' Suppression du Picture devenu inutile DELETE 1 END_SUB
SUB AIDE() DIM_LOCAL a$ ' Système d`aide du programme APPLICATION_TITLE "Règles du jeu PUISSANCE 4" a$=" Le but du jeu est d'aligner 4 pions de sa couleur dans le sens"+chr$(13) a$=a$+"horizontal, vertical ou diagonal. Le premier qui réalise cela a"+chr$(13) a$=a$+"gagné et le jeu s'arrête. Si toutes les cases du jeu sont remplies"+chr$(13) a$=a$+"sans que cela ait pu être réalisé, alors la partie est nulle."+chr$(13)+chr$(13) a$=a$+"Cliquez dans une colonne avec au moins un emplacement de libre"+chr$(13) a$=a$+"pour lacher le pion dans cette colonne" MESSAGE a$ END_SUB
SUB Dessine_Pion(Col%,Ligne,Couleur%) IF Couleur% = JAUNE% 2D_FILL_COLOR 230,230,50 ELSE 2D_FILL_COLOR 240,50,50 END_IF 2D_CIRCLE Col% * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Ligne * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Largeur_pion% / 2 END_SUB
SUB Fin() wait 2000 Terminate END_SUB
SUB Verifie_victoire(COLONNE%,LIGNE%) dim_local i%,j%,k%, pions% resultat%=0 for i%=1 to NB_COLONNES% - 3 for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j% next i%
for i%=4 to NB_COLONNES% for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%-k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j% next i%
i%=COLONNE% for j%=1 to (NB_LIGNES% - 3) pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next j%
j% = LIGNE% for i%=1 to (NB_COLONNES% - 3) : rem Horizontale pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% then resultat%=pions% next i%
END_SUB
SUB Change_Tour() IF Tour% = JAUNE% Tour% = ROUGE% ELSE Tour% = JAUNE% END_IF IF Aff_tour% = 1 THEN 2D_TARGET_IS 0 : Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) END_SUB
SUB Sauve_grille() dim_local i%,j% FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Sauve_Grille%(j%,i%) = Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Sauve_Colonnes%(j%) = Colonnes%(j%) NEXT j% END_SUB
SUB Restore_grille() dim_local i%,j% NB_VIDES% = NB_VIDES% + 1 FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = Sauve_Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = Sauve_Colonnes%(j%) NEXT j% END_SUB
SUB Ordi_essai_gagne() dim_local j% FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF resultat% = 4 * C_Ordi% Dessine_Pion2(j%) Victoire() j% = NB_COLONNES% : sortie% = 1 ELSE Restore_grille() END_IF END_IF NEXT j% END_SUB
SUB Ordi_empeche_victoire() dim_local j% Aff_tour% = 0 : Change_tour() FOR j% = 1 TO NB_COLONNES% IF Debug% = 1 THEN CAPTION F_Debug%, "Colonnes%(" + STR$(j%) + "): "+STR$(Colonnes%(j%))+ " - Ordi_empeche_victoire" IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF ABS(resultat%) = 4 Message$ = "Jeu auto en" + STR$(j%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Restore_grille() Change_tour() Ajoute_Pion(j%) Dessine_Pion2(j%) j% = NB_COLONNES% : sortie%= 1 : Change_tour() ELSE Restore_grille() END_IF END_IF NEXT j% Aff_tour% = 1 : Change_tour() END_SUB
SUB Ordi_empeche_victoire_suiv() dim_local i%,j% Aff_tour% = 0 : NB_jouables% = 0 FOR j% = 1 TO NB_COLONNES% IF Debug% = 1 THEN CAPTION F_Debug%, "Colonnes%(" + STR$(j%) + "): "+STR$(Colonnes%(j%))+ " - Ordi_empeche_victoire_suiv" IF Colonnes%(j%) < (NB_LIGNES% - 1) Ajoute_Pion(j%) : Change_tour() : Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF ABS(resultat%) <> 4 NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% END_IF Restore_grille(): NB_VIDES% = NB_VIDES% + 1 : Change_tour() ELSE IF Colonnes%(j%) = (NB_LIGNES% - 1) NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% Restore_grille() END_IF END_IF NEXT j% IF NB_jouables% = 0 FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% END_IF NEXT j% i%=INT(RND(NB_jouables%))+1 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(col_jouables%(i%)) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(col_jouables%(i%)) Dessine_Pion2(col_jouables%(i%)) sortie% = 1 ELSE i%=INT(RND(NB_jouables%))+1 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(col_jouables%(i%)) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(col_jouables%(i%)) Dessine_Pion2(col_jouables%(i%)) sortie% = 1 END_IF Aff_tour% = 1 END_SUB
SUB Ordi_joue() dim_local i%,j%
sortie% = 0 Sauve_grille() Ordi_essai_gagne() IF sortie% = 0 THEN Ordi_empeche_victoire() IF sortie% = 0 AND NB_VIDES% > 1 THEN Ordi_empeche_victoire_suiv() END_SUB
SUB Ajoute_Pion(Col%) Colonnes%(Col%) = Colonnes%(Col%) + 1 Grille%(Col%, Colonnes%(Col%)) = Tour% NB_VIDES% = NB_VIDES% - 1 END_SUB
SUB Dessine_Pion2(Colonne%) 2D_TARGET_IS N_Grille% Dessine_Pion(Colonne% -1, NB_LIGNES% - Colonnes%(Colonne%),Tour%) END_SUB
SUB Victoire() BEEP message$="Bravo, la partie est finie"+ CHR$(13) + "LES " IF resultat%= 4*JAUNE% THEN message$=message$+"JAUNES" IF resultat%= 4*ROUGE% THEN message$=message$+"ROUGES" message$=message$ + " ONT GAGNE !" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_SUB
SUB Verifie_complet() IF NB_VIDES% = 0 message$="Partie nulle, la grille est pleine" +CHR$(13) message$=message$+"Personne n'a réussi à gagner" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_IF END_SUB
Clic: OFF_CLICK N_Grille% Num% = INT((MOUSE_X_POSITION(N_Grille%) - 0.5 * Bordure%) / (Largeur_pion% + Bordure%)) + 1 Message$ = "Clic sur la colonne n°" + STR$(Num%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ IF Debug% = 1 THEN CAPTION F_Debug%, "Colonnes%(Num%): "+STR$(Colonnes%(Num%))+ " - Clic" IF Colonnes%(Num%) < NB_LIGNES% Ajoute_Pion(Num%) Dessine_Pion2(Num%) Verifie_victoire(Num%, Colonnes%(Num%)) IF resultat%<>0 THEN Victoire() Verifie_complet() IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() Ordi_joue() Verifie_complet() IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() END_IF ON_CLICK N_Grille%,clic RETURN | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Ven 6 Jan 2017 - 8:45 | |
| Salut à tous,
@Jicehel
je pense également, qu'en l'état, c'est un bon jeu. La difficulté est moyenne pour un débutant.
Est-il facile de montrer la ligne gagnante à la fin (avec des points noirs au milieu des pions par exemple) ? J'ai tenté de le faire, mais j'ai vite renoncé car le code est assez complexe.
Bravo, ça va plaire à mes petits enfants.
A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Ven 6 Jan 2017 - 15:14 | |
| Bonne idée Jean-Claude, je vais essayer de t'ajouter ça se soir. Ca ne me parait pas très compliqué à première vue. Par contre je vais faire simple (s'il y a plusieurs possibilités de bonnes lignes, il n'affichera que la première bonne combinaison) | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Ven 6 Jan 2017 - 18:21 | |
| Heu... sauf erreur, il n'y a q'une combinaison gagnante vu que le jeu se termine à cette combinaison . Je suis entrain de coder une version en 2D, j'espère y arriver. A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Ven 6 Jan 2017 - 20:04 | |
| Et non, tu peux en avoir 3 ou plus si le pion vient compléter plusieurs série de 3 ou s'il forme une ligne de 5 ou 6 pions alignés.
Mais bon qu'importe, j'afficherais la première bonne combinaison trouvée | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Ven 6 Jan 2017 - 20:17 | |
| Oui effectivement, je n'ai pas entrevu cette possibilité.
Bon... après c'est une cerise sur le gâteau, si c'est trop complexe ce n'est pas indispensable.
A+ | |
| | | Minibug
Nombre de messages : 4566 Age : 57 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| | | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Sam 7 Jan 2017 - 0:06 | |
| Et voilà, la première combinaison gagnante trouvée clignote à l'écran. Bon jeu à vous. - Code:
-
' Puissance 4 version 1 (Simple) ' Mode contre l'ordinateur ' Dessins simples sans animation ' Les jaunes commencent toujours et sont jou par l'ordinateur
' Définir le type pour une case de la grille ' Case = 0 => ROUGE; 1 => JAUNE; 2 => VIDE DIM ROUGE% : ROUGE% = -1 DIM JAUNE% : JAUNE% = 1 DIM GAGNE% : GAGNE% = 2 DIM VIDE% : VIDE% = 0 DIM C_ORDI% :' Couleur des pions de l'odinateur
' Définir la grille de jeu DIM NB_COLONNES% : NB_COLONNES% = 7 DIM NB_LIGNES% : NB_LIGNES% = 6 DIM NB_VIDES% : NB_VIDES% = NB_COLONNES% * NB_LIGNES%
' La grille de jeu avec une bordure supplémentaire DIM Grille%(NB_COLONNES%, NB_LIGNES%) DIM Sauve_Grille%(NB_COLONNES%, NB_LIGNES%) DIM Colonnes%(NB_COLONNES%),Sauve_Colonnes%(NB_COLONNES%)
' Programmation du mode de debuggage DIM Debug% : Debug% = 0 : ' Mettre à 1 pour activer le mode debug DIM F_Debug% : F_Debug% = 1 DIM M_Debug%, Tps_Msg_Debug% : Tps_Msg_Debug% = 1500
' Tailles des éléments du jeu DIM Marge% : Marge% = 20 DIM Bordure% : Bordure% = 10 DIM Largeur_pion% : Largeur_pion% = 60
' Définition des numéro d'objet DIM N_Grille% : N_Grille% = 10
DIM Num%, Message$, resultat% DIM Tour%, Aff_tour%, sortie%
DIM NB_jouables%, col_jouables%(NB_COLONNES%) DIM P_Gagne%(3,1)
LABEL Clic
Retourne_Dimension_Bandeau_Et_Bord() :' retourne bandeau%,bord% pour portabilité
INIT() AIDE() IF Debug% = 1 THEN CREER_FENETRE_DEBUG()
CREER_GRILLE() VIDER() SHOW 0 C_ORDI% = JAUNE% IF Tour% = C_ORDI% THEN Ajoute_Pion(4) : Dessine_Pion2(4) : Change_Tour() IF Debug% = 1 THEN DEBUG_GRILLE() ON_CLICK N_Grille%,clic END
SUB CREER_GRILLE() DIM_LOCAL Decal_x,Decal_y, i%, j%, r PICTURE N_Grille% : LEFT N_Grille%, Marge% : TOP N_Grille%, Marge% WIDTH N_Grille%, Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) HEIGHT N_Grille%, Bordure% + NB_LIGNES% * (Largeur_pion% + Bordure%) COLOR N_Grille%,0,0,255 : 2D_FILL_COLOR 50,50,50 2D_TARGET_IS N_Grille% r = Largeur_pion% / 2 Decal_y = Bordure%
FOR i% = 1 TO NB_LIGNES% Decal_x = Bordure% FOR j% = 1 TO NB_COLONNES% 2D_CIRCLE Decal_x + r, Decal_y + r, r Decal_x = Decal_x + Largeur_pion% + Bordure% NEXT j% Decal_y = Decal_y + Largeur_pion% + Bordure% NEXT i% END_SUB
SUB INIT() DIM_LOCAL Largeur%, Hauteur%, ind% HIDE 0 Largeur% = Bordure% + NB_COLONNES% * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% WIDTH 0, Largeur% Hauteur% = 2*Bordure% + (NB_LIGNES% + 1 ) * (Largeur_pion% + Bordure%) + 2 * Marge% + 2 * bord% HEIGHT 0, Hauteur% + bandeau% CAPTION 0," P U I S S A N C E 4" Tour% = JAUNE% ind% = 3 : ALPHA ind% : LEFT ind%, Marge% + 10 : TOP ind%, (NB_LIGNES%)* (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2 FONT_SIZE ind%,22 : FONT_NAME ind%,"Times New Roman" : CAPTION ind%,"C'est au tour de jouer de : " 2D_TARGET_IS 0 :Dessine_Pion(6, NB_LIGNES% +0.5,Tour%) Aff_tour% = 1 END_SUB
SUB VIDER() DIM_LOCAL i%, j% : ' parcourir les cases de la grille pour la vider FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = VIDE% NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = 0 NEXT j% END_SUB
SUB CREER_FENETRE_DEBUG() DIM_LOCAL i%,j%, ind% ind% = 200 FORM F_Debug% LEFT F_Debug%, WIDTH(0) +50 : WIDTH F_Debug%,600 CAPTION F_Debug%,"Debug" M_Debug% = ind% ALPHA ind% : PARENT ind%, F_Debug% LEFT ind%, 10 : WIDTH ind%, WIDTH(F_Debug%) - 20 TOP ind%, 10 FOR i% = 1 TO NB_LIGNES% + 2 ALPHA ind%+i% : PARENT ind%+i%, F_Debug% LEFT ind%+i%, 10 : WIDTH ind%+i%, WIDTH(F_Debug%) - 20 TOP ind%+i%, 10 + 13*(NB_LIGNES% - i% +4) NEXT i% END_SUB
SUB DEBUG_GRILLE() DIM_LOCAL i%,j%, ind%, T$ ind% = 200 FOR i% = 1 TO NB_LIGNES% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Grille%(j%, i%)),3) NEXT j% CAPTION ind%+i%, T$ NEXT i% T$ = "" FOR j% = 1 TO NB_COLONNES% T$=T$ + RIGHT$(" "+ STR$(Colonnes%(j%)),3) NEXT j% CAPTION ind%+NB_LIGNES% + 2, T$ END_SUB
rem ====================================' détection des dimensions de la fenêtre SUB Retourne_Dimension_Bandeau_Et_Bord() ' controle de la position de la procédure dans le programme IF NUMBER_OBJECTS>0 MESSAGE "La SUB 'Retourne_Dimension_Bandeau_Et_Bord' doit être placée avant la création du premier objet !" TERMINATE END_IF ' création des VARIABLES GLOBALES IF VARIABLE("bandeau%")=0 THEN DIM bandeau% IF VARIABLE("bord%")=0 THEN DIM bord% ' Calcul de bandeau% et bord% DIM_LOCAL w0%,h0%,w1%,h1%,w2%,h2% w0%=WIDTH(0) : h0%=HEIGHT(0) PICTURE 1 : FULL_SPACE 1 : w1%=WIDTH(1) : h1%=HEIGHT(1) w2%=w0%-w1% : h2%=h0%-h1% : bandeau%=h2%-(w2%/2) : bord%=w2%/2 ' Suppression du Picture devenu inutile DELETE 1 END_SUB
SUB AIDE() DIM_LOCAL a$ ' Système d`aide du programme APPLICATION_TITLE "Règles du jeu PUISSANCE 4" a$=" Le but du jeu est d'aligner 4 pions de sa couleur dans le sens"+chr$(13) a$=a$+"horizontal, vertical ou diagonal. Le premier qui réalise cela a"+chr$(13) a$=a$+"gagné et le jeu s'arrête. Si toutes les cases du jeu sont remplies"+chr$(13) a$=a$+"sans que cela ait pu être réalisé, alors la partie est nulle."+chr$(13)+chr$(13) a$=a$+"Cliquez dans une colonne avec au moins un emplacement de libre"+chr$(13) a$=a$+"pour lacher le pion dans cette colonne" MESSAGE a$ END_SUB
SUB Dessine_Pion(Col%,Ligne,Couleur%) IF Couleur% = JAUNE% 2D_FILL_COLOR 230,230,50 ELSE IF Couleur% = ROUGE% 2D_FILL_COLOR 240,50,50 ELSE 2D_FILL_COLOR 230,50,230 END_IF END_IF 2D_CIRCLE Col% * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Ligne * (Largeur_pion% + Bordure%) + Bordure% + Largeur_pion% / 2, Largeur_pion% / 2 END_SUB
SUB Fin() wait 2000 Terminate END_SUB
SUB Verifie_victoire(COLONNE%,LIGNE%) dim_local i%,j%,k%, pions% resultat%=0 for i%=1 to NB_COLONNES% - 3 for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% resultat%=pions% P_Gagne%(0,0) = i% : P_Gagne%(0,1) = j% for k% = 1 to 3 P_Gagne%(k%,0) = i%+k% : P_Gagne%(k%,1) = j%+k% next k% end_if next j% next i%
if resultat% =0 for i%=4 to NB_COLONNES% for j%=1 to 3 pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%-k%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% resultat%=pions% P_Gagne%(0,0) = i% : P_Gagne%(0,1) = j% for k% = 1 to 3 P_Gagne%(k%,0) = i%-k% : P_Gagne%(k%,1) = j%+k% next k% end_if next j% next i% end_if
if resultat% =0 i%=COLONNE% for j%=1 to (NB_LIGNES% - 3) pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%,j%+k%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% resultat%=pions% P_Gagne%(0,0) = i% : P_Gagne%(0,1) = j% for k% = 1 to 3 P_Gagne%(k%,0) = i% : P_Gagne%(k%,1) = j%+k% next k% end_if next j% end_if
if resultat% =0 j% = LIGNE% for i%=1 to (NB_COLONNES% - 3) : rem Horizontale pions% = GRILLE%(i%,j%) for k% = 1 to 3 pions%= pions% + GRILLE%(i%+k%,j%) next k% if pions%=4*ROUGE% or pions%=4*JAUNE% resultat%=pions% P_Gagne%(0,0) = i% : P_Gagne%(0,1) = j% for k% = 1 to 3 P_Gagne%(k%,0) = i%+k% : P_Gagne%(k%,1) = j% next k% end_if next i% end_if END_SUB
SUB Change_Tour() IF Tour% = JAUNE% Tour% = ROUGE% ELSE Tour% = JAUNE% END_IF IF Aff_tour% = 1 THEN 2D_TARGET_IS 0 : Dessine_Pion(5, NB_LIGNES% + 0.6,Tour%) END_SUB
SUB Sauve_grille() dim_local i%,j% FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Sauve_Grille%(j%,i%) = Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Sauve_Colonnes%(j%) = Colonnes%(j%) NEXT j% END_SUB
SUB Restore_grille() dim_local i%,j% NB_VIDES% = NB_VIDES% + 1 FOR i% = 1 TO NB_LIGNES% FOR j% = 1 TO NB_COLONNES% Grille%(j%,i%) = Sauve_Grille%(j%,i%) NEXT j% NEXT i% FOR j% = 1 TO NB_COLONNES% Colonnes%(j%) = Sauve_Colonnes%(j%) NEXT j% END_SUB
SUB Ordi_essai_gagne() dim_local j% FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF resultat% = 4 * C_Ordi% Dessine_Pion2(j%) Victoire() j% = NB_COLONNES% : sortie% = 1 ELSE Restore_grille() END_IF END_IF NEXT j% END_SUB
SUB Ordi_empeche_victoire() dim_local j% Aff_tour% = 0 : Change_tour() FOR j% = 1 TO NB_COLONNES% IF Debug% = 1 THEN CAPTION F_Debug%, "Colonnes%(" + STR$(j%) + "): "+STR$(Colonnes%(j%))+ " - Ordi_empeche_victoire" IF Colonnes%(j%) < NB_LIGNES% Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF ABS(resultat%) = 4 Message$ = "Jeu auto en" + STR$(j%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Restore_grille() Change_tour() Ajoute_Pion(j%) Dessine_Pion2(j%) j% = NB_COLONNES% : sortie%= 1 : Change_tour() ELSE Restore_grille() END_IF END_IF NEXT j% Aff_tour% = 1 : Change_tour() END_SUB
SUB Ordi_empeche_victoire_suiv() dim_local i%,j% Aff_tour% = 0 : NB_jouables% = 0 FOR j% = 1 TO NB_COLONNES% IF Debug% = 1 THEN CAPTION F_Debug%, "Colonnes%(" + STR$(j%) + "): "+STR$(Colonnes%(j%))+ " - Ordi_empeche_victoire_suiv" IF Colonnes%(j%) < (NB_LIGNES% - 1) Ajoute_Pion(j%) : Change_tour() : Ajoute_Pion(j%) Verifie_victoire(j%, Colonnes%(j%)) IF ABS(resultat%) <> 4 NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% END_IF Restore_grille(): NB_VIDES% = NB_VIDES% + 1 : Change_tour() ELSE IF Colonnes%(j%) = (NB_LIGNES% - 1) NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% Restore_grille() END_IF END_IF NEXT j% IF NB_jouables% = 0 FOR j% = 1 TO NB_COLONNES% IF Colonnes%(j%) < NB_LIGNES% NB_jouables% = NB_jouables%+1 col_jouables%(NB_jouables%) = j% END_IF NEXT j% i%=INT(RND(NB_jouables%))+1 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(col_jouables%(i%)) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(col_jouables%(i%)) Dessine_Pion2(col_jouables%(i%)) sortie% = 1 ELSE i%=INT(RND(NB_jouables%))+1 Message$ = "L'ordinateur joue dans la colonne n°" + STR$(col_jouables%(i%)) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ : WAIT Tps_Msg_Debug% Ajoute_Pion(col_jouables%(i%)) Dessine_Pion2(col_jouables%(i%)) sortie% = 1 END_IF Aff_tour% = 1 END_SUB
SUB Ordi_joue() dim_local i%,j%
sortie% = 0 Sauve_grille() Ordi_essai_gagne() IF sortie% = 0 THEN Ordi_empeche_victoire() IF sortie% = 0 AND NB_VIDES% > 1 THEN Ordi_empeche_victoire_suiv() END_SUB
SUB Ajoute_Pion(Col%) Colonnes%(Col%) = Colonnes%(Col%) + 1 Grille%(Col%, Colonnes%(Col%)) = Tour% NB_VIDES% = NB_VIDES% - 1 END_SUB
SUB Dessine_Pion2(Colonne%) 2D_TARGET_IS N_Grille% Dessine_Pion(Colonne% -1, NB_LIGNES% - Colonnes%(Colonne%),Tour%) END_SUB
SUB Victoire() dim_local i%,j%,k% BEEP j% = Tour% : message$ ="" FOR i% = 0 TO 7 IF j% = Tour% THEN j% = GAGNE% : ELSE: j% = Tour% FOR k% = 0 TO 3 Dessine_Pion(P_Gagne%(k%,0) -1, NB_LIGNES% - P_Gagne%(k%,1),j%) IF i% = 0 IF message$ <> "" THEN message$ = message$ + " : " message$ = message$ + "P_Gagne%(" + STR$(k%) + ") = (" + STR$(P_Gagne%(k%,0)) + " , " + STR$(P_Gagne%(k%,1)) + ")" IF Debug% = 1 THEN CAPTION F_Debug%, message$ END_IF NEXT k% WAIT 200 NEXT i% message$="Bravo, la partie est finie"+ CHR$(13) + "LES " IF resultat%= 4*JAUNE% THEN message$=message$+"JAUNES" IF resultat%= 4*ROUGE% THEN message$=message$+"ROUGES" message$=message$ + " ONT GAGNE !" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_SUB
SUB Verifie_complet() IF NB_VIDES% = 0 message$="Partie nulle, la grille est pleine" +CHR$(13) message$=message$+"Personne n'a réussi à gagner" IF MESSAGE_CONFIRMATION_OK(message$) > -1 THEN Fin() IF Debug% = 1 CAPTION M_Debug%, Message$ END_IF Fin() END_IF END_SUB
Clic: OFF_CLICK N_Grille% Num% = INT((MOUSE_X_POSITION(N_Grille%) - 0.5 * Bordure%) / (Largeur_pion% + Bordure%)) + 1 Message$ = "Clic sur la colonne n°" + STR$(Num%) IF Debug% = 1 THEN CAPTION M_Debug%, Message$ IF Debug% = 1 THEN CAPTION F_Debug%, "Colonnes%(Num%): "+STR$(Colonnes%(Num%))+ " - Clic" IF Colonnes%(Num%) < NB_LIGNES% Ajoute_Pion(Num%) Dessine_Pion2(Num%) : WAIT 50 Verifie_victoire(Num%, Colonnes%(Num%)) IF resultat%<>0 THEN Victoire() Verifie_complet() IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() Ordi_joue() Verifie_complet() IF Debug% = 1 THEN DEBUG_GRILLE() Change_Tour() END_IF ON_CLICK N_Grille%,clic RETURN | |
| | | Yannick
Nombre de messages : 8610 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: RE Sam 7 Jan 2017 - 0:23 | |
| SUPERBE ! Bravo Jicehel ! Tout comme Minibug, après une cuisante défaite , j' ai du lui montrer qui était le Maître . | |
| | | Jean Claude
Nombre de messages : 5948 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Une premiere version de puissance 4 Sam 7 Jan 2017 - 9:24 | |
| Bonjour,
Ce dernier code fonctionne parfaitement à partir de l'éditeur, mais j'ai un petit souci avec et j'ai peut-être bien trouvé un bug de la dernière version Panoramic. Avant de parler de bug, il faudrait que vous essayez de transformer ce code en exécutable et de l'utiliser. Chez moi l'exécutable affiche le message d’accueil, puis le plateau de jeu et après c'est terminé, plus de réaction du programme au clic de souris.
J'ai recommencé plusieurs fois, rien y fait.
Pouvez-vous essayer de votre coté SVP.
A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 51 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Une premiere version de puissance 4 Sam 7 Jan 2017 - 10:35 | |
| Je vais essayer et je pense que j'essayerais aussi d'ajouter une petite fonction avant le tirage aléatoire pour augmenter l'intelligence du programme en le faisant jouer s'il le peut pour obtenir un alignement de 3 pions et d'une case vide ou sinon pour empêcher son adversaire de le faire.
| |
| | | Contenu sponsorisé
| Sujet: Re: Une premiere version de puissance 4 | |
| |
| | | | Une premiere version de puissance 4 | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |