ich sitze seit letzten Mittwoch dadran Snake zu Programmieren und bin soweit auch sehr zufrieden mit mir. Die meisten meiner Probleme hab ich selbst oder mithilfe von Google gelöst. Doch leider brauch ich jetzt eure Hilfe:(
Das Problem ist folgendes, mein Code funktioniert soweit von dem Spielablauf jedoch hat sich irgendwo ein Fehler eingeschlichen, sodass meine Schlange nur um 1 Körperteil wächst jedoch nicht weiter. Ich habe den Code mehrmals akribisch durchgescannt jedoch kein Fehler in der fürs Wachstum zuständigen Funktion gefunden.
Also erstmal hier der Code:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <unistd.h>
#include <windows.h>
/**Defines für das Array**/
#define Hoehe 20
#define Breite 60
/**Define Array Bedeutung**/
#define Wand 1
#define Platz 0
#define Kopf 2
#define Maus 4
/**Define Tastenbelegung**/
#define Hoch 119
#define Runter 115
#define Links 97
#define Rechts 100
/**Define Schlange**/
#define MaxSchlange Hoehe*Breite
unsigned int x_head=12;
unsigned int y_head=10;
int Schlange[MaxSchlange][2];
int Schlangenlaenge;
int Richtung;
/**Rest**/
unsigned int randomX,randomY;
int a,b;
int x=0;
int y=0;
int Speed;
/**Spielfläche**/
int Spielfeld[Hoehe][Breite];
/**Spielregeln etc**/
int GameOver(){
if(y_head==Hoehe-1||y_head==0||x_head==0||x_head==Breite-1){
return 1;}
if(Spielfeld[y_head][x_head]==2){
return 1;}
else{
return 0;}
}
void GameSpeed(){
if(Schlangenlaenge==4){
Speed=60;}
if(Schlangenlaenge==6){
Speed=2000;}
}
/**Bewegung**/
void BewegungRechts(){
x_head++;}
void BewegungLinks(){
x_head--;}
void BewegungHoch(){
y_head--;}
void BewegungRunter(){
y_head++;}
/**BewegungWASD**/
void Bewegung(){
kbhit();
if(kbhit()!=0)
{
Richtung = getch();
}
if(Richtung == 97)
{
BewegungLinks();
}
else if(Richtung == 115)
{
BewegungRunter();
}
else if(Richtung == 119)
{
BewegungHoch();
}
else if(Richtung == 100)
{
BewegungRechts();
}
Sleep(20);}
/**SpielfeldRelated**/
void FeldDrucken(){
int y,x;
for(y=0;y<Hoehe;y++){
for(x=0;x<Breite;x++){
if(Spielfeld[y][x]==0){
printf(" ");}
if(Spielfeld[y][x]==1){
printf(".");}
if(Spielfeld[y][x]==2){
printf("o");}
if(Spielfeld[y][x]==4){
printf("x");}
}
printf("\n");}
}
void SpielfeldNeu(){
for(a=0;a<Hoehe;a++){
for(b=0;b<Breite;b++){
if((a==0 || a==Hoehe-1) ||(b==0 || b==Breite-1)){
Spielfeld[a][b]=1;}
else Spielfeld[a][b]=0;
}}}
void SpielfeldSauber()
{
int n = 0;
int o = 0;
for(n = 0; n < Hoehe; n++){
for(o = 0; o < Breite; o++){
if(Spielfeld[n][o] == 2){
Spielfeld[n][o] = 0;}
}}}
/**SchlangeAlles**/
void BewegenSchlange(){
for(int i = 0;i<=Schlangenlaenge;i++){
Schlange[i+1][0]=Schlange[i][0];
Schlange[i+1][1]=Schlange[i][1];
}
Schlange[0][0] = y_head;
Schlange[0][1] = x_head;
}
void PrintSchlange(){
for ( int i = 0; i <= Schlangenlaenge; i++ ){
int iY = Schlange[i][0];
int iX = Schlange[i][1];
Spielfeld[iY][iX] = 2;
}}
/**Random Etc.**/
void MausSpawn(){
randomX=rand();
randomY=rand();
randomX=randomX%59;
randomY=randomY%19;
if(randomX==0){
randomX++;}
if(randomY==0){
randomY++;
}
Spielfeld[randomY][randomX]=4;
}
void gotoxy(){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
int main(){
Speed=10;
Richtung = 100;
SpielfeldNeu();
MausSpawn();
do{
GameSpeed();
Bewegung();
if(randomY == y_head && randomX == x_head){
Schlangenlaenge++;
MausSpawn();}
gotoxy(x,y);
BewegenSchlange();
PrintSchlange();
FeldDrucken();
SpielfeldSauber();
}while(GameOver() != 1);
x=15;
y=21;
gotoxy(x,y);
printf("GAME OVER\n");
Sleep(2000);
return 0;
}
Das Problem scheint bei BewegenSchlange oder PrintSchlange zu liegen.Der Code ist noch nicht vollkommen fertig und es gibt auch Sachen wie die GameSpeed Funktion die noch kein Sinn ergeben weil ich sie grade einfach zum Testen nicht benutze:)
Falls ihr den Fehler findet weshalb die Schlange nur nach 1 mal Fressen anwächst wäre ich sehr dankbar dafür.
Da ich das erste mal in einem Programmier Forum was Poste bitte ich um verständnis falls ich nicht alle erforderlichen Informationen gepostet habe!Bei Fragen einfach Posten werde die so schnell wie möglich beantworten.
Gruß,
Prokon