Impressum
< Laufendes O - Teil 6 Inhalt

Das laufende O - Teil 7 (gleichzeitige und dauerhafte Bewegung)

Beschreibung

Die letzte Version des laufendnden Os auf der Konsole zeigt, wie man den Spieler dauerhaft bewegen kann. Er ändert durch einen Tastendruck zwar die Richtung, aber er stoppt nicht, wenn keine Taste gedrückt ist.
Es wird auch gezeigt wie man Gegner gleichzeitig zum O bewegen kann. Das Ziel dieses Programms ist es die Grundlagen für die "Parallelität" zu legen. Ausgehend davon kann man fast alle 2D Spiele realisieren. Das Video liefert für unterschiedliche Verhaltensweisen die passenden Ansätze.
Viel Spaß dabei.

Youtube Video: Das laufende O Teil 7

Der Quellcode

using System; using System.Threading; class Program { static void Main(string[] args) { #region feld initialisieren int[,] feld = { {1,1,1,1,1,1,1,1,1,1,1,1,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,0,0,0,0,0,0,0,0,0,0,0,1,}, {1,1,1,1,1,1,1,1,1,1,1,1,1,}, }; for(int x=0;x<feld.GetLength(0);x++) { for(int y=0;y<feld.GetLength(1);y++) { Console.SetCursorPosition(x,y); if(feld[x,y]==1) Console.Write('#'); else Console.Write(' '); } } #endregion int sx=5,sy=5; int[] gx= new int[10]; int[] gy= new int[10]; int[] gxRichtung = new int[10]; for(int i=0;i<gy.Length;i++) { gy[i]=i+1; gx[i]=i+1; gxRichtung[i]=1; } int kollisionen=0; char c=' '; int zähler =0; do { zähler++; if(zähler>=100) zähler=0; Console.SetCursorPosition(4,13); Console.Write("Kollisionen: "+kollisionen); // Spieler zeichnen Console.SetCursorPosition(sx,sy); Console.Write("O"); for(int i=0;i<gx.Length;i++) { Console.SetCursorPosition(gx[i],gy[i]); Console.Write("X"); } // auf Tastendruck warten if (Console.KeyAvailable) c = Console.ReadKey(true).KeyChar; Thread.Sleep(50); // Spieler löschen Console.SetCursorPosition(sx,sy); Console.Write(' '); for(int i=0;i<gx.Length;i++) { Console.SetCursorPosition(gx[i],gy[i]); Console.Write(" "); } // neue Position "berechnen" for(int i=0;i<gx.Length;i++) { if(zähler%(i+1)==0) { gx[i] = gx[i]+gxRichtung[i]; } if(feld[gx[i],gy[i]]!=0) { gxRichtung[i] = -gxRichtung[i]; gx[i] = gx[i]+gxRichtung[i]; } } for(int i=0;i<gx.Length;i++) { if(gx[i]==sx && gy[i]==sy) { kollisionen++; } } int ox = sx; int oy = sy; if(c=='w') sy--; if(c=='s') sy++; if(c=='a') sx--; if(c=='d') sx++; if(feld[sx,sy]!=0) { sx = ox; sy = oy; } for(int i=0;i<gx.Length;i++) { if(gx[i]==sx && gy[i]==sy) { kollisionen++; } } } while(c!='q'); } }