Einzelnen Beitrag anzeigen

shinaia

Registriert seit: 23. Mai 2006
1 Beiträge
 
#1

Snake Programmierung in C

  Alt 23. Mai 2006, 20: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;
}
  Mit Zitat antworten Zitat