Wie kann ich in C# mit Pfeiltasten die Cursor-Position verändern?

2 Antworten

Diese true==true und true==false Abfragen machen den Code ganz schön unübersichtlich.

Du inkrementierst und dekrementierst Variablen, aber setzt die Position nicht relativ, sondern absolut, wie mir schient.

Ich würde es für das beste halten, wenn du dir im ersten Schritt die aktuellen Koordinaten nach jedem Tastendruck lesen würdest und dann in die entsprechende Richtung einen Offset legst. Damit sparst du dir die Zwischenvariablen.

Oder du schaust nach einer Methode, die den Cursor relativ zur aktuellen Position setzt.

Du solltest die Ränder vor dem Setzen abprüfen.

Bei den ifs kannst du mit else if arbeiten.

Woher ich das weiß:Berufserfahrung – Programmierer

1) Wieso setzt du hier die Cursorposition und leerst die Konsole? Das ist doch bei Start der Anwendung eh beides gegeben?

2) Wenn du für jede Richtung eine Variable nutzen möchtest, sollten diese auch jeweils synchron gehalten werden. Effektiv bewegst du dich nämlich nur auf zwei Achsen (x und y). Folglich würden zwei Variablen völlig ausreichen.

3) Zu Taste: Nach Konvention beginnen lokale Variablen mit einem Kleinbuchstaben. Deklaration und Definition lassen sich zudem zusammenziehen.

ConsoleKeyInfo taste = Console.ReadKey(false);

4) Da du mehrere if-Anweisungen hintereinander angereiht hast, werden deren Bedingungen auch nach jedem Tastendruck geprüft. Egal, ob es generell unmöglich ist, dass die Bedingung zutrifft, da eine andere Bedingung zuvor schon wahr war.

Dieses Vorgehen lässt sich effektiver gestalten, indem man entweder if-else if oder switch-case verwendet.

5) Hast du dir schon einmal Gedanken über dieses Ergebnis gemacht?

true == false

Beide Seiten haben einen jeweils anderen Wert. Somit kann der Ausdruck nie wahr sein. Das heißt, eine do-while-Schleife mit dieser Bedingung wird auch nie mehr als einmal ausgeführt werden. Da das von Anfang an feststeht, ist sie sinnlos.

6) Diese Bedingung:

while (true == true);

lässt sich übrigens abkürzen:

while (true);

Da es sich um eine Endlosschleife handelt, fehlt mir doch irgendwie noch eine Abbruchbedingung. Wenn der Anwender das Programm mit Gewalt beenden muss, ist das nicht schön.

7)

Das Problem aber ist: Wenn ich nach unten gehe und dann nach rechts gehen will, dass der Cursor wieder an den Anfang springt.

Zum einen beachtest du nicht, dass die Konsole natürlich auch noch selbst Tastenevents verarbeitet. Zum anderen prüfst du gar nicht, ob sich die Cursor-Position innerhalb der zulässigen Grenzen (0-80 je Achse) befindet. Wenn du ausgehend von der Startposition nach oben gehst, wird dein Programm deshalb auch abstürzen.

8)

Weil das -- nicht so funktioniert, wie es soll.

Das ist ein Dekrementierungsoperator.

--------------

Eine Lösung könnte so aussehen:

Console.SetWindowSize(80, 24);
Console.SetBufferSize(80, 24);

var x = 0;
var y = 0;

do
{
  var button = Console.ReadKey(false);

  switch (button.Key)
  {
    case ConsoleKey.DownArrow:
    {
      if (y == Console.BufferHeight - 1)
      {
        Console.SetCursorPosition(x, Console.BufferHeight - 1);
        continue;
      }

      Console.SetCursorPosition(x, ++y);
      break;
    }
    case ConsoleKey.Escape:
      return;
    case ConsoleKey.LeftArrow:
    {
      if (x == 0)
      {
        Console.SetCursorPosition(0, y);
        continue;
      }

      Console.SetCursorPosition(--x, y);
      break;
    }
    case ConsoleKey.RightArrow:
    {
      if (x == Console.BufferWidth - 1)
      {
        Console.SetCursorPosition(Console.BufferWidth - 1, y);
        continue;
      }

      Console.SetCursorPosition(++x, y);
      break;
    }
    case ConsoleKey.UpArrow:
    {
      if (y == 0)
      {
        Console.SetCursorPosition(x, 0);
        continue;
      }

      Console.SetCursorPosition(x, --y);
      break;
    }
  }
}
while (true);