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



  • 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?



  • mh probiers mal aus dann siehst du das der player nach dem schuss von vorne anfängt also player wird nach Left = 0 , gesetzt

    du darfst mir deine msn addy / icq nummer per mail oder privater nachricht schrieben 😛 wenn nicht is auch ok^^



  • hab ich net sry ^^ bin aber im forum immer wieder da 😉 ^^ hab mir überlegt am besten is noch ne methode

    static void Schreibe(int X,int Y, string Text)
    {
        int altX = Left;
        int altY = Top;
        Console.SetCursorPosition(X,Y);
        Console.Write(Text);
        Console.SetCursorPosition(altX,altY);
    }
    

    also damit kannst du ja dann immer i-wo was zeichnen und trotzdem an der alten position sein danach 😛



  • Hi, ich komme einfach nicht weiter... ich habe nicht mal einen Ansatz 😕 ich weiss nicht wie ich die schuss funktion "sinnvoll" programmieren soll ich hatte zwar nen ansatz bei dem er das geschoss immer 1 reihe pro 0.5 sek hoch gesetzt hat aber der code war schwachsinn (7-8 mal Setcursorposition, write,sleep) vorallem konnte man den Cursor nicht "richtig" bewegen als es ausgeführt wurde da die position ja immer mal wieder kurz woanders hingesetzt wurde. Kann mir jmd verraten wie ich die schuss funktion coden soll ? (siraja vielleicht ? :))

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    
    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\r\n\r\n\r\n\r\n\r\n\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;
                    case ConsoleKey.Spacebar:
                        {
                            int altX = Left;
                            int altY = Top;
    
                            Console.SetCursorPosition(altX, altY);
    Schuss(Left, Top - 5, altX, altY);
    
                        }
                        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");
        }
    
        static void Schuss(int SchussPosLeft, int SchussPosTop, int altX_2, int altY_2)
        {
            Console.SetCursorPosition(SchussPosLeft, SchussPosTop);
            Console.Write("!");
            Console.SetCursorPosition(altX_2, altY_2);
    
        }
    }
    


  • ich kann dir eig nur empfehlen in klassen zu programmieren, also dass du eine schussklasse hast die dann ihre verschiebung intern regelt 😛



  • hehe das habe ich eigl auch versucht aber es hat nicht geklappt...

    wenn ich innerhalb der programm classe eine classe verwende gibt er mir irgendeinen error aus, wenn ich daraufhin die program klasse quasi vererbe gibt er mir wieder nen error aus ...



  • programmier mal und dann poste den fehler ^^



  • ich bin mir nicht sicher ob die klasse in der mainfunktion sein darf... deswegen hab ich sie für alle fälle rausgeschrieben bin atm bissl zu müde um was ordentliches zu machen aber so in etwasiehts aus nun gibt er mir nen error aus in der hilfe steht das dann der modifizierer ungültig ist, ich habe public, private und internal probiert aber er gibt mir immer wieder den error aus...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading;
    
    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\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n");//\r\n = Escapesequenz für zeilenumbruch 
        }
            public class Spieler
            {
            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;
                    case ConsoleKey.Spacebar:
                        {
                            int altX = Left;
                            int altY = Top;
                            Console.SetCursorPosition(Left, Top - 1);
                            Console.Write("!");                                            
                            Console.SetCursorPosition(altX, altY);
                            Schuss(Left, Top - 5, altX, altY);
                        }
                        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");
        }
    
        static void Schuss(int SchussPosLeft, int SchussPosTop, int altX_2, int altY_2)
        {
            Console.SetCursorPosition(SchussPosLeft, SchussPosTop);
            Console.Write("!");
            Console.SetCursorPosition(altX_2, altY_2);
    
        }
    }
    


  • du brauchst einen construktor, du kannst nicht einfach methoden ausführen wenn kein einstiegspunkt vorhanden ist, das sieht dann so aus:

    class Spieler
      {
        public Spieler()
        {
          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;
              case ConsoleKey.Spacebar:
                {
                  int altX = Left;
                  int altY = Top;
                  Console.SetCursorPosition(Left, Top - 1);
                  Console.Write("!");
                  Console.SetCursorPosition(altX, altY);
                  Schuss(Left, Top - 5, altX, altY);
                }
                break;
            }
        }
    

    und dann musst du in main den spieler erstellen mit:

    Spieler spieler1 = new Spieler();
    

    aber ich kann dir eig nur empfehlen mal ein grundlagen tutorial in c# zu machen weil das ist wirklich wichtig, ein vernünftiges projekt mittlerer größe sollte gänzlich aus klassen bestehen und nur der input und output in main



  • yo, ich ging davon aus das der standard konstruktor reichen würde... ich habe mich vor ca. nem jahr mit c# und visual c++ (also c++/cli) beschäftigt gehabt aber seit dem aufgehört und quasi wieder neu angefangen die grundlagen sind noch weitgehenst drin aber ein paar sachen sind halt relativ schwammig... ich dachte der std. konstruktor würde dafür ausreichen

    gibts eigl online cook books ? ich hab nicht das nötige kleingeld dafür mit eins für 60-70 e zu kaufen



  • Du kannst mal bei http://www.galileocomputing.de/katalog/openbook vorbeischauen (C#, Visual Basic .Net und OOP sind für dich intereresant). Oder eben zum Nachschauen einzelner Fragen MSDN (oder Forum).



  • Ich besitze die Bücher "Einsteig in Visual C# 2008" und "Der Visual C# Programmierer"

    Einstieg in visual C# hat mich nicht soo sehr begeistert, es ist ok aber es gibt meiner Meinung nach bessere.

    Der Visual C# Programmierer von Hanser ist meiner Meinung nach ein sehr gutes Buch und ich bin auch sehr zufrieden damit... mein problem ist nur das ich manchmal längere coding pausen einlege weil mir der reiz fehlt... ich versuche z.b. ein problem zu lösen, und noch mal und nochmal aber es klappt einfach nicht ... ich breche das projekt ab und höre quasi wieder auf ... ausserdem fehlen mir häufig auch leute mit denen ich übers coden reden kann so dass ich immer wieder dran bleibe... Ich verusche derzeit halt das space invaders projekt erstmal fertig zu stellen . Eigl kenne ich die sachen was ein konstruktor ist usw ja ... das problem ist nur das ich solche sachen hin und wieder vergesse, vorallem wenn ich pausen einlege.

    Code lesen kann ich ja fast ohne probleme, aber selber schreiben wird bei sachen wie SpaceInvaders teilweise schwer... (zu meiner verteidigung, ich kenne viele klassen und methoden aus dem tool nicht wirklich :P) so wusste ich früher z.b. was ein stringbuilder war und wozu er gut war... ich gehe eigl davon aus das ich ihn im projekt gebrauchen kann hab aber wieder vergessen welche member er hatte usw...

    ich muss mich einfach nochmal richtig einleben 😕


Anmelden zum Antworten