2017-05-25 1 views
0

Je travaille sur un simple programme Random Walker qui devrait dessiner une ligne longue de 10p, puis choisir une direction cardinale aléatoire pour dessiner une autre ligne (aussi longue que 10p) jusqu'à ce qu'un certain nombre de lignes soient atteintes .Random Walker loop issue pour C#

J'utilise quatre coordonnées pour dessiner la ligne (deux coordonnées pour X et deux pour Y). Les coordonnées Y sont poussées dans une pile après que chaque ligne est dessinée et elles sont sorties comme les coordonnées X. Cela devrait garantir que le point de départ de chaque seconde ligne est le point final de la ligne précédente.

Le programme s'appuie sur un formulaire Windows après avoir appuyé sur un contrôleur de bouton. A partir de maintenant, la sortie est quelque chose comme ceci:

Output of program...:-(

Ce ici est mon bloc de code de gestionnaire d'événements pour le bouton:

// Graphics and Pen classes instantiated 

     Graphics graphics; 
     graphics = this.CreateGraphics(); 

     Pen pen = new Pen(Color.Black); 
     pen.Width = 1; 

     // lineLength is 10 pixels 
     // gridLength and gridWidth are needed to keep the Random Path inside a 600×600 field (this is not yet implemented in the code) 
     // lineCount is for maximizing the number of lines to be drawn and to control the loop 

     int lineLength = 10; 
     int gridWidth = 600; 
     int gridLength = 600; 
     int lineCount = 0; 

     // Starting line drawn with the following coordinates: 
     int x1 = 20; 
     int x2 = 20; 
     int y1 = 20; 
     int y2 = 30; 

     graphics.DrawLine(pen, x1, y1, x2, y2); 
     lineCount++; 

     // Stack initialized to store "y" coordinates 
     // "y" coordinates should be passed on as "x" coordinates for every consecutive lines 
     // so that the ending point's coordinate of a line 

     Stack<int> stackY = new Stack<int>(); 
     stackY.Push(y2); 
     stackY.Push(y1); 

     for (lineCount = 1; lineCount <= 64; lineCount++) 
     { 
      // X pops current Y coordinates from stack 
      x1 = stackY.Pop(); 
      x2 = stackY.Pop(); 

      // Initializing the random number (between 1 and 4) generator to choose from the cardinal directions 
      Random rnd = new Random(); 
      int dir = rnd.Next(1, 5); 

      switch (dir) 
      { 
       // up 
       case 1: 
        y1 = y1 + lineLength; // y1 plus lineLength 
        graphics.DrawLine(pen, x1, y1, x2, y2); //drawing the line 
        stackY.Push(y2); // pushing the current y coordinates into the stack 
        stackY.Push(y1); 
        break; 

       // right 
       case 2: 
        y1 = y2 + lineLength; // y2 plus lineLength 
        graphics.DrawLine(pen, x1, y1, x2, y2); 
        stackY.Push(y2); 
        stackY.Push(y1); 
        break; 

       // down 
       case 3: 
        y1 = y1 - lineLength; // y1 minus lineLength 
        graphics.DrawLine(pen, x1, y1, x2, y2); 
        stackY.Push(y2); 
        stackY.Push(y1); 
        break; 

       // left 
       case 4: 
        y2 = y2 - lineLength; // y2 minus lineLength 
        graphics.DrawLine(pen, x1, y1, x2, y2); 
        stackY.Push(y2); 
        stackY.Push(y1); 
        break; 

      } //switch 
     } //for  

    } //event handler 

Je ne suis pas vraiment sûr de ce qui a mal tourné - Je vous remercie des heads-up et des conseils! Je vous remercie!

+0

Avez-vous essayé de le déboguer? –

+0

faites-nous une faveur à des fins de dépannage et changez la couleur du stylo lorsque vous obtenez un nombre aléatoire, de cette façon, nous pouvons voir les lignes étant dessinées. Tels que commencer avec le noir, puis le rouge, puis le bleu, puis le vert. Ensuite, faites arrêter le programme et prenez une capture d'écran - il sera beaucoup plus facile de résoudre ce problème que l'image que vous avez jointe. –

+2

Pourquoi poussez-vous les valeurs 'y' et les utilisez ensuite en tant que valeurs' x'? Ce que vous voulez, c'est pousser "x2" et "y2", puis les utiliser comme "x1" et "y1" dans l'itération suivante. – itsme86

Répondre

2

Vous rendez cela beaucoup plus compliqué que nécessaire. De plus, vous mélangez les coordonnées x et y d'une manière qui n'a pas de sens.

Vous n'avez pas besoin d'une pile, il suffit de stocker les points les plus récents. Quelque chose comme ça.

int x = 20, y = 20; 
int new_x = x, new_y = y; 
Random rnd = new Random(); 

for (int i = 0; i < numLines; i++) 
{ 
    int dir = rnd.Next(1, 5); 
    if (dir == 1) new_x += lineLength; 
    if (dir == 2) new_x -= lineLength; 
    if (dir == 3) new_y += lineLength; 
    if (dir == 4) new_y -= lineLength; 

    graphics.DrawLine(pen, x, y, new_x, new_y); 

    x = new_x; 
    y = new_y;  
} 

Aussi, vous n'avez pas besoin redéclarer l'objet Random chaque fois, juste une fois avant que la boucle.