Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.12.2015, 13:35

[C#] SnakeGame: Problem mit der Bewegung

Hallo liebe Forengemeinde,

ich habe mir vorgenommen ein einfaches SnakeGame auf der Konsole zu programmieren.
Leider hänge ich schon jetzt bei der Bewegung des Spielers (dem "O") fest.
Vielleicht kann mir ja einer von euch meinen Denkfehler erklären.
Das wäre sehr nett.

C#-Quelltext

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    public class Snake
    {

        int sx = 5; // x und y Position der Spielers
        int sy = 5;



        public void Draw()
        {
            Console.SetCursorPosition(sx, sy);
            Console.Write("O");
        }



        public void Move()
        {
            var key = Console.ReadKey();

            Console.SetCursorPosition(sx, sy);
            Console.Write(" ");

            switch (key.Key)
            {
                case ConsoleKey.W:
                    
                    if (sy >= 1) { sy = sy - 1;}
                    Draw();
                    break;
                case ConsoleKey.A:
                    break;
                case ConsoleKey.S:
                    break;
                case ConsoleKey.D:
                    break;
                default:
                    break;
            }
        }

    }

    public class Spielfeld
    {

    }

    public class Food
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            Snake schlange = new Snake();
            Console.CursorVisible = false;
            schlange.Draw();
            schlange.Move();

            Console.ReadKey();

        }
    }
}


Also das eigentlich Problem ist das die Konsole immer ein "w" schreibt sobald ich das O nach oben bewegen will.

Vielen dank schon mal im voraus.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

23.12.2015, 14:31

Genau das steht ja auch in Deinem Code. Wenn key=='W' -> Draw(). Bewegung ist da bisher ja gar keine drin, Deine Koordinaten bleiben unverändert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

29.12.2015, 19:55

ReadKey(true) verhindert die Ausgabe des eingegeben Zeichens und eine Schleife fehlt, die könntest du bei Move einbauen:

C#-Quelltext

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
        public void Move()
        {
            ConsoleKeyInfo key;
            while ((key = Console.ReadKey(true)).Key != ConsoleKey.Q)
            {
                Console.SetCursorPosition(sx, sy);
                Console.Write(" ");

                switch (key.Key)
                {
                    case ConsoleKey.W:
                    
                        if (sy >= 1) { sy = sy - 1;}
                        Draw();
                        break;
                    case ConsoleKey.A:
                        break;
                    case ConsoleKey.S:
                        break;
                    case ConsoleKey.D:
                        break;
                    default:
                        break;
                }
            }
        }

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

29.12.2015, 20:42

Ich würde die Schleife erstmal in die main-Methode schreiben. Dabei entspricht jeder Schleifendurchlauf einem sogenannten Frame(wovon sich auch "Frames per Second" ableitet). In einem Frame werden erst Eingaben entgegen genommen und die Logik(z.B. Bewegungen) berechnet und dann alles gezeichnet. Versuche das klar zu trennen. Ich denke es ist übersichtlicher, wenn die Draw-Methode nicht von der Move-Methode aufgerufen wird. Ausserdem würde ich die Move-Methode in "Update" umbenennen und erstmal alle überflüssigen Klassen entfernen. In dem Stadium brauchst du nur eine einzige Klasse. Sobald etwas funktioniert kannst du es in eine eigene Klasse Kapseln. Nicht nur als Anfänger wirst du viel weniger Frust haben, wenn du dir vor nimmst eins nach dem anderen zu machen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige