Registriert seit: 23. Mai 2006
1 Beiträge
|
Snake Programmierung in C
23. Mai 2006, 21:58
Hi^^
Ich habe leider ein sehr großes Problem . Ich muss für die Schule Snake in C Programmieren, ich habe dabei folgendes Problem: ich kann damit nicht arbeiten Spielfeld [Snake.oben][Snake.unten] jeweils nicht arbeiten, weil zwei verschiedene Structs verwendet werden -.- für genaueres seht nach unten, der Fehler tritt an einigen Stellen auf! Was kann ich da anders machen?
Ich kopier den Quellcode mal mit ein, hoffe das ist nicht unerlaubt^^.
Code:
#include <stdlib.h>
#include <time.h>
#include "graphics.h"
#define SCREEN_X 800
#define SCREEN_Y 600
#define BGCOLOR WHITE
#define FGCOLOR BLUE
#define FUTTER YELLOW
#define SCHLANGE BLACK
#define SCHLAFZEIT 50
#define MAX_GLIEDER 10
#define LAENG 10
#define BREIT 10
#define SPALT SCREEN_X/LAENG
#define ZEIL SCREEN_Y/BREIT
//Richtungen der Bewegungen
#define OBEN 1
#define LINKS 2
#define UNTEN 3
#define RECHTS 4
//Punkt
struct Punkt {
int x,y;
};
//Rechteck
struct Rechteck {
struct Punkt oben;
struct Punkt unten;
};
//Koordinaten
struct Koord {
int zeile, spalte;
};
//Schlange
struct Snake {
int Farbe;
int anzglieder;
struct Koord Rechteck [MAX_GLIEDER];
};
int main(int argc, char*argv[], char**envp)
{
struct Rechteck Snake;
struct Rechteck Futter;
struct Rechteck Schwanz;
struct Rechteck Snake_neu;
struct Rechteck Spielfeld[SPALT][ZEIL];
struct Punkt Richtung = {0,0}; // Richtungsvektor
struct Punkt neurichtung={0,0};//neue Richtung
int Ende = 0; // Endekennung
int taste;
int i, spalt, zeil;
int gefunden=1;//Futter
// Grafikmous initialisieren
initgraph(SCREEN_X, SCREEN_Y);
// Zeichenflaeche in der Hintergrundfarbe fuellen
cleardevice(BGCOLOR);
//Spielfeld in Rechtecke teilen
for (zeil=0;zeil<ZEIL;zeil++)
{
for (spalt=0;spalt<SPALT;spalt++)
{
Spielfeld [spalt][zeil].oben.x=spalt*LAENG;
Spielfeld [spalt][zeil].oben.y=zeil*BREIT;
Spielfeld [spalt][zeil].unten.x=((spalt+1)*LAENG)-1;
Spielfeld [spalt][zeil].unten.y=((zeil+1)*BREIT)-1;
}
}
// 1. zufaellige Position fuer die Schlange bestimmen, Laufrichtung 0,0
srand((unsigned int)time(NULL));
Snake.oben = rand()%SPALT;
Snake.unten = rand()%ZEIL;
//Kopf ist zuerst auch Schwanz
Schwanz=Snake;
// Schlange ausmalen
setfillstyle(1,FGCOLOR);
bar(Snake.oben * LAENG, Snake.unten*BREIT, Snake.oben*LAENG+BREIT, Snake.unten*LAENG+BREIT);
//... bis zum Ende
i=0;
while (!=Ende)
{
if (i==10)
{
break;
gefunden=1;
}
while ( Spielfeld[Futter.oben][Futter.unten]!=0)
{
//Futter positionieren
srand((unsigned int)time(NULL));
Futter.oben = rand()%SPALT;
Futter.unten = rand()%ZEIL;
}
}
setcolor (FGCOLOR);
while (!=gefunden)//solange Futter nicht gefunden
{
//Auf Eingabe ueberpruefen
if (kbhit())
{
taste=getch;
//wenn ja, Richtungsvektor setzen, 180° Wechsel nicht zulassen
switch(taste)
{
case Key_Left:
neurichtung.x = -1;
neurichtung.y = 0;
break;
case Key_Right:
neurichtung.x = 1;
neurichtung.y = 0;
break;
case Key_Up:
neurichtung.x = 0;
neurichtung.y = -1;
break;
case Key_Down:
neurichtung.x = 0;
neurichtung.y = 1;
break;
case Key_Escape: // Programmende
gefunden = 0;
Ende=1;
break;
}
}
if (((neurichtung.x!=Richtung.x)&&(neurichtung.x+Richtung.x!=0)||(neurichtung.y!=Richtung.y)&&(neurichtung.y+Richtung.y!=0)
{
//Richtung muss geaendert werden
Richtung=neurichtung;
}
//ignorieren:alter Richtungwechsel bleibt
if (Richtung.x==0&&Richtung.y==-1)
{
Spielfeld[Snake.oben][Snake.unten]=OBEN;
}
else if (Richtung.x==0&&Richtung.y==1)
{
Spielfeld[Snake.oben][Snake.unten]=UNTEN;
}
else if (Richtung.x==1&&Richtung.y==0)
{
Spielfeld[Snake.oben][Snake.unten]=RECHTS;
}
else (Richtung.x==-1&&Richtung.y==0)
{
Spielfeld[Snake.oben][Snake.unten]=LINKS;
}
// neue Kopfposition berechnen
Snake_neu.oben = Snake.oben + Richtung.x;
Snake_neu.unten = Snake.unten + Richtung.y;
//Kopf ist ....
// Hindernisse
//Rand
// X -Richtung
if(Snake_neu.oben< 0 || Snake_neu.oben>=SPALT)
{
Ende=1;
gefunden=0;
}
// y -Richtung
if(Snake_neu.unten < 0 || Snake_neu.unten>=ZEIL)
{
Ende=1;
gefunden=0;
}
//pruefen ob Schlange mit sich selbst oder Hindernis kollidiert
switch (Spielfeld[Snake_neu.oben][Snake_neu.unten])
{
case OBEN;
case LINKS;
case UNTEN;
case RECHTS;
Ende=1;
gefunden=0;
break;
}
if(!Ende)
{
if (Spielfeld [Snake_neu.oben][Snake_neu.unten]==FUTTER)//wenn Futter gefunden ist
{
// Futter in Hintergrundfarbe malen (loeschen)
setcolor(BGCOLOR);
circle(Futter.oben*LAENG+LAENG/2, Futter.unten*BREIT+BREIT/2, (LAENG-2)/2);
// neuen Schlangenteil malen
setfillstyle (1,FGCOLOR);
bar(Snake_neu.oben*LAENG, Snake_neu.unten*BREIT, Snake_neu.oben*LAENG+LAENG, Snake_neu.unten*BREIT+BREIT);
//ab jetzt ist die alte Schlange die neue
Snake=Snake_neu;
gefunden=0;
}
else
{
//alten Schwanz loeschen
setfillstyle(1,BGCOLOR);
bar(Schwanz.oben*LAENG, Schwanz.unten*BREIT, Schwanz.oben*LAENG+LAENG, Schwanz.unten*BREIT+BREIT);
//neue Schlange malen
setfillstyle (1,FGCOLOR);
bar(Snake_neu.oben*LAENG, Snake_neu.unten*BREIT, Snake_neu.oben*LAENG+LAENG, Snake_neu.unten*BREIT+BREIT);
Snake=Snake_neu;
//neue Position für Schwanz
switch(Spielfeld[Schwanz.oben][Schwanz.unten])
{
case OBEN:
Spielfeld[Schwanz.oben][Schwanz.unten]=0;
Schwanz.unten--;//oben
break;
case LINKS:
Spielfeld[Schwanz.oben][Schwanz.unten]=0;
Schwanz.unten--;//links
break;
case UNTEN:
Spielfeld[Schwanz.oben][Schwanz.unten]=0;
Schwanz.unten++;/unten
break;
case RECHTS:
Spielfeld[Schwanz.oben][Schwanz.unten]=0;
Schwanz.oben++;
break;
}
}
// ein bisschen schlafen, damits nicht zu schnell wird
delay(SCHLAFZEIT);
}
}
i++;
}
// Grafikmodus beenden
getch();
closegraph();
return 0;
}
|
|
Zitat
|