Quatre-en-ligne (Puissance 4)

Présentation
C'est un "Puissance 4" écrit pour Lazarus.

Les points intéressants sont, d'une part, l'emploi de la bibliothèque BGRABitmap, et d'autre part la façon dont l'interface graphique communique avec le moteur de jeu.

Le moteur est une application console séparée. A chaque fois que l'ordinateur doit jouer, l'interface lance le moteur, au moyen de la fonction RunCommand() de l'unité Process. La liste des coups déjà joués est passé en paramètre, sous la forme d'une chaîne composée de caractères compris entre "1" et "7". Le moteur initialise sa grille interne en fonction de cette chaîne, et renvoie son coup. L'interface peut donc être utilisée avec un autre moteur, sans être recompilée, le nom du moteur étant contenu dans un fichier de configuration.

15/04/2014 : L'application console a été remplacée par une bibliothèque dynamique.
15/08/2014 : Amélioration de l'aspect des pions.
Téléchargement
Compatibilité
Windows
2  0 
Téléchargé 72 fois Voir les 8 commentaires
Détails
Catégories : Programmes complets
Avatar de Roland Chastain
Rédacteur / Modérateur
Voir tous les téléchargements de l'auteur
Licence : Autre
Date de mise en ligne : 19 décembre 2014




Avatar de Paul TOTH Paul TOTH - Expert éminent sénior https://www.developpez.com
le 15/10/2013 à 7:38
amusant,

ça me rappelle un très vieux projet de Pascal Peyrmorte sur le jeu "Schlurp"...nom tiré du son produit par ce mini-jeu inclut dans "The 7Th Guest" (un des premiers jeu PC sur CDROM, ça ne nous rajeuni pas !)

le jeu avait la particularité de proposer un système de plugin pour contrôler l'IA ce qui a donné lieu à un petit concours de programmation.

http://peyremorte.fr/Programmation/Schlurp/Schlurp.htm
Avatar de Roland Chastain Roland Chastain - Rédacteur/Modérateur https://www.developpez.com
le 15/10/2013 à 13:14
C'est intéressant, merci pour le lien. J'ai téléchargé le jeu et les "joueurs" : je vais regarder tout ça de près.

En attendant, quel serait l'intérêt d'utiliser une DLL plutôt qu'un exécutable ?
Avatar de Roland Chastain Roland Chastain - Rédacteur/Modérateur https://www.developpez.com
le 15/10/2013 à 18:00
Je me suis rendu compte de certaines lacunes dans mon programme. Si je clique sur une colonne pleine, le pion est quand même ajouté. Si je clique pendant qu'un pion est encore en train de tomber, le pion qui tombe s'arrête et un deuxième pion de la même couleur est ajouté. J'oublie toujours de prendre en compte l'usage incorrect que l'utilisateur pourrait faire du programme.

Voici le squelette d'un moteur en Pascal. Celui-ci joue au hasard. A vrai dire, il n'est pas tout à fait complet, car il ne vérifie pas si la chaîne passé en paramètre ne correspond pas à une partie déjà finie par la victoire de l'un ou l'autre des joueurs. Mais enfin, c'est pour montrer le principe.

Code : Sélectionner tout
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
32
33
34
35
36
37
 
program hasard; 
{$APPTYPE CONSOLE} 
 
var 
  h: string; // histoire de la partie 
  t: array[1..7]of integer = (0, 0, 0, 0, 0, 0, 0); // tableau pour compter les pions 
  r: integer; // réponse 
  i: integer; // index 
  v: boolean = true; // validité de la chaîne 
 
begin 
  h := ParamStr(1); 
 
  for i := 1 to Length(h) do 
    if (h[i] >= '1') and (h[i] <= '7') then 
      Inc(t[i]) 
    else 
      v := false; 
 
  if v then 
    for i := 1 to Length(h) do 
      if t[i] > 6 then 
        v := false; 
 
  if v then 
  begin 
    Randomize; 
    repeat 
      r := Trunc(Random(7) + 1); 
    until t[r] < 6; 
  end 
  else 
    r := 0; 
 
  Write(r); 
end.
Une fois ce programme compilé, il n'y a plus qu'à modifier en conséquence le fichier options.ini.

Code : Sélectionner tout
1
2
3
[joueurs] 
blanc=utilisateur 
noir=hasard.exe
Avatar de Paul TOTH Paul TOTH - Expert éminent sénior https://www.developpez.com
le 15/10/2013 à 18:24
Citation Envoyé par Roland Chastain  Voir le message
C'est intéressant, merci pour le lien. J'ai téléchargé le jeu et les "joueurs" : je vais regarder tout ça de près.

En attendant, quel serait l'intérêt d'utiliser une DLL plutôt qu'un exécutable ?

l'intérêt principal c'est que tu peux interagir plus facilement entre les deux car ils sont dans le même espace mémoire alors que l'exécutable se lance dans un nouveau process. La DLL peut même en profiter pour préparer les coups suivant pendant que le jour réfléchi alors qu'avec un exe il ne sera relancé qu'au prochain coup.
Avatar de Roland Chastain Roland Chastain - Rédacteur/Modérateur https://www.developpez.com
le 12/04/2014 à 22:17
Bonjour ! Je vous présente la nouvelle version de mon Puissance 4 pour Lazarus.

Le moteur a été remplacé. Les défauts de la version précédente (signalés plus haut dans cette discussion) ont été corrigés. Enfin, plusieurs couleurs sont disponibles pour l'interface. (Pour modifier la couleur, il faut éditer manuellement le fichier options.ini et choisir l'une des valeurs disponibles : blue, gray, green, indigo.)
Avatar de Roland Chastain Roland Chastain - Rédacteur/Modérateur https://www.developpez.com
le 15/04/2014 à 23:01
Une nouvelle version est disponible.



L'application console qui servait de moteur a été remplacée par une bibliothèque dynamique.
Avatar de circular17 circular17 - Membre confirmé https://www.developpez.com
le 14/08/2014 à 23:37
Felicitation pour ce petit jeu.

Si je puis me permettre, voila une suggestion pour ameliorer l'aspect des pions:
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Uses ..., BGRAGradientScanner; 
 
procedure TForm1.DrawDisk(x, y: integer; c: TBGRAPixel); 
var 
  img: TBGRABitmap; 
  grad: TBGRACustomScanner; 
begin 
  if c = colors[1] then exit; 
  img := TBGRABitmap.Create(48, 48); 
  if c = colors[2] then 
    grad := TBGRAConstantScanner.Create(c) 
  else 
    grad := TBGRAGradientScanner.Create(ApplyIntensityFast(c,50000),ApplyIntensityFast(c,16000),gtRadial,PointF(8,8),PointF(48,48)); 
  img.FillEllipseAntialias( 
    img.Width / 2, 
    img.Height / 2, 
    7 * img.Width / 16, 
    7 * img.Height / 16, 
    grad 
  ); 
  grad.Free; 
  image.PutImage(x, y, img, dmDrawWithTransparency); 
  img.Free; 
end;
Cordialement
Avatar de Roland Chastain Roland Chastain - Rédacteur/Modérateur https://www.developpez.com
le 15/08/2014 à 7:13
Alors ça c'est très gentil ! J'aime beaucoup le résultat (voir la capture d'écran dans le premier message de cette discussion). Le téléchargement a été mis à jour. Grand merci !
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Responsables bénévoles de la rubrique Lazarus : Alcatîz - Gilles Vasseur -