2014-10-21 3 views
0

У меня проблема с выходом на консоль. Я получаю всегда исключения и не могу исправить ошибку, решение уже сработало, но стек растет сверху вниз, поэтому я попытался отсортировать мои Элементы по Whitespace.Count с обратными что заказ надеюсь, что вы можете мне помочь, вот мой код:Проблемы с визуализацией Ханоя в C#

public class TvH 
{ 
    #region 
    IDictionary<string, int> towerMapping = new Dictionary<string, int>() 
    { 
     {"Start", 0}, {"Mitte", 1}, {"Ziel", 2} 
    }; 

    private string emptyTower = "  |  "; 
    private int turns = 0; 
    Stack<string>[] towers; 
    Dictionary<int, string> discs = new Dictionary<int, string>() 
     { 
      {1, "-----|-----"}, 
      {2, " ----|---- "}, 
      {3, " ---|--- "}, 
      {4, " --|-- "}, 
      {5, " -|- "} 
     }; 
    #endregion 

    public TvH(int towerCount) 
    { 
     towers = new Stack<string>[towerCount]; 
     initializeTowers(); 
    } 

    private void initializeTowers() 
    { 
     for (int i = 0; i < towers.Length; i++) 
     { 
      towers[i] = new Stack<string>(); 
     } 
     for (int i = 1; i <= discs.Count; i++) 
     { 
      towers[0].Push(discs[i]); 
      towers[1].Push(emptyTower); 
      towers[2].Push(emptyTower); 
     } 
    } 

    public void bewegeScheibe(int n, string a, string b, string c) 
    { 
     if (n > 0) 
     { 
      bewegeScheibe(n - 1, a, c, b); 
      turns++; 
      Console.Write("\nZug # "); 
      if (turns < 10) 
      { 
       Console.Write("0"); 
      } 
      Console.WriteLine("{0}  DisC# {1}  {2} --> {3}\n", turns, n, a, c); 
      move(a, c); 
      bewegeScheibe(n - 1, b, a, c);     
     } 
    } 

    private void move(string start, string target) 
    { 
     var element = towers[towerMapping[start]].Pop(); 
     towers[towerMapping[target]].Push(element); 

     printContent(); 
    } 

    private void printContent() 
    { 
     IList<string> t1 = prepairTowerForPrint(towers[0].GetEnumerator()); 
     IList<string> t2 = prepairTowerForPrint(towers[1].GetEnumerator()); 
     IList<string> t3 = prepairTowerForPrint(towers[2].GetEnumerator()); 

     int i = 0; 
     while (i < discs.Count) 
     {     
      object ob1 = t1[i]; 
      object ob2 = t2[i]; 
      object ob3 = t3[i]; 

      Console.WriteLine("\t{0}\t{1}\t{2}", ob1, ob2, ob3); 
      i++; 
     } 
    } 

    private IList<string> prepairTowerForPrint(Stack<string>.Enumerator enumerator) 
    { 
     IList<string> towerList = new List<string>(); 
     while (enumerator.MoveNext()) 
     { 
      towerList.Add(TryReadNext(enumerator)); 
     } 
     towerList = towerList.OrderByDescending(scheiben => scheiben.Count(Char.IsWhiteSpace)).ToList(); 
     return towerList; 
    } 

    private string TryReadNext(IEnumerator ce) 
    { 
     if (ce.MoveNext()) 
     { 
      return (string)ce.Current; 
     } 
     else 
     { 
      return emptyTower; 
     } 
    }  
} 

большое спасибо

+0

Конкретно: какое исключение вы получаете и когда? – Srv19

+0

, когда я перебираю списки в моем методе printContent. Я получаю исключение из диапазона при создании объектов для печати, прежде чем сортировать рекурсивный ход. Метод работал хорошо. Я попробовал jst, чтобы украсить вывод консоли, и теперь все сломано: D – Anzzi

+0

хорошо, если его исключение из диапазона, тогда башни [0], [1] ... не инициализируются, когда вы пытаетесь получить к нему доступ. – Vajura

ответ

0

Ok я решил еще один способ, вот код, если кто-то нуждается в

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace TuermeVonHanoi 
{ 
public class TvH 
{ 
    #region 
    IDictionary<string, int> towerMapping = new Dictionary<string, int>() 
    { 
     {"start", 0}, {"middle", 1}, {"target", 2} 
    }; 

    private string emptyTower = "  |  "; 
    private int turns = 0; 
    Stack<string>[] towers; 

    IList<string> discs = new List<string>() 
    { 
     {"-----|-----"}, 
     {" ----|---- "}, 
     {" ---|--- "}, 
     {" --|-- "}, 
     {" -|- "} 
    }; 
    #endregion 

    public TvH(int towerCount) 
    { 
     towers = new Stack<string>[towerCount]; 
     initializeTowers(); 
    } 

    private void initializeTowers() 
    { 
     for (int i = 0; i < towers.Length; i++) 
     { 
      towers[i] = new Stack<string>(); 
     } 

     foreach (var d in discs) 
     { 
      towers[0].Push(d); 
     } 
    } 

    public void moveAlgorithmic(int n, string a, string b, string c) 
    { 
     if (n > 0) 
     { 
      moveAlgorithmic(n - 1, a, c, b); 
      ++turns; 
      Console.Write("\nturn # "); 
      if (turns < 10) 
      { 
       Console.Write("0"); 
      } 
      Console.WriteLine("{0}  disC# {1}  {2} --> {3}\n", turns, n, a, c); 
      moveVisual(a, c); 
      moveAlgorithmic(n - 1, b, a, c);     
     } 
    } 

    private void moveVisual(string start, string target) 
    { 
     var element = towers[towerMapping[start]].Pop(); 
     towers[towerMapping[target]].Push(element);       
     printContent(); 
    } 

    private void printContent() 
    { 
     IList<string> t1 = prepareTowerForPrint(towers[0].GetEnumerator()); 
     IList<string> t2 = prepareTowerForPrint(towers[1].GetEnumerator()); 
     IList<string> t3 = prepareTowerForPrint(towers[2].GetEnumerator()); 
     int i = 0; 
     while (i < discs.Count) 
     { 
      object ob1 = t1[i]; 
      object ob2 = t2[i]; 
      object ob3 = t3[i];   
      Console.WriteLine("\t{0}\t{1}\t{2}", ob1, ob2, ob3); 
      ++i; 
     } 
    } 

    private IList<string> prepareTowerForPrint(Stack<string>.Enumerator enumerator) 
    { 
     IList<string> towerList = new List<string>(); 
     int count = 0; 
     while (enumerator.MoveNext()) 
     { 
      ++count; 
      towerList.Add(enumerator.Current); 
     } 

     int toPush = discs.Count - count; 
     for (int i = 0; i < toPush; i++) 
     { 
      towerList.Add(emptyTower); 
     } 
     if (toPush != 0 || toPush != 1) 
     { 
      towerList = towerList.OrderByDescending(d => d.Count(Char.IsWhiteSpace)).ToList(); 
     } 
     return towerList; 
    } 
} 

}

вместо инициализации всех 3 стеки вычислит, сколько пустых элементы штыря должны быть распечатаны для каждого стека

0

проблема заключается в том, что вы предполагаете, что каждый стек всегда имеет пять дисков, еще в методе move вы pop элемент от одного и push он на Другие. Отсюда и ошибка.

Поэтому вам нужно удалить один элемент из вышек [towerMapping [target]] и добавить его в башни [towerMapping [start]].

Могу ли я также провести небольшой обзор кода?

Почему discs словарь? Это сделало бы для больше смысла, чтобы сделать его List() и просто петли через него:

List<string> discs = new List<string>() 
{ 
    "-----|-----", 
    " ----|---- ", 
    " ---|--- ", 
    " --|-- ", 
    " -|- " 
}; 

foreach(var dics in discs) 
{ 
    towers[0].Push(disc); 
    towers[1].Push(emptyTower); 
    towers[2].Push(emptyTower); 
} 

Почему вы towers = new Stack<string>[towerCount]; в конструкторе TVH, а не в методе, называемом initializeTowers()?

Метод prepairTowerForPrint содержит опечатку, глагол должен быть подготовить.

Названия методов на немецком языке - плохая идея, ИМХО. Также, method names should be PascalCase.

Единственный публичный метод - bewegeScheibe(), но его параметры на самом деле являются частью класса TvH: «Пуск», «Митте», «Зиль». Это первый параметр: int n, который абсолютно ничего не говорит; Я только выяснил, что ожидали string a, string b, string c, читая код.

+0

большое спасибо – Anzzi

+0

ну, мне нужно все время 5 элементов в стеке, потому что я хочу имитировать пустой столб, поэтому я не понимаю, почему это неправильно – Anzzi

+0

Как я уже сказал в своем редактировании: «Так вам понадобится для удаления одного элемента из башен [towerMapping [target]] и добавить его в башни [towerMapping [start]]. " (в методе 'move') – BCdotWEB