xandixandi123
Grünschnabel
ich lerne jetzt seit kurzer Zeit c++, und habe ein kleines consolen snake programmiert.
der code ist 419 Zeilen lang und hat viele globale variablen und auch hin und wieder gotos. ich weiß ein nogo aber ich bin noch anfänger
. es gibt sogar sound wenn man ein essen isst. das einzige was ich noch mehr dazu- entwickeln könnte sind levels wo die
schlange schneller wird.
bitte feedback zum code und test ob es noch bugs gibt. und was für ein spiel könnte ich als nächstes porogrammierem,
dass ähnlich schwer zu machen ist?
ich arbeite mit dev c++.
der code ist 419 Zeilen lang und hat viele globale variablen und auch hin und wieder gotos. ich weiß ein nogo aber ich bin noch anfänger

schlange schneller wird.
bitte feedback zum code und test ob es noch bugs gibt. und was für ein spiel könnte ich als nächstes porogrammierem,
dass ähnlich schwer zu machen ist?
ich arbeite mit dev c++.
Code:
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <conio.h>
#define Key_Up 119
#define Key_Down 115
#define Key_Right 100
#define Key_Left 97
#define Leer 0
#define Kopf 1
#define Koerper 2
#define Essen 3
using namespace std;
//die Funktion, die nach Aufruf alles grün macht
void gruen()
{
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(
hStdout,
FOREGROUND_GREEN
);
}
// Position das essens
int pos_essen_a = 0;
int pos_essen_b = 0;
//Level
int level = 1;
//das Koordinatensystem
int feld [21][31];
//das Koordinatensystem(fake, um das Blinken zu ermöglichen wenn man stirbt
int feld_fake [21][31];
//die Position des Kopfes
int pos_kopf_a = 9;
int pos_kopf_b = 14;
//eine Kopie der Kopf cords
int pos_kopf_a_temp;
int pos_kopf_b_temp;
//die Postitonen der Körperteile
int pos_koerper_a[501] = {0};
int pos_koerper_b[501] = {0};
//die Schlangenlänge
int schlange = 1;
// Spawnt Essen
void spawn_essen()
{
anfang:
srand( (unsigned)time( NULL ) );
pos_essen_a = (rand()%(20));
pos_essen_b = (rand()%(30));
if(feld[pos_essen_a][pos_essen_b] != Leer)
//hier muss es ein goto sein um die Funktion zu wiederhohlen, wenn man einfach nur nochmal die Funktion
//spawn_essen aufruft, dann stürtzt das Programm ab
goto anfang;
feld[pos_essen_a][pos_essen_b] = Essen;
}
//die Funktion füllt das Feld mit Null (Leer)
void null_fuellen()
{
for(int a = 0; a < 20; a++)
{
for(int b = 0; b < 30; b++)
{
feld[a][b] = Leer;
}
}
}
//die Funktion zeichnet das Spielfeld
void zeichne_feld()
{
system("cls");
gruen();
cout << "_______________________________\n";
for(int a = 0; a < 20; a++)
{
cout << "|";
for(int b = 0; b < 30; b++)
{
if(a != 19)
{
if(feld[a][b] == Leer) cout << " ";
if(feld[a][b] == Kopf) cout << "O";
if(feld[a][b] == Koerper) cout << "o";
if(feld[a][b] == Essen) cout << "*";
}
if(a == 19)
{
if(feld[a][b] == Leer) cout << "_";
if(feld[a][b] == Kopf) cout << "O";
if(feld[a][b] == Koerper) cout << "o";
if(feld[a][b] == Essen) cout << "*";
}
}
if(a == 2)
cout << "| SCORE: " << schlange << endl;
else cout << "|" << endl;
}
}
void zeichne_feld_fake()
{
system("cls");
gruen();
cout << "_______________________________\n";
for(int a = 0; a < 20; a++)
{
cout << "|";
for(int b = 0; b < 30; b++)
{
if(a != 19)
cout << " ";
if(a == 19)
{
cout << "_";
}
}
if(a == 2)
cout << "| SCORE: " << schlange << endl;
else cout << "|" << endl;
}
}
//Koordinaten in Feld-Daten umwandeln
void uebergebe_pos()
{
for(int i = 1; i <= schlange; i++)
{
feld[pos_koerper_a[i]][pos_koerper_b[i]] = 2;
}
feld[pos_essen_a][pos_essen_b] = 3;
feld[pos_kopf_a][pos_kopf_b] = 1;
}
//Koordinaten Weitergeben an weitere Köorperteile
void weitergeben_pos()
{
pos_kopf_a_temp = pos_kopf_a;
pos_kopf_b_temp = pos_kopf_b;
for(int i = schlange; i >= 2; i--)
{
pos_koerper_a[i] = pos_koerper_a[i-1];
pos_koerper_b[i] = pos_koerper_b[i-1];
}
pos_koerper_a[1] = pos_kopf_a_temp;
pos_koerper_b[1] = pos_kopf_b_temp;
}
//die Schlange Startet nach Rechts
int a = Key_Right;
//der letzte Tastendruck, der vor dem Aktuellem gemacht wurde
int a_2 = 0;
//Game Over
void game_over()
{
for(int i = 0; i < 3; i++)
{
//das Feld blinken lassen
zeichne_feld_fake();
Sleep(500);
zeichne_feld();
Sleep(500);
}
}
//wenn en essen gegessen wurde wird kurz gebeept,
//diese variable is dazu gut das es dann einen kürzeren sleep gibt
int beep_ak = 0;
int main()
{
null_fuellen();
spawn_essen();
//man startet in der mitte
feld[9][14] = 1;
feld[0][0] = 0;
zeichne_feld();
a = getch();
neu_eingabe:
//Wenn eine Taste gedrückt nehme deren Wert an
if(kbhit())
a = getch();
if((a_2 == Key_Down) && (a == Key_Up))
a = Key_Down;
if((a_2 == Key_Up) && (a == Key_Down))
a = Key_Up;
if((a_2 == Key_Right) && (a == Key_Left))
a = Key_Right;
if((a_2 == Key_Left) && (a == Key_Right))
a = Key_Left;
a_2 = a;
switch(a)
{
case Key_Up:
//Wenn oberer Rand dann unterer Rand
if(pos_kopf_a == 0)
{
pos_kopf_a = 20;
}
//Wenn Schlange Schlange berührt dann Game Over
if(feld[pos_kopf_a - 1][pos_kopf_b] == 2)
{
game_over();
return 0;
}
//Wenn Schlange Essen berührt dann ein Teil länger und ein Level höher
if(feld[pos_kopf_a - 1][pos_kopf_b] == 3)
{
feld[pos_kopf_a - 1][pos_kopf_b] == 0;
++ schlange;
beep_ak = 1;
Beep(700,50);
++ level;
spawn_essen();
}
//Wenn nichts berührt, einfach ein Feld Weiter
pos_kopf_a -= 1;
break;
//Dasselbe jetzt nochmal mit den anderen Richtungen
case Key_Down:
if(pos_kopf_a == 19)
{
if(feld[pos_kopf_a - 19][pos_kopf_b] == 3)
{
pos_kopf_a = 0;
++ schlange;
beep_ak = 1;
Beep(700,50);
++ level;
}
if(feld[pos_kopf_a - 19][pos_kopf_b] == 2)
{
game_over();
return 0;
}
pos_kopf_a = 0;
break;
}
if(feld[pos_kopf_a + 1][pos_kopf_b] == 2)
{
game_over();
return 0;
}
if(feld[pos_kopf_a + 1][pos_kopf_b] == 3)
{
feld[pos_kopf_a + 1][pos_kopf_b] == 0;
++ schlange;
beep_ak = 1;
Beep(700,50);
++ level;
spawn_essen();
}
pos_kopf_a += 1;
break;
case Key_Left:
if(pos_kopf_b == 0)
{
if((pos_kopf_a == 0) || (pos_kopf_a == 1) || (pos_kopf_a == 2) || (pos_kopf_a == 3) || (pos_kopf_a == 4) || (pos_kopf_a == 5) || (pos_kopf_a == 6) ||
(pos_kopf_a == 7) || (pos_kopf_a == 8) || (pos_kopf_a == 9) || (pos_kopf_a == 10) || (pos_kopf_a == 11) || (pos_kopf_a == 12) || (pos_kopf_a == 13) ||
(pos_kopf_a == 14) || (pos_kopf_a == 15) || (pos_kopf_a == 16) || (pos_kopf_a == 17) || (pos_kopf_a == 18) || (pos_kopf_a == 19))
{
pos_kopf_b = 30;
}
}
if(feld[pos_kopf_a][pos_kopf_b - 1] == 2)
{
game_over();
return 0;
}
if(feld[pos_kopf_a][pos_kopf_b - 1] == 3)
{
feld[pos_kopf_a - 1][pos_kopf_b] == 0;
++ schlange;
beep_ak = 1;
Beep(700,50);
++ level;
spawn_essen();
}
pos_kopf_b -= 1;
break;
case Key_Right:
if(pos_kopf_b == 29)
{
if((pos_kopf_a == 0) || (pos_kopf_a == 1) || (pos_kopf_a == 2) || (pos_kopf_a == 3) || (pos_kopf_a == 4) || (pos_kopf_a == 5) || (pos_kopf_a == 6) ||
(pos_kopf_a == 7) || (pos_kopf_a == 8) || (pos_kopf_a == 9) || (pos_kopf_a == 10) || (pos_kopf_a == 11) || (pos_kopf_a == 12) || (pos_kopf_a == 13) ||
(pos_kopf_a == 14) || (pos_kopf_a == 15) || (pos_kopf_a == 16) || (pos_kopf_a == 17) || (pos_kopf_a == 18) || (pos_kopf_a == 19))
{
pos_kopf_b = -1;
}
}
if(feld[pos_kopf_a][pos_kopf_b + 1] == 2)
{
game_over();
return 0;
}
if(feld[pos_kopf_a][pos_kopf_b + 1] == 3)
{
feld[pos_kopf_a + 1][pos_kopf_b] == 0;
++ schlange;
beep_ak = 1;
Beep(700,50);
++ level;
spawn_essen();
}
pos_kopf_b += 1;
break;
default:
zeichne_feld();
cout << "\n << PAUSE >>";
a = getch();
goto neu_eingabe;
}
weitergeben_pos();
null_fuellen();
uebergebe_pos();
zeichne_feld();
if(beep_ak = 1)
Sleep(50);
else Sleep(100);
beep_ak = 0;
goto neu_eingabe;
return EXIT_SUCCESS;
}