Hallo liebe Forummitglieder,
ich habe in der letzten Zeit ein Snake Spiel für die Konsole(cmd) mit c++ programmiert.
Nun zu meinem Problem:
Der Script ist im Prinzip so aufgebaut:
While(Schlange stößt gegen nichts gegen)
{
vorheriges Bild löschen(mit system("cls"))
neues Bild anzeigen
Sleep(200) Wartezeit(sozusagen "Geschwindigkeit der Schlange")
}
Gibt es da nicht vielleicht eine Möglichkeit?
Hier ist der kürzere Script:
Komplexer Script mit vielen Funktionen:
(Falls jemand mal mein Snake ausprobieren und mir Feedback geben möchte
)
Grüße und Dank im vorraus
Zavy
ich habe in der letzten Zeit ein Snake Spiel für die Konsole(cmd) mit c++ programmiert.
Nun zu meinem Problem:
Der Script ist im Prinzip so aufgebaut:
While(Schlange stößt gegen nichts gegen)
{
vorheriges Bild löschen(mit system("cls"))
neues Bild anzeigen
Sleep(200) Wartezeit(sozusagen "Geschwindigkeit der Schlange")
}
Gibt es da nicht vielleicht eine Möglichkeit?
Hier ist der kürzere Script:
C++:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
using namespace std;
const int hoehe=20;
const int breite=40;
int snakelaenge=3;
int xsnake[200], ysnake[200];
int field[hoehe][breite];//field[Höhe des Spielfelds][Breite des Spielfelds]
int richtung=1;//Richtung: 1=rechts, 2=links, 3=oben, 4=unten
bool loose=false;
int foodx[2];
int foody[2];
int punkte=0;
int level=0;
int schwierigkeit[10]={200, 180, 150, 130, 110, 90, 80, 60, 40, 20};
void clearfield()
{
for(int x=0; x<20; x++)
{
for(int y=0; y<10; y++)
{
field[x][y]=0;
}
}
}
int clearsnake()
{
for(int a=0; a<200; a++)
{
xsnake[a]=0;
ysnake[a]=0;
}
xsnake[0]=4;
ysnake[0]=hoehe/2;
xsnake[1]=3;
ysnake[1]=hoehe/2;
xsnake[2]=2;
ysnake[2]=hoehe/2;
snakelaenge=3;
richtung=1;
}
void setborder()
{
for(int x=0; x<hoehe; x++)
{
for(int y=0; y<breite; y++)
{
if(x==0 || x==hoehe-1){field[x][y]=1;}
else if(y==0 || y==breite-1){field[x][y]=1;}
else {field[x][y]=0;}
}
}
}
void setsnake()
{
for(int a=0; a<snakelaenge; a++)
{
field[ysnake[a]][xsnake[a]]=2;
}
field[ysnake[0]][xsnake[0]]=4;
}
void movetail()
{
for(int i=snakelaenge-1; i>0; i--)
{
xsnake[i]=xsnake[i-1];
ysnake[i]=ysnake[i-1];
}
}
void movesnake()
{
movetail();
switch(richtung)
{
case 3:{ysnake[0]--;break;}
case 2:{xsnake[0]--;break;}
case 4:{ysnake[0]++;break;}
case 1:{xsnake[0]++;break;}
}
}
void eingabeabfrage()
{
if(kbhit())
{
char taste=getch();
switch(taste)
{
case'w':
{
if(richtung!=4){richtung=3;}
break;
}
case'a':
{
if(richtung!=1){richtung=2;}
break;
}
case's':
{
if(richtung!=3){richtung=4;}
break;
}
case'd':
{
if(richtung!=2){richtung=1;}
break;
}
}
}
}
void drawfield()
{
for(int x=0; x<hoehe; x++)
{
for(int y=0; y<breite; y++)
{
if(field[x][y]==1){cout<<"+";} //Spielfeldbegrenzung
else if(field[x][y]==2){cout<<"o";} //Schlangenkörper
else if(field[x][y]==3){cout<<"#";} //Essen
else if(field[x][y]==4){cout<<"@";} //Schlangenkopf
else cout<<" ";
}
cout<<endl;
}
}
void verlierbedingungen()
{
if(xsnake[0]==0){loose=true;}
if(xsnake[0]==breite-1){loose=true;}
if(ysnake[0]==0){loose=true;}
if(ysnake[0]==hoehe-1){loose=true;}
}
void clearfood()
{
foodx[0]=rand()%(breite-3)+1;
foodx[1]=rand()%(breite-3)+1;
foody[1]=rand()%(hoehe-3)+1;
foody[0]=rand()%(hoehe-3)+1;
while(foodx[0]==foodx[1]) //Damit nicht beide Essensblöcke auf einem Fleck sind
{
foodx[0]=rand()%(breite-3)+1;
foodx[1]=rand()%(breite-3)+1;
}
}
void setfood()
{
field[foody[0]][foodx[0]]=3;
field[foody[1]][foodx[1]]=3;
}
int essen()
{
if(xsnake[0]==foodx[0]&&ysnake[0]==foody[0])
{
snakelaenge++;
foodx[0]=rand()%(breite-3)+1;
foody[0]=rand()%(hoehe-3)+1;
while(foodx[0]==foodx[1]) //Damit nicht beide Essensblöcke auf einem Fleck sind
{
foodx[0]=rand()%(breite-3)+1;
}
punkte+=10;
}
if(xsnake[0]==foodx[1]&&ysnake[0]==foody[1])
{
snakelaenge++;
foodx[1]=rand()%(breite-3)+1;
foody[1]=rand()%(hoehe-3)+1;
while(foodx[1]==foodx[0]) //Damit nicht beide Essensblöcke auf einem Fleck sind
{
foodx[1]=rand()%(breite-3)+1;
}
punkte+=10;
}
}
int main()
{
srand(time(0));
cout<<"Hallo und danke, dass du mein Snake-Spiel spielst.\ndu kannst dich mit den Tasten W, A, S & D bewegen:\n\nW - oben\nS - unten\nA - links\nD - rechts\n\nUm das Spiel zu starten, eine beliebige Taste drücken...";
getch();
clearfield();
clearsnake();
clearfood();
while(loose==false)
{
system("cls");
setborder();
setfood();
setsnake();
drawfield();
eingabeabfrage();
movesnake();
essen();
verlierbedingungen();
level=punkte/40;
cout<<endl<<"Deine Punktzahl: "<<punkte<<endl<<"Dein erreichtest Level: "<<level<<endl<<"Laenge deiner Schlange: "<<snakelaenge<<endl;
Sleep(schwierigkeit[level]);
}
cout<<"Du hast Verloren"<<endl;
getch();
return 0;
}
Komplexer Script mit vielen Funktionen:
(Falls jemand mal mein Snake ausprobieren und mir Feedback geben möchte

C++:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <time.h>
using namespace std;
const int hoehe=19;
const int breite=40;
int snakelaenge=3;
int xsnake[hoehe*breite], ysnake[hoehe*breite];//x-, bzw. y-Position des zugehörigen Schlangenteils
int field[hoehe][breite];//field[Höhe des Spielfelds][Breite des Spielfelds]
int richtung=1;//Richtung: 1=rechts, 2=links, 3=oben, 4=unten
bool loose=false;//falls true: VERLOREN
int foodx[2];//x-position des Essens
int foody[2];//y-position des Essens
int punkte=0;
int level=0;
int zahl=40;// Level=Punkte/zahl
int weg=0;//zurückgelegter Weg
int schwierigkeit[13]={200, 180, 150, 130, 110, 90, 80, 60, 40, 30, 20, 10, 5};
bool infinitesnake=false;
bool warp=false;
bool ghost=false;
char border='X';
char snaketail='o';
char snakehead='@';
char food='#';
void defaultanswer()
{
cout<<"Bitte gib eine der angegebenen Nummern, bzw. Zeichen ein.";
cout<<endl<<endl<<"Bitte beliebige Taste druecken...";
getch();
}
void clearfield()
{
for(int x=0; x<20; x++)
{
for(int y=0; y<10; y++)
{
field[x][y]=0;
}
}
}
int clearsnake()
{
for(int a=0; a<200; a++)
{
xsnake[a]=0;
ysnake[a]=0;
}
xsnake[0]=4;
ysnake[0]=hoehe/2;
xsnake[1]=3;
ysnake[1]=hoehe/2;
xsnake[2]=2;
ysnake[2]=hoehe/2;
snakelaenge=3;
richtung=1;
}
void setborder()
{
for(int x=0; x<hoehe; x++)
{
for(int y=0; y<breite; y++)
{
if(x==0 || x==hoehe-1){field[x][y]=1;}
else if(y==0 || y==breite-1){field[x][y]=1;}
else {field[x][y]=0;}
}
}
}
void setsnake()
{
for(int a=0; a<snakelaenge; a++)
{
field[ysnake[a]][xsnake[a]]=2;
}
field[ysnake[0]][xsnake[0]]=4;
}
void movetail()
{
if(infinitesnake==true){snakelaenge++;}
for(int i=snakelaenge-1; i>0; i--)
{
xsnake[i]=xsnake[i-1];
ysnake[i]=ysnake[i-1];
}
}
void movesnake()
{
movetail();
switch(richtung)
{
case 3:{ysnake[0]--;break;}
case 2:{xsnake[0]--;break;}
case 4:{ysnake[0]++;break;}
case 1:{xsnake[0]++;break;}
}
}
void eingabeabfrage()
{
if(kbhit())
{
char taste=getch();
switch(taste)
{
case'w':
{
if(richtung!=4){richtung=3;}
break;
}
case'a':
{
if(richtung!=1){richtung=2;}
break;
}
case's':
{
if(richtung!=3){richtung=4;}
break;
}
case'd':
{
if(richtung!=2){richtung=1;}
break;
}
case'b':
{
loose=true;
break;
}
case' ':
{
char key;
cout<<"*** SPIEL PAUSIERT *** SPIEL PAUSIERT *** SPIEL PAUSIERT *** SPIEL PAUSIERT ***\n*** SPIEL PAUSIERT *** SPIEL PAUSIERT *** SPIEL PAUSIERT *** SPIEL PAUSIERT ***\n\nZum Weiterspielen erneut Leertaste druecken.";
while(key!=' ')
{
if(kbhit())
{
key=getch();
}
}
break;
}
}
}
}
void drawfield()
{
for(int x=0; x<hoehe; x++)
{
for(int y=0; y<breite; y++)
{
if(field[x][y]==1){cout<<border;} //Spielfeldbegrenzung
else if(field[x][y]==2){cout<<snaketail;} //Schlangenkörper
else if(field[x][y]==3){cout<<food;} //Essen
else if(field[x][y]==4){cout<<snakehead;} //Schlangenkopf
else cout<<" ";
}
cout<<endl;
}
}
void verlierbedingungen()
{
if(warp==false)
{
if(xsnake[0]==0){loose=true;}
if(xsnake[0]==breite-1){loose=true;}
if(ysnake[0]==0){loose=true;}
if(ysnake[0]==hoehe-1){loose=true;}
}
else
{
if(xsnake[0]==0){xsnake[0]=breite-2;}
if(xsnake[0]==breite-1){xsnake[0]=1;}
if(ysnake[0]==0){ysnake[0]=hoehe-2;}
if(ysnake[0]==hoehe-1){ysnake[0]=1;}
}
if(ghost==false)
{
for(int i=snakelaenge; i>2; i--)
{
if(xsnake[i]==xsnake[0]&&ysnake[i]==ysnake[0]){loose=true;}
}
}
}
void clearfood()
{
foodx[0]=rand()%(breite-3)+1;
foodx[1]=rand()%(breite-3)+1;
foody[1]=rand()%(hoehe-3)+1;
foody[0]=rand()%(hoehe-3)+1;
while(foodx[0]==foodx[1]) //Damit nicht beide Essensblöcke auf einem Fleck sind
{
foodx[0]=rand()%(breite-3)+1;
foodx[1]=rand()%(breite-3)+1;
}
}
void setfood()
{
field[foody[0]][foodx[0]]=3;
field[foody[1]][foodx[1]]=3;
}
int essen()
{
if(xsnake[0]==foodx[0]&&ysnake[0]==foody[0])
{
snakelaenge++;
foodx[0]=rand()%(breite-3)+1;
foody[0]=rand()%(hoehe-3)+1;
for(int i=snakelaenge; i>=0; i--)
{
while(foodx[0]==xsnake[i]&&foody[0]==ysnake[i]||foodx[1]==xsnake[i]&&foody[1]==ysnake[i]) //Damit nicht beide Essensblöcke auf einem Fleck sind
{
foodx[0]=rand()%(breite-3)+1;
foodx[1]=rand()%(breite-3)+1;
foody[1]=rand()%(hoehe-3)+1;
foody[0]=rand()%(hoehe-3)+1;
}
}
punkte+=10;
}
if(xsnake[0]==foodx[1]&&ysnake[0]==foody[1])
{
snakelaenge++;
foodx[1]=rand()%(breite-3)+1;
foody[1]=rand()%(hoehe-3)+1;
while(foodx[1]==foodx[0]) //Damit nicht beide Essensblöcke auf einem Fleck sind
{
foodx[1]=rand()%(breite-3)+1;
}
punkte+=10;
}
}
void difficulty()
{
cout<<"Dezeit erhoeht sich das Level alle "<<zahl<<" Punkte. Wie viel Punkte sollen benoetigt werden, um ins naechste Level zu kommen?\n\nEingabe: ";
cin>>zahl;
cout<<endl<<endl<<"Nun erhoeht sich das Level alle "<<zahl<<" Punkte.";
cout<<endl<<endl<<"Bitte beliebige Taste druecken...";
getch();
}
void ghostsnake()
{
int i=1;
char auswahl2;
if(ghost==true)
{
cout<<"Ghost-Snake ist AN, soll es ausgeschaltet werden?\n(gib 'j' fuer JA, bzw. 'n' fuer NEIN ein)\n\nEingabe: ";
cin>>auswahl2;
switch(auswahl2)
{
case 'j':
case 'J':
{
cout<<"Ghost-Snake ist nun AUS.";
ghost=false;
i=0;
break;
}
case 'n':
case 'N':
{
cout<<"Ghost-Snake bleibt AN.";
break;
}
default:
{
defaultanswer();
break;
}
}
}
if(ghost==false&&i==1)
{
cout<<"Ghost-Snake ist AUS, soll es angeschaltet werden?\n(gib 'j' fuer JA, bzw. 'n' fuer NEIN ein)\n\nEingabe: ";
cin>>auswahl2;
switch(auswahl2)
{
case 'j':
case 'J':
{
cout<<"Ghost-Snake ist nun AN.";
ghost=true;
break;
}
case 'n':
case 'N':
{
cout<<"Ghost-Snake bleibt AUS.";
break;
}
default:
{
defaultanswer();
break;
}
}
}
i=1;
cout<<endl<<endl<<"Bitte beliebige Taste druecken...";
getch();
}
void designs()
{
char designauswahl;
while(designauswahl!='e')
{
system("cls");
clearfield(); //Spielfeld intialisieren
clearsnake();
clearfood();
setborder();
setfood();
setsnake();
drawfield(); //Spielfeld ausgeben
cout<<endl<<"So wuerde das Spielfeld nun aussehen."<<endl<<endl;
cout<<"Welches Design darf es denn sein?\n\n[1] Default\n[2] Geometrische Figuren\n[3] Einfach knuffig :D\n[4] Alien!!\n[5] Mathe Freak\n[6] Skat-Blatt\n\n[F]ertig\n\nDeine Eingabe: ";
cin>>designauswahl;
switch(designauswahl)
{
case '1':
{
border='X';
snaketail='o';
snakehead='@';
food='#';
break;
}
case '2':
{
border=static_cast<unsigned char>(219);;
snaketail=static_cast<unsigned char>(254);
snakehead=static_cast<unsigned char>(254);
food=static_cast<unsigned char>(4);
break;
}
case '3':
{
border=static_cast<unsigned char>(14);
snaketail=static_cast<unsigned char>(254);
snakehead=static_cast<unsigned char>(2);
food=static_cast<unsigned char>(3);
break;
}
case '4':
{
border=static_cast<unsigned char>(177);
snaketail=static_cast<unsigned char>(247);
snakehead=static_cast<unsigned char>(44);
food=static_cast<unsigned char>(15);
break;
}
case '5':
{
border=static_cast<unsigned char>(241);
snaketail='-';
snakehead='+';
food=static_cast<unsigned char>(171);
break;
}
case '6':
{
border=static_cast<unsigned char>(5);
snaketail=static_cast<unsigned char>(3);
snakehead=static_cast<unsigned char>(6);
food=static_cast<unsigned char>(4);
break;
}
case 'f':
case 'F':
{
designauswahl='e';
break;
}
default:
{
defaultanswer();
break;
}
}
}
}
void aussehen()
{
char eingabe;
while(eingabe!='e')
{
system("cls");
clearfield(); //Spielfeld intialisieren
clearsnake();
clearfood();
setborder();
setfood();
setsnake();
drawfield(); //Spielfeld ausgeben
cout<<endl<<"So wuerde das Spielfeld nun aussehen.\nWas moechtest du veraendern?"<<endl<<endl;
cout<<"[1] Schlangenkoerper (default: o)\n[2] Schlangenkopf (default @)\n[3] Spielfeldgrenze (default: X)\n[4] Essen (default: #)\n[5] Vorgefertigte Designs (by Benny xD)\n\n[F]ertig"<<endl<<endl<<"Deine Eingabe: ";
cin>>eingabe;
switch(eingabe)
{
case '1':
{
cout<<"Wie soll der Schlangenkoerper aussehen(!nur 1 Zeichen!)?";
cin>>snaketail;
break;
}
case '2':
{
cout<<"Wie soll der Schlangenkopf aussehen(!nur 1 Zeichen!)?";
cin>>snakehead;
break;
}
case '3':
{
cout<<"Wie soll die Spielfeldbegrenzung aussehen(!nur 1 Zeichen!)?";
cin>>border;
break;
}
case '4':
{
cout<<"Wie soll das Essen aussehen(!nur 1 Zeichen!)?";
cin>>food;
break;
}
case '5':
{
designs();
break;
}
case 'f':
case 'F':
{
eingabe='e';
break;
}
default:
{
defaultanswer();
break;
}
}
}
}
void warpwand()
{
int i=1;
char auswahl2;
if(warp==true)
{
cout<<"Warp-Wand ist AN, soll es ausgeschaltet werden?\n(gib 'j' fuer JA, bzw. 'n' fuer NEIN ein)\n\nEingabe: ";
cin>>auswahl2;
switch(auswahl2)
{
case 'j':
case 'J':
{
cout<<"Warp-Wand ist nun AUS.";
warp=false;
i=0;
break;
}
case 'n':
case 'N':
{
cout<<"Warp-Wand bleibt AN.";
break;
default:
{
defaultanswer();
break;
}
}
}
}
if(warp==false&&i==1)
{
cout<<"Warp-Wand ist AUS, soll es angeschaltet werden?\n(gib 'j' fuer JA, bzw. 'n' fuer NEIN ein)\n\nEingabe: ";
cin>>auswahl2;
switch(auswahl2)
{
case 'j':
case 'J':
{
cout<<"Warp-Wand ist nun AN.";
warp=true;
break;
}
case 'n':
case 'N':
{
cout<<"Warp-Wand bleibt AUS.";
break;
}
default:
{
defaultanswer();
break;
}
}
}
i=1;
cout<<endl<<endl<<"Bitte beliebige Taste druecken...";
getch();
}
void infsnake()
{
int i=1;
char auswahl2;
if(infinitesnake==true)
{
cout<<"Infinite-Snake ist AN, soll es ausgeschaltet werden?\n(gib 'j' fuer JA, bzw. 'n' fuer NEIN ein)\n\nEingabe: ";
cin>>auswahl2;
switch(auswahl2)
{
case 'j':
case 'J':
{
cout<<"Infinite-Snake ist nun AUS.";
infinitesnake=false;
i=0;
break;
}
case 'n':
case 'N':
{
cout<<"Infinite-Snake bleibt AN.";
break;
}
default:
{
defaultanswer();
break;
}
}
}
if(infinitesnake==false&&i==1)
{
cout<<"Infinite-Snake ist AUS, soll es angeschaltet werden?\n(gib 'j' fuer JA, bzw. 'n' fuer NEIN ein)\n\nEingabe: ";
cin>>auswahl2;
switch(auswahl2)
{
case 'j':
case 'J':
{
cout<<"Infinite-Snake ist nun AN.";
infinitesnake=true;
break;
}
case 'n':
case 'N':
{
cout<<"Infinite-Snake bleibt AUS.";
break;
}
default:
{
defaultanswer();
break;
}
}
}
i=1;
cout<<endl<<endl<<"Bitte beliebige Taste druecken...";
getch();
}
void einstellungen()
{
system("cls");
char auswahl;
cout<<"Was moechtest du veraendern?\n\n[1] Schwierigkeit\n[2] Aussehen\n[3] Warp-Wand(wenn du z.B. rechts rausgehst, kommst du links wieder rein)\n[4] Infinite-Snake(der Schweif deiner Schlange bewegt sich nicht mehr mit)\n\nEingabe: ";
cin>>auswahl;
switch(auswahl)
{
case '1':
{
difficulty();
break;
}
case '2':
{
aussehen();
break;
}
case '3':
{
warpwand();
break;
}
case '4':
{
infsnake();
break;
}
case '5':
{
ghostsnake();
break;
}
default:
{
defaultanswer();
break;
}
}
}
void highscore()
{
system("cls");
cout<<"Du hast leider verloren :(\n\nHier sind deine Ergebnisse:\nDeine Punktzahl: "<<punkte<<"\nDein erreichtest Level: "<<level<<"\nLaenge deiner Schlange: "<<snakelaenge<<"\nZurueckgelegter Weg: "<<weg<<endl<<endl;
system("pause");
}
void spiel()
{
clearfield();
clearsnake();
clearfood();
loose=false;
level=0;
punkte=0;
while(loose==false)
{
system("cls");
setborder();
setfood();
setsnake();
drawfield();
eingabeabfrage();
movesnake();
essen();
verlierbedingungen();
weg++;
level=punkte/zahl;
if(level>=12){level=12;}
cout<<endl<<"Deine Punktzahl: "<<punkte<<endl<<"Dein erreichtest Level: "<<level<<endl<<"Laenge deiner Schlange: "<<snakelaenge<<endl<<"Zurueckgelegter Weg: "<<weg<<endl;
Sleep(schwierigkeit[level]);
if(snakelaenge==hoehe*breite)
{
loose=true; //Wenn die Schlange so groß, wie das gesamte Spielfeld ist, hat der Suchti/Cheater gewonnen
}
}
if(snakelaenge==hoehe*breite)
{
cout<<endl<<endl<<"DU HAST GEWONNEN************************\nWTF, du hast Snake durchgespielt******\nAlso entweder bist du ein totaler Pro(auch Suchti genannt) oder ein dreckiger Cheater :D"<<endl<<endl;
Sleep(1000);
system("pause");
}
else
{
Sleep(1000);
highscore();
}
}
int main()
{
char auswahl;
srand(time(0));
cout<<"Hallo und danke, dass du mein Snake-Spiel spielst.\ndu kannst dich mit den Tasten W, A, S & D bewegen:\n\nW - oben\nS - unten\nA - links\nD - rechts\nB - Aufgeben(ein laufendesw Spiel beenden)\nSpace(Leertaste) - Pause\n\n";
while(true)
{
cout<<"[S]piel starten\n[E]instellungen\n[B]eenden\n\nEingabe: ";
cin>>auswahl;
system("cls");
switch(auswahl)
{
case 'S':
case 's':
{
spiel();
break;
}
case 'E':
case 'e':
{
einstellungen();
break;
}
case 'B':
case 'b':
{
return 0;
}
default:
{
defaultanswer();
break;
}
}
system("cls");
}
}
Grüße und Dank im vorraus
Zavy