Mein SpaceInvaders project, Spieler interaktion macht probleme (UPDATE_3.1)



  • Hi leute,

    ich als Programmieranfänger habe mir mal vorgenommen SpaceInvaders in der Konsole nachzubasteln. Es funktioniert leider nicht wirklich... hier mein Ansatz:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    
    namespace Console_Invaders
    {
    
        class Program
        {
    
            public void credits()
            {
                Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
                Console.WriteLine("X                            X");
                Console.WriteLine("X This Game was coded by µBx X");
                Console.WriteLine("X                            X");
                Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
                Console.WriteLine("");
            }
    
            static void Main()
            {
                Program p = new Program();
                p.credits();                                            
                Console.WriteLine("Bitte eine Taste drücken um das Spiel zu starten!");
                ConsoleKeyInfo KP; // KP = KeyPressed
                KP = Console.ReadKey(true);
                //Console.WriteLine(KP.Key);
                Console.Clear();
                Console.WriteLine("Das spiel beginnt !...");
                Thread.Sleep(500);
                Console.Clear();
                Console.SetWindowSize(80,50);
                Console.WriteLine("");
                Console.WriteLine("");
                Console.WriteLine("");
                String Player = "###";
                String PlayerField = "      |                           {0}                                      |      ";
                Console.WriteLine(Player);
                Console.WriteLine(PlayerField, Player);
    
                int found = 0;
                foreach(string s in PlayerField)
                {
                    found = s.IndexOf("###");
                    Console.WriteLine("Player gefunden");
                }
    
            }
        }
    
    }
    

    Der Schritt den ich machen möchte ist vorallem den Spieler zu bewegen ... naja meiner Überlegung nach muss ich dem spieler eine Linie vorgeben in der er sich bewegen kann, => Ich muss immer wieder die Position des Spielers herausfinden und ihn immer um ein Zeichenfeld weiter verschieben. Aber wie mache ich das genau ? ich konnte bei http://msdn.microsoft.com/de-de/library/system.string_methods.aspx keine geeignete Methode dafür finden. Ihr seht in Zeile 51-56 nen kleinen Ansatz überhaupt herauszufinden ob der Spieler in seiner Reihe existiert (ich dachte vllt könnte ich davon darauf aufbauen die position zu bestimmen) doch auch das funktioniert nicht. Ich weiss übrigens das es nicht sehr sauber gecodet ist aber erstmal soll es für mich als eine art "Schmierzettel" dienen, danach wollte ich alle funktionen brav auslagern und so 🙂

    Auch die Kommentare sind meist kleine notizen für mich.

    Vielen Dank im Voraus 🙂

    EDIT: -



  • µBx schrieb:

    Vielen Dank im v****** 🙂

    Komisch bei mir nicht: Voraus

    Es liegt an der Rechtscheibung: Standart wird zu Standart



  • Anstatt WriteLines würde ich SetCursorPos benutzen um die genaue Position des Cursurs festzulegen und dann nur mit Write() den gewüschten Text auzugeben.

    Entweder alles imperativ (statische Funktionen) oder objektorientiert in deinem Fall ist es einfacherer credits statisch zu definiern und

    Program p = new Program();
                p
    

    zu löschen.



  • Es tut mir leid ich verstehe nicht genau was du meinst 😞 ich habe SetCursorPos nachgeschlagen , das erscheint mir ja ganz sinnvoll wenn ich den Spieler bewegen möchte aber wie finde ich überhaupt seine Position heraus? Nach weiterem suchen habe ich GetCursorPos gefunden aber ich kriege es nicht hin die funktion in meinen Code zu implementieren 😕



  • µBx schrieb:

    aber ich kriege es nicht hin die funktion in meinen Code zu implementieren 😕

    Das ist keine Aussage.Was genau kriegst du nicht hin?Zeig uns im Code wo du es nicht hinkriegst(aber bitte nur das Codestückchen und nich den ganzen Code des Spiels).



  • Ich verstehe http://msdn.microsoft.com/de-de/library/ms648390(en-us,VS.85).aspx und http://msdn.microsoft.com/de-de/library/ms648380(en-us,VS.85).aspx (unterer Teil, "Using the Keyboard to move the cursor" nicht richtig. Ich habe zwar versucht GetCursorPos aufzurufen aber er sagt mir "GetCursorPos im aktuellen Kontext nicht vorhanden"

    übrigens, soweit ich es verstanden habe hat die ganze sache was mit pointern zu tun ... darin liegt vermutlich mein defizit ich hab bisher kaum ahnung was pointer sind... kennt jmd von euch ein gutes tutorial dafür?



  • Zeig wie du sie aufrufst. 🙄



  • int pos;
    GetCursorPos(pos);
    

    👎

    ich weiss das der Rückgabewert int eigentlich falsch ist aber welche einheit kann man denn dafür verwenden ??? oO





  • µBx schrieb:

    Es tut mir leid ich verstehe nicht genau was du meinst 😞 ich habe SetCursorPos nachgeschlagen , das erscheint mir ja ganz sinnvoll wenn ich den Spieler bewegen möchte aber wie finde ich überhaupt seine Position heraus?

    Indem du die Positoin in eine bzw. zwei Varaiblen speicherst.

    µBx schrieb:

    Nach weiterem suchen habe ich GetCursorPos gefunden aber ich kriege es nicht hin die funktion in meinen Code zu implementieren 😕

    GetCursorPoshat mit C# erstmal nichts zu tun. WINAPI und :net sind zwei unterschiedlice Dinge.
    Die aktuelle Position, d.h. sollte eigentlich egal sein, oder wofür möchstest du sie verwenden?

    Die aktuelle Consolencursorpsoition erhält man über Console.CursorTop und Console.CursorLeft.

    Firefighter schrieb:

    http://www.cy2online.net/Snippet/CSharp/Miscellaneous/71/Get_Cursor_Position.html

    Beschäftige dich mal mit den Grundlagen richtig.

    Was soll der mit der Mausposition in einem Konsolsenfenster anfangen?



  • Hahah 😃 Da hab ich wohl doch zu viel Rum gedrunken 😃 Ja der Link war mist :p



  • ok, danke allerdings möchte ich ja nicht die koordinaten vom mouse cursor wissen sondern die vom text cursor ...

    ...

    Ich wollte gerade ausprobieren ob es nicht vllt doch den text cursor anzeigt und habe den code eingefügt allerdings kriege ich die fehlermeldung das "Cursor" im aktuellen Kontext nicht vorhanden ist und das der Typ oder Namespace "Point" nicht gefunden werden konnte.

    Das war der Code den ich ausprobiert habe (im sourcecode des spiels) :

    Point a = Cursor.Position;
                string x = a.X.ToString();
                string y = a.Y.ToString();
                Console.WriteLine(x);
    

    es kann auch sein das ich irgendwas übersehe da ich a) noch ein anfänger bin und b) totmüde

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

    EDIT: OK... als ich den post geschrieben hab kamen 2 andere hinzu^^ das erklärt die sache natürlich 🙂

    danke Rhombicosidodecahedron 🙂 der Befehl hat mir schonmal weitergeholfen 🙂



  • Hi leute, ich bin nun etwas weitergekommen stehe aber wieder vor einem Problem bei dem ich keine Lösung weiß. Ich schäme mich auch das ich den Code vom Snakeprojekt abgeguckt habe aber es hat quasi genau gepasst...

    Mein Problem ist das er zwar das Spielersymbol "#" angibt wenn ich auf die rechte Pfeiltaste drücke aber wie lösche ich das Symbol wie sorge ich dafür das bei 10 klicks auf die rechte Pfeiltaste "________#" ( = Leerzeichen, kann ich so aber nicht im Forum angeben) und nicht "##########" ausgegeben wird? Tut mir leid für die dämlichen Fragen aber ich bin wirklich ein blutiger Anfänger 😕

    Es muss bei einem klick auf die Linke Taste das letzte Symbol gelöscht werden, aber wie mache ich das genau ? denn das letzte Symbol ist ja kein String sondern "irgendein" text der in der Console steht, und wenn ich quasi den string "#" suche und herausfinde (auch weiss ich nicht genau wie das geht...) würde das Programm doch auch den String Player und seine Spuren finden oder?

    Sorry für all die Fragen, hab mir heute ein C# Buch bestellt (Der visual c# programmierer) morgen soll es ankommen, vllt nerve ich euch dann weniger mit Fragen

    EDIT: Ach verdammt, ich habe gerade gesehen das genau das die Frage beim Snake Projekt war, ich denke ich habe die idee dahinter verstanden aber nicht genau den Coder der dort geposted wurde 😕 ich bemühe mich nochmal seler vllt löse ich es ja doch. Immerhin hab ich jetzt nen ansatz^^

    EDIT2: Ok Problem gelöst... und jetzt habe ich auch die "oldLeft" und "oldTop" int im snakeprojekt code gefunden, als ich die nicht fand hatte es mich etwas verwirrt. Sorry für die Störung 😕

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    
    namespace Console_Invaders
    {
    
        class Program
        {
    
            public void credits()
            {
                Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
                Console.WriteLine("X                            X");
                Console.WriteLine("X This Game was coded by µBx X");
                Console.WriteLine("X                            X");
                Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
                Console.WriteLine("");
            }
    
            static void Main()
            {
                int ymax = Console.WindowHeight - 3;
                int xmax = Console.WindowWidth;
                Program p = new Program();
                p.credits();                                            
                Console.WriteLine("Bitte eine Taste drücken um das Spiel zu starten!");
                ConsoleKeyInfo KPs; // KP = KeyPressedstart
                KPs = Console.ReadKey(true);
                //Console.WriteLine(KP.Key);
                Console.Clear();
                Console.WriteLine("Das spiel beginnt !...");
                Thread.Sleep(500);
                Console.Clear();
                Console.SetWindowSize(80,50);
                Console.WriteLine("");
                Console.WriteLine("");
                Console.WriteLine("");
                Console.WriteLine("");
                String Player = "#";          
    
                int CPos;
                CPos = Console.CursorLeft;
                ConsoleKeyInfo KP;
                int CTOP = Console.CursorTop;
                do
                {
                    KP = Console.ReadKey(true);
    
                    switch (KP.Key)
                    {
                        case ConsoleKey.RightArrow:
                            if (CPos < 78)
                            {
                                ++CPos;                            
                            }
                            break;
    
                        case ConsoleKey.LeftArrow:
                            if (KP.Key == ConsoleKey.LeftArrow)
                            {
                                if (CPos > 1)
                                {
                                    --CPos;                                
                                }
                            }
                            break;
    
                    }
    
                    Console.SetCursorPosition(CPos, CTOP);
                    //Console.WriteLine(CPos);                            
                    Console.Write(Player); 
    
                } while (KP.Key != ConsoleKey.Escape);
    
            }
    
        }
    
    }
    


  • Also erst mal: mach dich doch nicht selber so fertig, 1. die besten sachen sind geklaut 2. ist doch nichts schlimmes hab da ja nich nur für eine person geholfen sondern für alle folgenden 😛
    zweitens: es gibt keine dämlichen fragen als anfänger nur dämliche antworten
    drittens: das forum ist doch für fragen da, du nervst doch dann nicht ^^
    viertens: seh grade du hast es ^^ aber vllt hilft dir ja trotzdem meins noch habs komplett überschrieben viel komfortabler 😛
    naja hier:

    class Program
      {
        //Top und Left sind die CursorPosition nur bisschen kürzer
        //damit kann die CursorPosition auch verändert werden
        static int Top
        {
          get { return Console.CursorTop; }
          set { Console.CursorTop = value; }
        }
    
        static int Left
        {
          get { return Console.CursorLeft; }
          set { Console.CursorLeft = value; }
        }
    
        static void Main()
        {
          Console.CursorVisible = false;//is ja hässlich wenn man den sieht ^^
          credits();
          Console.WriteLine("\r\nBitte eine Taste drücken um das Spiel zu starten!");
          Console.ReadKey();
          Console.Clear();
          Console.WriteLine("Das spiel beginnt !...");
          Thread.Sleep(500);
          Console.Clear();
          Console.SetWindowSize(80, 50);
          Console.WriteLine("\r\n\r\n\r\n");//\r\n = Escapesequenz für zeilenumbruch
          String Player = "#";
    
          Console.Write(" " + Player);//Player das erste mal schreiben
          Left--;//Springe wieder mit Cursor auf Playerstelle
    
          ConsoleKeyInfo Input;
          do
          {
            Input = Console.ReadKey(true);
            switch (Input.Key)
            {
              case ConsoleKey.RightArrow:
                if (Left < 78)
                {
                  Console.Write(" " + Player);//überschreibt alt und macht neu
                  Left--;//setzt wieder auf aktuell
                }
                break;
              case ConsoleKey.LeftArrow:
                if (Left > 2)// Hab den Wert erhöht damit es symetrisch ist :)
                {
                  Left--;//Setzt dahin wo player hinkommt
                  Console.Write(Player + " ");//macht neues zeichen und automatisch altes überschreiben
                  Left -= 2;//Setzt wieder dahin wo player ist
                }
                break;
            }
          } while (Input.Key != ConsoleKey.Escape);
        }
    
        static void credits()//static dadurch kannst dus direkt benutzen
        {
          Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
          Console.WriteLine("X                            X");
          Console.WriteLine("X This Game was coded by µBx X");
          Console.WriteLine("X                            X");
          Console.WriteLine("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
        }
      }
    


  • Vielen Dank das macht es wirklich VIEL übersichtlicher, ich hatte eigl vor es erstmal _irgendwie_ hinzubekommen und dann um eine nachbearbeitung hier im board zu bitten. Dann arbeite ich mal mit dem Code weiter 🙂



  • So , ist etwas her das ich mich damit beschäftigen konnte. Ich habe mich heute mal wieder dran gesetzt und sofort trat ein Problem auf! Wie mache ich die schuss-funktion ? Ich muss einen String in eine bestimmte Reihe posten können habe aber weder bei msdn noch in meinem Buch ("Der C# Programmierer") irgendwelche informationen dazu einen String in eine bestimmte Reihe zu schreiben! theoretisch benötige ich ja

    Console.Write("!")
    

    ("!" ist das geschoss) aber wo kann ich hier nun den paramter für die Reihe reinquetschen ? unter http://msdn.microsoft.com/de-de/library/system.console.write(VS.80).aspx konnte ich nichts passendes finden.

    Code ist unverändert von Sirajas verbessertem Code, nur das ich die schuss funktion auf die leertaste geschrieben habe also :

    case ConsoleKey.Spacebar:
    {
         Console.Write("!");    
    }
    break;
    

    ist ja klar das "!" das "#" ersetzt, deswegen muss ich es ja irgendwie hinkriegen es in eine andere Reihe zu schreiben
    -----
    mal wieder eine hochkomplexe frage^^



  • top++; .



  • ach verdammt, natürlich. Habs bei deiner version etwas übersehen^^ danke 🙂



  • und ich komme schon wieder nicht weiter 😞 .

    die notizen habe ich nur für mich im programm gemacht.

    Das problem ist das ich nach meiner Idee "Left mal leer" schreiben möchte und danach player ... ich habe es mit for, while und do-while schleifen probiert... keins hat hingehauen im code ist derzeit mein letzter while versuch...

    case ConsoleKey.Spacebar:
                        {
                            if (Left > 2)
                            {
    
                                Top = Top - 5;
                                Console.WriteLine("!");
                                Top = Top + 4;
    
                                string leer = " ";
                                int fuck = 1;
    
                                while (fuck != Left)
                                {
                                    Console.WriteLine(leer);
                                    fuck++;
                                }
    
                                /* Ich muss es hinkriegen, dass der Player nach dem schuss wieder an die Position zurück
                                 * kommt und nicht wieder an den anfang gesetzt oder ganz gelöscht wird...
                                 * ausserdem muss ich es schaffen den player immer auf einer Linie zu behalten, das ist
                                 * immer aktualisiertes Top (z.B. Top - 5) + 1 (in dem statischen Fall den ich zum test
                                 * habe wäre es Top + 4 */
    
                                /* IDEE: um den Player wieder an die Position zu setzen einfach Left mal leer schreiben
                                 * das problem ist das Left nur 1mal geschrieben wird oder es nur "nach unten" funktioniert */
    
                            }
    
                        }
                        break;
    


  • ehm ich versteh dein problem nich ganz ^^, der player sollte sich doch beim schuss garnet bewegen :-P?


Anmelden zum Antworten