IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Problème pour le jeu de la vie


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 133
    Points : 51
    Points
    51
    Par défaut Problème pour le jeu de la vie
    bonjour,

    Voilà, je débute en delphi et je vien de m'amuser a faire le célèbre jeu de la Vie à ma façon. Seulement voilà, je voudrais encore faire deux choses

    1) diminuer ou augmenter la vitesse de reproduction des cellules avec la trackbar, mais je n'arrive pas à faire le code...

    2)permettre au joueur de cliquer gauche pour mettre une bactérie
    cliquer droit pour la supprimer (ou recliquer gauche dessus pour la supprimer..)

    Voilà, si quelqu'un a des idées poure le bout de codes, merci d'avance!!!

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, ComCtrls;
     
    type
      TForm1 = class(TForm)
        sg: TStringGrid;
        btQuitter: TButton;
        btdepart: TButton;
        btStop: TButton;
        Rafraichissement: TButton;
        TrackBar1: TTrackBar;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure btQuitterClick(Sender: TObject);
        procedure sgDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
          State: TGridDrawState);
        procedure btInitialiserClick(Sender: TObject);
        procedure btStopClick(Sender: TObject);
        procedure btdepartClick(Sender: TObject);
        procedure RafraichissementClick(Sender: TObject);
        procedure TrackBar1Change(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
    Form1: TForm1;
    blStop:boolean;
    TableauVie : array[0..99,0..69] of byte;
    delai:integer;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm1.btQuitterClick(Sender: TObject);
    begin
       btStopClick(sender);
       Close;
    end;
    ////////////////////////////////////////////////////////////////
     
    procedure TForm1.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    //on affecte la couleur rouge ou blanche au SG
    begin
     begin
       with sg do
       begin
          if cells[ACol,ARow]='' then Canvas.brush.Color:=clWhite
                                 else Canvas.Brush.Color:=clRed;
          Canvas.Brush.Style:=bsSolid;
          Canvas.Rectangle(Rect.Left-1,Rect.Top-1,Rect.Right+1,Rect.Bottom+1);
       end;
    end;
    end;
    ////////////////////////////////////////////////////////////////
     
     
    procedure TForm1.btInitialiserClick(Sender: TObject);
    var k,x,y:integer;
    begin
    blStop:=false;
    randomize;
    for k:=1 to 1000 do
    begin
       x:=1+random(98); // x est un entier compris entre 1 et 98 inclus
       y:=1+random(68); // y est un entier compris entre 1 et 68 inclus
       sg.Cells[x,y]:='1';
    end;
    btDepart.Enabled:=true; //on affecte la propriété true au bouton btDepart
    btStop.Enabled:=true;
    end;
    ///////////////////////////////////////////////////////////////////
     
     
     
    procedure TForm1.btStopClick(Sender: TObject);
    begin
       blStop:=True;
       btStop.Enabled:=false;
       btDepart.Enabled:=true;
    end;
    ////////////////////////////////////////////////////////////////////
     
     
    function NbCellulesInfectees(i,j:byte):byte;
    begin
       NbCellulesInfectees:=
          TableauVie[i-1,j-1]+TableauVie[i,j-1]+TableauVie[i+1,j-1]+
          TableauVie[i-1,j]+TableauVie[i+1,j]+
          TableauVie[i-1,j+1]+TableauVie[i,j+1]+TableauVie[i+1,j+1];
    end;
    ////////////////////////////////////////////////////////////////////
     
     
    procedure TForm1.btdepartClick(Sender: TObject);
    var x,y,n:integer;
    begin
    repeat
       for x:=1 to 99 do for y:=0 to 69 do
          if sg.cells[x,y]='1' then TableauVie[x,y]:=1
                                     else TableauVie[x,y]:=0;
       for x:=1 to 98 do for y:=1 to 68 do
       begin
          n:=NbCellulesInfectees(x,y);
          if TableauVie[x,y]=1 then
          begin
             if (n<2)or(n>3) then sg.cells[x,y]:=''
          end
          else if n=3 then sg.cells[x,y]:='1';
       end;
       sg.Refresh;
       Application.ProcessMessages;
    until blStop;
    end;
     
     
    procedure TForm1.RafraichissementClick(Sender: TObject);
    var x,y:integer;
    begin
            for x:=0 to 99 do
            for y:=0 to 69 do
            sg.cells[x,y]:='';
    end;
     
    procedure TForm1.TrackBar1Change(Sender: TObject);
    begin
    delai:=TrackBar1.Position;
     
    end;
     
    end.

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par daninou Voir le message
    1) diminuer ou augmenter la vitesse de reproduction des cellules avec la trackbar, mais je n'arrive pas à faire le code...
    Suffit de mettre une trackbar, definir les property Max/Min et Pos en mode design, puis dans la boucle de calcul des generation recuperer la valeur de la trackbar et traiter la vitesse.
    En fait a voir mieux ton code, j'opterais pour un timer dont on modifirais sur chaques evenement OnTimer la valeur de la property "Interval" en fonction de la valeur de la trackbar. On y ajouterais aussi le code de rafraichissement de la grille.
    Pour plus d'infos, F1 sur TTimer

    Citation Envoyé par daninou Voir le message
    2)permettre au joueur de cliquer gauche pour mettre une bactérie
    cliquer droit pour la supprimer (ou recliquer gauche dessus pour la supprimer..)
    LE click droit/Gauche est capté par l'evenement OnMouseDown/up de la stringgrid.
    le parametre Button designe le type de bouton qui a ete clické : mbLeft, mbMiddle, mbRight (de memoire)
    En testant cette valeur tu peux executer les differents bouts de codes que tu souhaite.
    Note : Dans ton cas, seul up ou down suffit ... sinon tu execute ton code 2 fois. Quand le bouton est pressé ... et quand il est relaché
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 133
    Points : 51
    Points
    51
    Par défaut
    merci pour ces réponses si rapide

    Pour le timer, ca me parait un peu compliquer pour le moment...

    Donc je vais essayé d'agir sur l' evenements "Onmouse down", en mettant le code...

    Je vous tiens au courant,

    Merci

    ++

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 133
    Points : 51
    Points
    51
    Par défaut
    J'ai essayé avec ce code, ca complile bien..mais ca ne fait rien....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.sgMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
    if sg.Cells[x,y]='' then Canvas.Brush.Color:=clRed
                            else Canvas.Brush.Color:=clWhite;
    end;
    Je réessaie

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 133
    Points : 51
    Points
    51
    Par défaut
    J'ai aussi essayé ce code, pareil.. pas d'erreur mais ca ne change rien..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.sgMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
            with sg do begin
            if Cells[x,y]=''
            then Canvas.Brush.Color:=clRed
            else Canvas.Brush.Color:=clWhite;
    Je patauge...

    Merci pour l'aide en tout cas, c'est bien cool

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Dans le code que tu as mis, tu n'utilise pas les parametres pour detecter si c'est un click gauche ou droit.
    Si tu n'as pas besoin de faire la difference, tu peux simpelment passer par l'evenement OnClick tout court ....

    Sinon je te conseille plutot de modifier la proprietee du tableau memoire plutot que directement la valeur de la cellule.

    D'ailleur, l'ideal est de mmodifier le contenu de ton tableau memoire et de piocher dans ce tableau la valeur de la cellule a dessiner

    [Edit]
    En fait tu fais l'inverse ... tu rempli ton tableau a partir du graph au lieu de dessiner ton graph a partir des donnees du tabelau
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 133
    Points : 51
    Points
    51
    Par défaut
    Je te remercie beaucoup pour ces réponses (surtout à cette heure!!)

    Mais je n'y arrive pas, je ne comprend pas le truc...

    Avec ce code, j'ai une grosse erreur d'exucution!.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var x,y:integer;
    begin
    if sg.cells[x,y]='' then TableauVie[x,y]:=1
                                     else TableauVie[x,y]:=0;

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    x et y ne sont pas affectés.
    Normalement elles sont initialisées a 0 par defaut .. sauf dans si se sont des variables locales.
    Pourquoi ?
    Simplement parce qu'une variable locale (a une procedure par exemple) peut etre creer tres tres souvent (mettons dans le cadre d'un appel reccursif de cette fonction) et cela couterais en temps.

    Principe : On a une fonction qui declare un tableau de 1.000.000 de cases qui sera rempli avec les valeurs d'un tableau passé en parametre (sorte de tableaux temporaire).
    A chaque appels de fonction Delphi effectuerais une boucle de 1.000.000 d'iterations pour mettre toutes les variables du tableau a 0, puis nous meme on rebouclerais 1.000.000 de fois pour affecter nos propres valeurs.
    Soit 2.000.000 d'iterations.

    Dans le cadre d'un appel recursif, de 1.000 appels, ca fera 2.000.000.000 d'affectation dont la motiée est inutile !!

    Donc par defaut, pour les variables locales, Delphi suppose que nous gerons nous meme l'initialisation si besoin est pour eviter de perdre ce temps precieux.

    Pour ce qui est des variables globales, c'est different car elles sont crees a l'initialisation de l'application et une seule fois. Le coup en temps n'est pas enorme

    Pour resumé, ton x et y existent bien mais possede comme valeur le residu memoire qui traine la ou elles ont ete declarée et peuvent valoire n'importe quoi (et sauf gros coup de pot, certainement pas dans les limites du tableau )

    [Edit]
    En ce qui concerne la gestion graphique, tu as un tableau memoire qui contient la population de ton jeu de la vie.
    Dans le gestionnaire d'evenement, tu recupere les coordonnés x et y de la cellule a dessiner (ie en cours de dessin) et tu teste la case de ton tableau.
    Selon la valeur de ton tableau memoire, tu dessine la cellule de telle ou telle couleur.

    Ensuite pour la gestion du dessin je te parlais d'un timer.
    Pose un composant TTimer sur ta forme, regle le parametre Interval a la duree entre 2 appels que tu desire. 1000 = 1 seconde (interval = milisecondes)
    Ensuite dans le seul gestionaire d'evenement de ce composant (OnTimer) tu lance la procedure qui recalcule la nouvelle population : Parcours ton tableau memoire et met a jour le contenu des cellules en fonction de leurs voisins.
    ensuite, appele la fonction Refresh de ton StringGrid pour actualiser l'affichage.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 133
    Points : 51
    Points
    51
    Par défaut
    Merci beaucoup pour ce cours Clorish

    J'ai essayer autre chose avec l'évènement Onmousedown et ca marche!

    Voici le bout de code en fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.sgMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      var Acol, Arow: integer;
    begin
    sg.MouseToCell(X,Y,Acol,Arow);
    if (Button = mbLeft) then sg.Cells[Acol,Arow]:='1'
    else if (Button = mbRight) then sg.Cells[Acol,Arow]:='';
    end;


    Par contre, pour le timer, je sais l'ajouter, et régler le paramettre interval mais
    cà:

    tu lance la procedure qui recalcule la nouvelle population : Parcours ton tableau memoire et met a jour le contenu des cellules en fonction de leurs voisins.
    ensuite, appele la fonction Refresh de ton StringGrid pour actualiser l'affichage.
    Je ne comprend pas vraiment comment faire pour faire cette procédure...

    Mais je continu à persévérer, c'est en forgeant qu'on devient forgeron

    Cela dit, maintenant que j'en suis au timer, les aides sont encore les bienvenues!!!

    Merci encore

Discussions similaires

  1. [SDL et C] Problème avec mon jeu de la vie
    Par _SamSoft_ dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 24/05/2008, 09h43
  2. Problème pour le jeu de tests
    Par bolltt dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/01/2008, 23h05
  3. Problème pour un jeu de pong
    Par Galip dans le forum C++Builder
    Réponses: 4
    Dernier message: 05/04/2007, 08h28
  4. Conway's life (jeu de la vie) pour images
    Par O( N ) dans le forum C
    Réponses: 1
    Dernier message: 26/09/2006, 02h13
  5. Problème d'accelération pour un jeu
    Par jbidou88 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 08/05/2006, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo