2013-05-13 2 views
-4

Я новичок в программировании, и мне был назначен мини-проект. инструктор был очень неясен относительно того, что я должен делать именно так. Все, что я знаю, это то, что это «случайное блуждание», и я не должен использовать метод, мне нужно использовать только циклы, ветвящиеся и генераторы случайных чисел (даже не уверен в этом). Он также должен получить несколько шагов от пользователя и пройти по указанному номеру. В любом случае, я начинаю с очень ограниченным знанием C#. Я много исследовал здесь, а также во многих других местах, без успеха. коды либо очень сложны, либо находятся на других языках. Я написал немного кода. Я не знаю, правильно ли это. , пожалуйста, дайте мне несколько указателей. Ошибок нет, но программа не работает, есть проблема с условиями.условия в алгоритме случайного блуждания

static void Main(string[] args) 
    { 
     int row = 100; 
     int col = 100; 
     int[,] matrix; 
     matrix = new int[row, col]; 
     int n; 
     Console.WriteLine("Enter the number of steps:"); 
     n = int.Parse(Console.ReadLine()); 
     const int up = 1; 
     const int down = 2; 
     const int left = 3; 
     const int right = 4; 
     int number=0; 
     for (int i=0;i<100;i++) 
     { 
      for (int j = 0; j < 100; j++) 
       matrix[i, j] = number; 
     } 
     Random randomdirection = new Random(); 
     for (int counter = 0; counter < n; counter++) 
     { 
      int direction = randomdirection.Next(1, 5); 
      while (direction == 1) 
      { 
       if ((++col) < 100 && matrix[row, ++col] == 0) 
       { 
        matrix[row, ++col] = ++number; 
       } 
       else 
        break; 
      } 
      while (direction == 2) 
      { 
       if ((--col) < 100 && matrix[row, --col] == 0) 
       { 
        matrix[row, --col] = ++number; 
       } 
       else 
        break; 
      } 
      while (direction == 3) 
      { 
       if ((--row) < 100 && matrix[--row, col] == 0) 
       { 
        matrix[--row, col] = ++number; 
       } 
       else 
        break; 
      } 
      while (direction == 4) 
      { 
       if ((++row) < 100 && matrix[++row,col] == 0) 
       { 
        matrix[++row,col] = ++number; 
       } 
       else 
        break; 
      } 
     } 
     for (int i = 0; i < row; i++) 
     { 
      for (int j = 0; j < col; j++) 
       Console.WriteLine(matrix[i, j]); 
     } 
     Console.ReadKey(); 
    } 

Это назначение: Пьяницы начинает ходить без цели, начиная с фонарным столбом. На каждом шагу времени пьяница забывает, где он или она, и делает один шаг наугад: север, восток, юг или запад, с вероятностью 25%. Как далеко выйдет пьяница из фонарного столба после N шагов? Это очень неполно. Мы не изучали классы и методы, поэтому логически мы не должны их использовать. я считаю, что использовать массивы, циклы и ветвления. Я сам написал код. вот почему это так испортилось.

изменил его следующим образом: кажется, что я не вижу проблемы: ((

static void Main(string[] args) 
    { 
     Random randomObject = new Random(); 
     int randomDirection; 
     int[,] mainarray; 
     int row=10; 
     int col=10; 
     mainarray=new int[row,col]; 
     int number=0; 
     for (int b=0;b<row;b++) 
     { 
      for (int c=0;c<col;c++) 
       mainarray[b,c]=number; 
     } 

     while (true) 
     { 
      int n; 
      Console.WriteLine("Enter the number of steps: "); 
      n = Convert.ToInt32(Console.ReadLine()); 
      for (int i = 0; i < n; i++) 
      { 
       randomDirection = randomObject.Next(1, 5); 
       if (randomDirection == 1 && row < 0 && row < 10) 
        mainarray[++row, col] = ++number; 
       if (randomDirection == 2 && row < 0 && row < 10) 
        mainarray[--row, col] = ++number; 
       if (randomDirection == 3 && col < 0 && col < 10) 
        mainarray[row, ++col] = ++number; 
       if (randomDirection == 4 && col < 0 && col < 10) 
        mainarray[row, --col] = ++number; 
      } 
      for (int i = 0; i < row; i++) 
      { 
       for (int j = 0; j < col; j++) 
        Console.Write(mainarray[i,j]); 
      } 
     } 
     Console.ReadKey(); 
    } 
+0

Вы бы хорошо объяснили, чего хотите достичь –

+2

Откуда у вас этот код? Вам действительно лучше, запустив себя, потому что я на 100% уверен, что вы не пишете этот код. Какой беспорядок ... – Joetjah

+0

'Я не должен использовать метод 'это ваша интерпретация или требование от инструктора? 'есть проблема с условиями. Каково условие и как ваша логика' random walk' хочет течь? – Fendy

ответ

0

Я думаю, что ваш подход в целом неисправен.

Скажите, что у вас есть сетка 100 x 100. И вы хотите пройти произвольные направления для x шагов. Вы хотите что-то вроде этого:

static void Main(string[] args) 
{ 
    Random randomObject = new Random(); 
    int randomDirection; 
    while (true) { //because your program needs to run infinitely 
     Console.WriteLine("Enter the number of steps:"); 
     n = int.Parse(Console.ReadLine()); 
     //You walk a random way each step 

     for (int i = 0; i < n; i++) 
     { 
      randomDirection = randomObject.Next(1,5); 

      if (randomDirection == 1) 
      { 
       //walk right 
      } 
      if (randomDirection == 2) 
      { 
       //walk left 
      } 
      if (randomDirection == 3) 
      { 
       //walk up 
      } 
      if (randomDirection == 4) 
      { 
       //walk down 
      } 
      //Also check if you aren't walking against walls! 
     } 
    } 
} 

EDIT после вашего комментария и редактирования вопроса:

Вы можете проверить, если вы идете к стене, делая randomDirection==1 && row<100, как вы сказали. Вы должны написать какой-то код, чтобы принять другое направление, потому что, если вы не можете двигаться таким образом, но i будет увеличиваться, это было бы неправильно. Тогда вы не движетесь, но шаг будет засчитан.

Вы можете сделать эту строку кода (и со всеми другими направлениями), как вы сказали, чтобы проверить, выходите ли вы за пределы. Я бы сменил все if на else if. После else if (randomDirection == 4 && col < 100) {} напишите else { i--; }.

Что касается проверки того, насколько далеко пьяница прошла, вы можете использовать теорему Пифагора.

EDIT2: Вы используете: randomDirection == 1 && row < 0 && row < 10.Вы всегда проверяете, меньше ли строка 0. Это должно быть row > 0.

EDIT3: На самом деле все ваше использование mainArray не имеет смысла. Почему бы не установить row и col в 0, и если вы пройдете вправо, сделайте row++?

static void Main(string[] args) 
{ 
    Random randomObject = new Random(); 
    int randomDirection; 
    int row = 1; 
    int col = 1; 

    while (true) 
    { 
     int n; 
     row = 1; 
     col = 1; 
     Console.WriteLine("Enter the number of steps: "); 
     n = Convert.ToInt32(Console.ReadLine()); 
     for (int i = 0; i < n; i++) 
     { 
      randomDirection = randomObject.Next(1, 4); 
      if (randomDirection == 1 && row > 0 && row <= 10) 
       row++; 
      else if (randomDirection == 2 && row > 0 && row <= 10) 
       row--; 
      else if (randomDirection == 3 && col > 0 && col <= 10) 
       col--; 
      else if (randomDirection == 4 && col > 0 && col <= 10) 
       col++; 
      else 
       i--; 
     } 
     Console.WriteLine("You have walked in row: " + row); 
     Console.WriteLine("You have walked in col: " + col); 
     Console.WriteLine(""); 
    } 
} 
+0

Дело в том, что я не знаю, как проверить, как идти против стен. не должен ли я иметь массив здесь? Я имею в виду массив, который у меня есть? Единственное, что пришло на ум, писал что-то вроде этого: если (randomDirection == 1 && строка <100) { // двигаться вправо } , но это не так, это – rapture

+0

@rapture Я? отредактировал мой ответ, взгляните :) – Joetjah

+0

большое вам спасибо. то, как вы объяснили, это действительно помогло. он действительно работает сейчас. Спасибо большое. – rapture

1

Посмотрите на этот фрагмент:.

 while (direction == 1) 
     { 
      if ((++col) < 100 && matrix[row, ++col] == 0) 
      { 
       matrix[row, ++col] = ++number; 
      } 
      else 
       break; 
     } 

Это приращение col 3 раза Так что же происходит когда col == 98 непосредственно перед этим циклом?
Мы получаем:

  if ((99) < 100 
       && matrix[row, 100] == 0) // index out of range 
      { 
       matrix[row, 101] = ++number; // index out of range 
      } 

Лучший совет, который я могу придумать: переписать его без оператора ++. Вы увидите проблемы более четко.

+0

Хорошо, я сделал это. и теперь это просто печать 0 в строке :( – rapture

Смежные вопросы