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');
}
}