[C#]Probleme mit der Schlange bei Snake



  • Hallo
    Ich progammiere erst ca 10 Stunden mit C#, hab aber leichte vorkenntnisse mit Visual Basic 2008 Express Edition. Ich habe mich an das Programm Snake herangewagt da es doch etwas schwierig ist aber eigentlich, dachte ich zumindest, machbar wäre ^^.
    Bis jetzt hab ich folgende Sachen gelöst:
    -der Bereich wurde eingegrenzt
    -sobald die Schlange über den Bereich kommt, kommt sie am anderen Ende wieder herraus
    -die Schlange bewegt sich mit den Pfeiltasten
    doch jetzt stehe ich vor einem Problem: wenn ich z.B. die Linke Pfeiltaste betätige wird auf der Konsole neben dem Anfangssymol ein weiteres Symbol dargestellt, doch ich möchte, dass meine Schlange am anfang 5 Symbole groß ist und nicht bei jedem betätigen der Pfeiltasten sich vergrößert
    das ist mein bisheriger Code:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    
    namespace Figures
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.CursorVisible = true;
                Console.BackgroundColor = ConsoleColor.Blue;
                Console.ForegroundColor = ConsoleColor.White;
                Console.Clear();
    
                Random r = new Random();
    
                char symbol = '°';
                int left, top;
                int xmax = Console.WindowWidth - 1;
                int ymax = Console.WindowHeight - 3;
                int x = 0;
                int[] snake = new int[5];
                left = r.Next(xmax);
                top = r.Next(ymax);
                Console.SetCursorPosition(left, top);
                Console.WriteLine(symbol);
    
                DrawHorizontalLine(0, 0, 0, '*');  // call method
                DrawVerticalLine(0, 0, 0, '*');   // call method
                DrawVerticalLine(79, 0, 0, '*');   // call method
                DrawHorizontalLine(0, 23, 0, '*');  // call method
    
                ConsoleKeyInfo keyInfo;
                // code for a simple loop of type:
                // do
                //   commands, statements: read a keyInfo stroke
                // until keyInfo was "E"
                do
                {
                    keyInfo = Console.ReadKey(true);
                    switch (keyInfo.Key)
                    {
                        case ConsoleKey.LeftArrow:
                            if (left > 1)
                            {
                                left = left - 1;
    
                            }
                            else                               // set the Position on the right
                            {
                                left = xmax;
    
                            }
                            break;
                        case ConsoleKey.RightArrow:
    
                           if (left < 79)
                           {
                               left = left + 1;
                           }
                           else                               // set the Position on the left
                           {
                               left = xmax - 78;
                            }
                            break;
                        case ConsoleKey.UpArrow:
    
                            if (top > 0)
                            {
                                top = top - 1;
                            }
                            else                              // set the Position on the bottom
                            {
                                top = ymax;
                            }
                            break;
                        case ConsoleKey.DownArrow:
    
                            if (top < 23)
                            {
                                top = top + 1;
                            }
                            else                              // set the Position on the top
                            {
                                top = ymax - 22;
                            }
                            break;
    
                        default:
                            break;
                    }
                    Console.SetCursorPosition(75, 0);
                    Console.Write("{0} {1}", left, top);
    
                    Console.SetCursorPosition(left, top);
                    Console.Write(symbol);
    
                } while (keyInfo.Key != ConsoleKey.Escape);
    
            }   // end main
    
            static void DrawHorizontalLine(int left, int top, int length, char c)
            {
                Console.SetCursorPosition(left, top);
                int i;
                Console.Write('*');
                for (i = 1; i < 80; i++)
                {
                    Console.Write(c);
                }
    
            }  // end DrawHorizontalLine
    
            static void DrawVerticalLine(int left, int top, int length, char c)
            {
                int i;
                Console.SetCursorPosition(left, top);
                Console.WriteLine('*');
                for (i = 1; i < 23; i++)
                {
                    Console.SetCursorPosition(left, top + i);
                    Console.WriteLine(c);
                }
                Console.SetCursorPosition(left, top + i);
                Console.Write('*');
    
            }
    
        } // end class Program
    }  // end namespace
    

    Da wir in der Schule noch keine Arrays durchgenommen haben, wollte ich Fragen wie das ohne Arrays machbar ist.
    Wäre echt nett wenn ihr mir helfen könnt!
    Schöne grüße
    who



  • hi, sieht gut aus, du musst aber das teleportieren von der einen auf die andere seite immer ein feld früher machen sonst überschreibst du ja die wand, ausserdem du fügst zwar ein zeichen hinzu, vergisst aber das alte zu löschen ^^ änder mal die schleife in

    do
                {
                    keyInfo = Console.ReadKey(true);
                    int oldleft = left;
                    int oldtop = top;
                    switch (keyInfo.Key)
                    {
                        case ConsoleKey.LeftArrow:
                            if (left > 1)
                            {
                                left = left - 1;
    
                            }
                            else   // set the Position on the right
                            {
                                left = xmax;
    
                            }
                            break;
                        case ConsoleKey.RightArrow:
    
                           if (left < 79)
                           {
                               left = left + 1;
                           }
                           else  // set the Position on the left
                           {
                               left = xmax - 78;
                            }
                            break;
                        case ConsoleKey.UpArrow:
    
                            if (top > 0)
                            {
                                top = top - 1;
                            }
                            else  // set the Position on the bottom
                            {
                                top = ymax;
                            }
                            break;
                        case ConsoleKey.DownArrow:
    
                            if (top < 23)
                            {
                                top = top + 1;
                            }
                            else  // set the Position on the top
                            {
                                top = ymax - 22;
                            }
                            break;
    
                        default:
                            break;
                    }
                    Console.SetCursorPosition(75, 0);
                    Console.Write("{0} {1}", left, top);
                    Console.SetCursorPosition(oldleft, oldtop);
                    Console.Write(" ");
                    Console.SetCursorPosition(left, top);
                    Console.Write(symbol);
    
                } while (keyInfo.Key != ConsoleKey.Escape);
    


  • hi
    Alles klar, vielen dank, das mit der Seitenwand hab ich geändert, schaut viel schöner aus!
    Das mit der Schlange ist auch gut das das Zeichen immer gelöscht wird, jedoch wie bekomme ich es hin, das die Schlange gleich aus 5 Zeichen besteht und immer 5 Zeichen bleibt?

    Im Internet hab ich gefunden das sei ganz einfach mit einer Queue Möglich sei, doch das ist auch nicht ganz so leicht

    lg
    who



  • also ich würde sagen du niiimmst nen anfangspunkt und nen endpunkt dann kannst du abfragen wo der knick ist und du gehst dann beim nächsten punkt zeichnen vom anfangspunkt aus und beim löschen vom endpunkt



  • hm, ja, aber wie merke ich mir den endpunkt und den anfangspunkt
    und vorallem, wie bringe ich die schlange auf 5 symbole? ich gehe jetzt mal von einer geraden schlange aus ohne knick



  • ja einfach einspeichern so wie ich es eben gemacht hab mit old, einfach ne schleife machen die die points zeichnet

    for (int i = 0; i < 5; i++)
    {
          Console.SetCursorPosition(Left+i, Top);
          Console.Write(Symbol);
    }
    


  • ok, jetzt ist es möglich nach zb nach rechts zu steuern mit dem right arrow und die 4er Zeichenschlange bewegt sich schön nach rechts. Doch wenn ich die Richtung ändern will und nach links Steuere bleiben auf der rechten Seite 3 Zeichen übrig und 5 gehen nach links!

    Das zweite ist: wenn ich über den Rand fahre kommt gleich ein Fehler, ist aber auch logisch denn ich glaube der Rand begrenzt nur die Mitte der Zeichenkette der aber unereichbar ist das zuvor das Programm abstürzt
    Mein bisheriger Code der Schleife:

    do
                {
                    keyInfo = Console.ReadKey(true);
                    int oldleft = left;
                    int oldtop = top;
                    switch (keyInfo.Key)
                    {
                        case ConsoleKey.LeftArrow:
                            if (left > 1)
                            {
                                left = left - 1;
                                for (int i = 0; i < 5; i++)
                                {
                                    Console.SetCursorPosition(left - i, top);
                                    Console.Write(symbol);
                                }
    
                            }
                            else   // set the Position on the right
                            {
                                left = xmax -1;
    
                            }
                            break;
                        case ConsoleKey.RightArrow:
    
                            if (left < 78)
                            {
                                for (int i = 0; i < 5; i++)
                                {
                                    Console.SetCursorPosition(left + i, top);
                                    Console.Write(symbol);
    
                                }
                                left = left + 1;
                            }
                            else  // set the Position on the left
                            {
                                left = xmax - 78;
                            }
                            break;
                        case ConsoleKey.UpArrow:
    
                            if (top > 1)
                            {
                                for (int i = 0; i < 5; i++)
                                {
                                    Console.SetCursorPosition(left, top -i);
                                    Console.WriteLine(symbol);
                                }
                                top = top - 1;
                            }
                            else  // set the Position on the bottom
                            {
                                top = ymax;
                            }
                            break;
                        case ConsoleKey.DownArrow:
    
                            if (top < 22)
                            {
                                for (int i = 0; i < 5; i++)
                                {
                                    Console.SetCursorPosition(left, top + i);
                                    Console.WriteLine(symbol);
                                }
                                top = top + 1;
                            }
                            else  // set the Position on the top
                            {
                                top = ymax - 21;
                            }
                            break;
    
                        default:
                            break;
                    }
                    Console.SetCursorPosition(75, 0);
                    Console.Write("{0} {1}", left, top);
                    Console.SetCursorPosition(oldleft, oldtop);
                    Console.Write(" ");
                    Console.SetCursorPosition(left, top);
                    Console.Write(symbol);
    
                } while (keyInfo.Key != ConsoleKey.Escape);
    

    lg



  • Also du musst es ja nich machen wie ich es mir gedacht hatte, aber eig war es so gedacht: (hab ein paar Sachen verändert ^^)

    //Programmspezifische deklarationen
                srting symbol = "°";
                int xmax = Console.WindowWidth - 1;
                int ymax = Console.WindowHeight - 3;
    
                //Rand
                DrawHorizontalLine(0, 0, 0, '*');
                DrawVerticalLine(0, 0, 0, '*');
                DrawVerticalLine(79, 0, 0, '*');
                DrawHorizontalLine(0, 23, 0, '*');
    
                //Anfangs- EndKoordinaten
                int ex = 10, ey = 10, ax = 14, ay = 10;
    
                //Zeichne Schlange ein erstes mal
                Console.SetCursorPosition(10, 10);
                 Console.Write(symbol+symbol+symbol+symbol+symbol);
    
                //Gehe zur Steuerung
                ConsoleKeyInfo keyInfo;
                do
                {
                    keyInfo = Console.ReadKey(true);
                    switch (keyInfo.Key)
                    {
                        case ConsoleKey.LeftArrow:
                            if (ax > 1)
                            {
                            }
                            else   // set the Position to the right
                            {
                                ax = xmax - 1;
                            }
                            break;
                        case ConsoleKey.RightArrow:
                            if (ax < 78)
                            {
                                Console.SetCursorPosition(ex, ey);
                                Console.Write(" ");
                                ex++;
                                ax++;
                                Console.SetCursorPosition(ax, ay);
                                Console.Write(symbol);
                            }
                            else  // set the Position to the left
                            {
                                ax = xmax - 78;
                            }
                            break;
                        case ConsoleKey.UpArrow:
    
                            if (ay > 1)
                            {
                            }
                            else  // set the Position to the bottom
                            {
                                ay = ymax;
                            }
                            break;
                        case ConsoleKey.DownArrow:
    
                            if (ay < 22)
                            {
                            }
                            else  // set the Position to the top
                            {
                                ay = ymax - 21;
                            }
                            break;
                        default:
                            break;
                    }
                } while (keyInfo.Key != ConsoleKey.Escape); 
            }
    

    hab erstmal nur für rechts gemacht, du musst dann auch noch unterscheiden in welche richtung sich die schlange gerade bewegt für das knickverhalten, und ich kann dir nicht empfehlen dass mit dem knicken alles sehr spät zu machen, am besten direkt verknüpfen wenn schlange sich nach oben bewegt und rechts gedrückt wird knick rein machen



  • hi
    doch wie schaffe ich es das es nach oben auch die 5 symbole schreibt?
    lg


Anmelden zum Antworten