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

Composants VCL Delphi Discussion :

DrawGrid Array Variable Maze


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2012
    Messages : 142
    Points : 80
    Points
    80
    Par défaut DrawGrid Array Variable Maze
    Bonjour a tous

    Voila j'ai une variable du type string qui contient des F est des W pour constituer une map , W = Murs , F = Espace Libre

    Ex:
    Maze : 10 Colonnes 10 lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WWWWWWWWWW
    WFFWFFWFFW
    WFFWFFWFFW
    WFFWFFWFFW
    WFFWFFWFFW
    WFFWFFWFFW
    WFFWFFWFFW
    WFFWFFWFFW
    WFFWFFWFFW
    WWWWWWWWWW
    Mais mon petit problème c'est que je veux rentré cette map dans mon tableaux

    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
    type
      TCode = (W, F);
     
       Map: array[0..9, 0..9] of TCode;
     
    const
      Maze = 'WWWWWWWWWWWFFWFFWFFWWFFWFFWFFWWFFWFFWFFWWFFWFFWFFWWFFWFFWFFWWFFWFFWFFWWFFWFFWFFWWFFWFFWFFWWWWWWWWWWW';
     
    function CharCode(IChar: Char): TCode;
    begin
      Result := F;
      case IChar of
        'W': Result := W;
        'F': Result := F;
      end;
    end;
     
     
    procedure TForm1.ChrMapClick(Sender: TObject);
    var
     I: Integer;
     Col, Row: Integer;
    begin
       for I := 0 to Length(Maze) do
        begin
           // Est la je bloque, il faut que je rentre chaque lettre du Maze dans le tableau en respectant les Colonnes est les lignes en sachent que
          // le Maze fait 10 colonnes est 10 lignes.
         Map[Col,Row] := CharCode(?);
        End;
    end;
     
    procedure TForm1.DrawGridDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      with DrawGrid.Canvas do
      begin
      case Map[ACol,ARow] of
        W: Draw(Rect.Left +1, Rect.Top +1, ImW.Picture.Graphic);
        F: Draw(Rect.Left +1, Rect.Top +1, ImF.Picture.Graphic);
      end;
    end;
    end;

    Merci pour votre réponse.
    Il n'existe guère de problèmes sans solution, et parfois l'absence de solution décourage le problème

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Récupère colonne/ligne à l'aide de div et mod à partir de l'indice du caractère dans la chaîne.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Dans le cas d'un tableau statique, les données sont alignées. On peut donc considérer ce tableau comme une ligne de 100 éléments et faire pointer une deuxième variable de ce type sur la même adresse mémoire à l'aide d' absolute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      Map    :array[0..9, 0..9] of TCode;
      RawMap :array[1..100] of TCode absolute Map;
     
    ...
     
    for I := 1 to Length(Maze) do
      RawMap[i] := CharCode(Maze[i]);
    La seule différence ensuite est que la première dimension est la ligne et non la colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case Map[ARow,ACol] of
      W: ...;
      F: ...;
    end;
    Bien sûr, div/mod irait très bien aussi

    Et à moins qu'il faille un contrôle d'erreur, tu peux te passer de cette fonction CharCode en initialisant les données de l'ensemble et en transtypant directement les caractères en TCode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
      TCode = (W=87, F=70);
    //ou TCode = (W=ord('W'), F=ord('F'));
     
    ...
     
    for I := 1 to Length(Maze) do
        RawMap[i] := TCode(Maze[i]);

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2012
    Messages : 142
    Points : 80
    Points
    80
    Par défaut Déplacement du joueur
    Tout abord Andnotor , J'aurai vraiment pas pensé a sa , pourquoi chercher a faire complication ton peu faire simple

    Mais cela me pose un petit problème sa chamboule tout pour la direction du joueur Je n'arrive pas a aller dans les bonne directions

    J'ai commencer ceci :

    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
     
     
    type
      TCode = (W, F, J);
     
    ... 
     
    const
      Maze = 'WWWWWWWWWWWFFWFFWFFFFFFWFFWFFFFFFWFFWFFFFFFWFFWFFFFFFWFFWFFFFFFWFFWFFFFFFWFFWFFFFFFWFFWFFWWWWWWWWWWW';
     
    var 
      Map    :array[0..9, 0..9] of TCode;
      RawMap :array[1..100] of TCode absolute Map;
     
     
      Jx, Jy, NewJX, NewJY: Integer; // Position du joueur 
     
     
    // Info ...
    // W = Mur
    // F  = Espace libre
    // J  = Joueur
     
    function CharCode(IChar: Char): TCode;
    begin
      Result := F;
      case IChar of
        'W': Result := W;
        'F': Result := F;
        'J': Result := J;
      end;
    end;
     
    procedure TForm1.ChrMapClick(Sender: TObject);
    var
     I: Integer;
    begin
       for I := 1 to Length(Maze) do
        begin
          RawMap[i] := CharCode(Maze[i]);
        End;
     
    procedure TForm1.GameDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      with Game.Canvas do
      begin
      case Map[ACol,ARow] of
        W: Draw(Rect.Left +1, Rect.Top +1, ImW.Picture.Graphic);
        F: Draw(Rect.Left +1, Rect.Top +1, ImF.Picture.Graphic);
        J:  Draw(Rect.Left +1, Rect.Top +1, ImJ.Picture.Graphic);
      end;
    end;
    end;
     
    procedure TForm1.JMove;
    begin
     // Ancienne position du joueur
     if Map[Jy,Jx] = J then
      begin
       Map[Jy,Jx] := F;
       GameDrawCell(Self,Jx, Jy, Rect(Jx*16, Jy*16, Jx*16+15, Jy*16+15),[]);
      end;
     
      Jx := NewJX;
      Jy := NewJY;
     
    // Nouvelle position du joueur
       if Map[Jy,Jx] = F then
      begin
       Map[Jy,Jx] := J; 
       GameDrawCell(Self,Jx, Jy, Rect(Jx*16, Jy*16, Jx*16+15, Jy*16+15),[]);
      end;
    end;
     
    procedure TForm1.GameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (key < 41) and (key > 36) then 
       begin
     
        NewJX := Jx;
        NewJY := Jy;
     
     
        case key of
          // Y
          38: if NewJY > 0 then NewJY := Jy-1;
          40: if NewJY < 9 then NewJY := Jy+1;
         // X
          37: if NewJX > 0 then NewJX := Jx-1;
          39: if NewJX < 9 then NewJX := Jx+1;
        end;
     
        case Map[NewJx,NewJY] of
          F: MoveBlip;
        end;
      end;
    end;
    Merci pour votre réponse.
    Il n'existe guère de problèmes sans solution, et parfois l'absence de solution décourage le problème

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 041
    Points : 40 950
    Points
    40 950
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Gregory666 Voir le message
    J'aurai vraiment pas pensé a sa , pourquoi chercher a faire complication ton peu faire simple
    Mais cela me pose un petit problème sa chamboule tout pour la direction du joueur Je n'arrive pas a aller dans les bonne directions
    Bonjour,
    un petit aparté, bien que un peu hors sujet. La grammaire et l'orthographe ça aide pour les demandes d'emplois !

    cela fait plusieurs fois que je lis dans tes posts le "sa" (de sa chose) et le "ça" (de c'est cela), et cela ça me choque. Le reste est du même acabit je sais qu'il était tard ou tôt lors de ce message mais

    je n'aurais vraiment pas pensé à ça, pourquoi chercher les complications quand on peut faire simple ?
    Mais cela me pose un petit problème : ça chamboule tout pour la direction du joueur, je n'arrive pas à aller dans les bonnes directions
    cela à quand même plus de gueule non ? même s'il reste encore des approximations.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Citation Envoyé par Gregory666 Voir le message
    Mais cela me pose un petit problème sa chamboule tout pour la direction du joueur. Je n'arrive pas a aller dans les bonne directions
    Je me cite

    Citation Envoyé par Andnotor Voir le message
    La seule différence ensuite est que la première dimension est la ligne et non la colonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case Map[ARow,ACol] of
      W: ...;
      F: ...;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. String de longueur variable dans un array variable
    Par kgb1917 dans le forum VBA Access
    Réponses: 4
    Dernier message: 07/01/2012, 15h51
  2. Réponses: 8
    Dernier message: 25/02/2006, 17h31
  3. [C++/CLI] Libérer une variable du type cli::array
    Par ekinox17 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 25/01/2006, 09h16
  4. Filtrer une requete avec une variable array
    Par hugo69 dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/11/2005, 14h33
  5. Array à valeur variables
    Par klipfel dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/12/2004, 16h22

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