![]() |
Snake Programmierung in C
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; } |
Re: Snake Programmierung in C
Hallo shinaia!
Benutze doch bitte das [c] - Tag, um deinen Code farblich etwas hervor zu heben. Wo genau hast du denn Probleme? Es wäre sicherlich hilfreich, wenn du eine etwas spezifischere Frage stellst. ;) Grüße Faux |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz