Zum Inhalt springen

Problem mit einem goto Befehl in snake


geloescht_saschabu

Empfohlene Beiträge

So, ich mal wieder....habe ein problem das eigentlich ganz simple ist:

Ich versuch grad snake in c++ zu programmieren hab auch schon etws hinbekommen aber ist schwerer als ich gedacht hab....

doch das eigentliche problem ich versteh nicht warum dieser goto Befehl nicht ganz funktioniert:

gameover:

clrscr();

gotoxy(39,12);

printf("Game Over!");

delay (1300);

exit (1);

Also wie man sieht ist das der game over befehl wenn die schlange gegen die wand fährt. es funktionierte auch eine weile perfekt doch irgendwie kommt jetzt immen ein schwarzer bildschirm sobald gameover aufgerufen ist und den compiler hat es dann abgeschossen...finito.

und das jedes mal...nachdem das passiert ist muss man den compiler neu starten sonst geht nichts mehr wenn man neu compiliert...

woran liegt das? und vielleicht kann man das ganze etwas verfeinern...

danke schon mal

MfG

saschabu

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ohne den Rest deines Codes zu kennen, kann man da nicht viel zu sagen. Generell solltest du goto nur dann verwenden, wenn es gar nicht anders geht. Und eigentlich geht es immer anders. ;)

Auch auf die Verwendung von exit sollte man nach Möglichkeit verzichten.

Was passiert denn, wenn du das Programm im Debugger startest?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also in dem Stück Code das du gepostest hast kann ich keinen Fehler erkennen,

wenn du goto richtig aufrufst sollte es eigentlich klappen.

und vielleicht kann man das ganze etwas verfeinern...

Nicht nur ein bischen;)

Du solltest kein goto verwenden, das gehört zu der unsaubersten Art zu

programmieren, weil das Programm dadurch schrecklich unübersichtlich wird.

Stattdessen wäre es vieeeel besser Funktion, if und switch Anweisungen zu

benutzen.

EDIT: Argh, mal wieder zu langsam getippt. :D

Gruß

Guybrush

Link zu diesem Kommentar
Auf anderen Seiten teilen

jungs, stellt euch vor ich hab eine switch case anweisung als bewegung der snake schlange. und es gibt nur zwei (dabei wird es auch bleiben) goto Befehle: einmal zum Anfang gehen und einmal gameover...denn da wäre noch mehr die übersicht getrübt gewesen und es war easy zu realiesieren. habe schon alleine mit dem umdrehen der schlange riesen abfragen...also ihr wollte euch wirklich diesen quelltext anschauen? der ist ausgedruckt acht seiten lang....

MfG

saschabu

Link zu diesem Kommentar
Auf anderen Seiten teilen

viel Spaß:

// Snake

// 30.11.01

// Sascha

#include <stdio.h>

#include <conio.h>

#include <dos.h>

#include <graphics.h>

#include<stdlib.h>

void hideCursor();

void main (void)

{

Anfang:

int eing,up,tastendruck;

char bewegung;

int w=0,a=0,d=0,s=0,y,x,i=0,movex=0,movey=0,um_w=0,true=0;

clrscr();

gotoxy(30,12);

/* printf("***S N A K E***") ;

gotoxy(30,13);

printf("\t Testversion");

sleep (01); */

clrscr();

printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("³ ³");

printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");

if(i==0)

{

y=12;//12;0-25 //24 ist ende

x=40; //0-80 //80 ist ende

gotoxy(x,y );

}

bewegungsnake:

bewegung=getch();

movex=x;//movex;

movey=y;//movey;

switch (bewegung)

{

case 'w': if (bewegung='w') //bewegung nach oben also w.

{

i++;

um_w++; //umkehrung der schlange nach drücken der taste s=unten

}

y--;

gotoxy(x,y);

if(i>2) //wenn mehr als zwei mal gedrückt wurde den i wert auf zwei setzen

{

i=2;

}

if (i==2) //wenn zwei mal die taste i gedrückt wurde, eine zeile löschen

{

printf("º");

movey=movey+1;

// movex=movex+1;

gotoxy(movex,movey);

textcolor (0);

cprintf("Û");

movey=movey-2;

gotoxy(movex,movey);

}

if (w==0) //das erste mal drücken ist w=0

{

printf("º");

}

// printf("Taste: %c\n", bewegung);

// printf("ASCII: %d\n", bewegung);

if (w==1) //abfrage wie die ecken erstellt werden a

//entspricht w==1, d==2 entspricht somit rechts drehung d

{

y=y+1;

x=x-1;

gotoxy(x,y);

printf("È");

w=0;

}

if (w==2)

{

y=y+1;

x=x+1;

gotoxy(x,y);

printf("¼");

w=0;

}

a=1; //links //werte für die erstellung der ecken auf 1 gestellt

d=1; //rechts

if(y==2) //Abfrage wenn die schlange den oberen rand erreicht hat

{

goto gameover; //gameover

break;

}

goto bewegungsnake; //neuanfang der bewegung mit neuabfragung der tasten

//if(bewegung==x){

//printf("hello");}

case 's': if (bewegung=='s')

{

i++;

}

y++;

gotoxy(x,y);

if(i>2)

{

i=2;

}

if (um_w<2) //Drehung von w zu s

{

um_w=2;

}

if(um_w==2)// Sobald dies passiert dreht sich die schlang sauber

{

movey=movey+2;

gotoxy(movex,movey);

movey=movey-1;

printf("º");

true=1;

}

if (i==2)

{

printf("º");

movey=movey-1;

// movex=movex+1;

if(true==0) //test zur löschung doch fehlerhaft

{

gotoxy(movex,movey);

textcolor (0);

cprintf("Û");

movey=movey+2;

gotoxy(movex,movey);

}

}

if (s==0)

{

printf("º");

}

//printf("Taste: %c\n", bewegung);

//printf("ASCII: %d\n", bewegung);

if (s==1)

{

y=y-1;

x=x-1;

gotoxy(x,y);

printf("É");

s=0;

}

if (s==2)

{

y=y-1;

gotoxy(x,y);

printf("»");

s=0;

}

a=2;

d=2;

if(y>=23)

{goto gameover;}

goto bewegungsnake;

//if(bewegung==x){

//printf("hello");}

case 'a':

x--;

gotoxy(x,y);

if (a==0)

{

printf("Ã");

}

// printf("Taste: %c\n", bewegung);

// print

//("ASCII: %d\n", bewegung);

if (a==1)

{

y=y-1;

x=x+1;

gotoxy(x,y);

printf("»");

a=0;

}

if (a==2)

{

y=y+1;

x=x+1;

gotoxy(x,y);

printf("¼");

a=0;

}

w=1;

s=1;

if(x==2)

{goto gameover;}

goto bewegungsnake;

//if(bewegung==x){

//printf("hello");}

case 'd':

x++;

gotoxy(x,y);

if (d==0)

{

printf("Ã");

}

// printf("Taste: %c\n", bewegung);

// printf("ASCII: %d\n", bewegung);

if (d==1)

{

y=y-1;

x=x-1;

gotoxy(x,y);

printf("É");

d=0;

}

if (d==2)

{

y=y+1;

x=x-1;

gotoxy(x,y);

printf("È");

d=0;

}

w=2;

s=2;

if(x==78)

{goto gameover;}

goto bewegungsnake;

//if(bewegung==x){

//printf("hello");}

gameover:

clrscr();

gotoxy(39,12);

printf("Game Over!");

delay (1300);

exit (1);

}

/*

printf("\n\n\n\t***WÂnschen Sie einen Neustarts des Programms***\n\n");

printf("\t\t\t 1 = ja ; 0 = nein : ");

scanf("%i",&eing);

if (eing == 1)

{ goto Anfang;

}

else

{

printf("\n\n\n Bitte drÂcken Sie eine beliebige");

printf(" Taste um das Programm zu beenden");

getch();

}

*/

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by saschabu

habt ihr schon eine lösung?

Bitte kein Threadpushing.

Aber zu deinem Code:

Ich rate dir dringend, dieses goto-Konstrukt durch eine Schleife zu ersetzen. Bei diesem kleinen Programm magst du vielleicht noch nachvollziehen können, was passiert, aber wenn du dir diesen Stil angewöhnst, werden größere Programme absolut unwartbar werden.

Beschreib bitte genau, wann der Fehler auftritt, und wie er sich äußert. Das schließt eventuelle Fehlermeldungen ein. "abgeschossen...finito" ist keine hilfreiche Fehlerbeschreibung. ;)

Und wie gesagt, prüfe das Programm bitte auch mal im Debugger.

Link zu diesem Kommentar
Auf anderen Seiten teilen

also wie schon gesagt: ich werd weiter den goto befehl benutzen denn ich weiß dass es nicht die beste lösung ist doch ich will diesen goto befehl beibehalten denn wenn du dir mal den quelltext genau angeschaut hättest braüchte ich da ein bißchen mehr...

Aber jetzt nochmals: Also ich starte das Prog, entweder im debugger oder im normalmodus: Es kommt keine fehlermeldung die erheblich wär: also drücke so lange w bis die schlange gegen die wand fährt, (also gameover!!)so jetzt sehe ich bloß einen schwarzen bildschirm und das war es. nach einer kurzen zeit geht er raus (liegt am delay)

so ok...ím debugger sieht man ganz genau er führt den goto befehl aus! aber nacheinander. Doch nach diesem gegen die wand fahren starte ich durch strg f9 den compiler neu und ich seh nur noch einen schwarzen bildschirm. somit hab ich da etwas abgeschossen oder etwa nicht?

also ich hoffe jetzt ist alles klar... man sieht es auch wenn man den quelltext kopieren würde und ausführt (snake funzt so weit)

MfG

saschabu

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by saschabu

also wie schon gesagt: ich werd weiter den goto befehl benutzen denn ich weiß dass es nicht die beste lösung ist doch ich will diesen goto befehl beibehalten denn wenn du dir mal den quelltext genau angeschaut hättest braüchte ich da ein bißchen mehr...

Ich habe mir den Quelltext genau angeschaut. Was du da "mehr bräuchtest", weiß ich nicht. Die Änderungen wären jedenfalls minimal.

Also ich starte das Prog, entweder im debugger oder im normalmodus: Es kommt keine fehlermeldung die erheblich wär: also drücke so lange w bis die schlange gegen die wand fährt, (also gameover!!)so jetzt sehe ich bloß einen schwarzen bildschirm und das war es. nach einer kurzen zeit geht er raus (liegt am delay)
Das heißt, der Fehler besteht darin, dass der "Game Over"-Text nicht angezeigt wird?

Doch nach diesem gegen die wand fahren starte ich durch strg f9 den compiler neu und ich seh nur noch einen schwarzen bildschirm.
Warum startest du den Compiler neu? Oder meinst du, dass du das Programm neu startest?

... man sieht es auch wenn man den quelltext kopieren würde und ausführt (snake funzt so weit)
So einfach ist es leider nicht. Ich habe mir alle Mühe gegeben, deinen Code ans laufen zu bringen, auch wenn du mir unterstellst, das nicht getan zu haben. Allerdings verwendest du nichtstandardisierte Funktionen (delay, gotoxy, clrscr etc.) und Header (graphics.h), so dass dein Programm nicht portabel ist. Zudem ist es C und kein C++, sonst könntest du true nicht als Variablenbezeichner verwenden.
Link zu diesem Kommentar
Auf anderen Seiten teilen

sleep befehl passiert das gleiche wie beim delay warum schiesst es da den compiler ab? das problem was das mir eine do while schleife probleme gemacht hat war nicht so sauber und hatte mir auch mitten ins spielfeld geblendet und kam immer wieder...

aus diesem grund goto....und fand ich easy....

MfG

saschabu

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst du bitte mal erklären, was der Compiler damit zu tun hat? Wenn dein Programm läuft, ist der Compiler längst beendet. Dein Programm kann den Compiler nicht "abschießen", weil die beiden nicht gleichzeitig aktiv sein können.

Den Beitrag davor verstehe ich auch nicht. Du musst den Compiler neu starten, wenn der Bildschirm schwarz ist, weil der Bildschirm schwarz ist, wenn du den Compiler neu startest?

Warum startest du den Compiler überhaupt neu? Wenn du den Code nicht geändert hast, gibt es keinen Grund, den Compiler nochmal zu starten.

P.S.:

Es gibt auch keinen Grund zu schreien. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

also jetzt nochmal: da ja bekanntlich klar ist das borland c nicht grad der beste ist und immer mal wieder probs macht (wie jetzt) , muss man halt versuchen dieses problem in den griff zu bekommen: Also bei Borland c programmiert man ja und danach muss man das programm ausführen...so da test ich dann mein programm und das ist eigentlich das was ja ich programmiert hab. so da fahr ich dann mit meiner schlange gegen die wand==also gameover. dann kommt der schwarze bildschirm und ich flieg raus

so dann bin ich wieder dort wo ich den quelltext eingebe...so dann möcht ich das programm nochmals ausführen, also compalier das prog und seh bloß noch den schwarzen bildschirm also geht nichts mehr also schließ ich es und start den Borland c nochmals und dann funktioniert es auch wieder einmal. sonst funktioniert jedes programm.

MfG

saschabu

Link zu diesem Kommentar
Auf anderen Seiten teilen

also jetzt nochmal: da ja bekanntlich klar ist das borland c nicht grad der beste ist und immer mal wieder probs macht (wie jetzt

Was ist bekannt? Mir ist völlig neu, daß Borlands Compiler nicht gut sind. Und ich programmiere nicht erst seit gestern mit Borland-Compilern. Welche Version benutzt Du denn?

Ich will jetzt keine Diskussion lostreten, welcher Compiler nun der Beste ist. Es ist aber sicherlich so, daß aktuelle Versionen vom Borland Compiler zu den besten gehören. Außerdem ist er schön nah am Standard. (Leute, die meine Posts hier lesen, wissen, daß mir das wichtig ist.)

Bis denn dann

Jan

Link zu diesem Kommentar
Auf anderen Seiten teilen

das ist der Borland c++ Compieler mit der Version 3.0 und 1990 und 1992 copyright.

Ich rede also nur von diesem Compiler nicht von irgedeinem Borland Compiler von heute.

Durch das textcolor zeigt er mir das Game Over an doch der compiler macht wieder den gleichen fehler. naja...also muss ich es wohl mit einer while schleife versuchen....

mfg

saschabu

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich werde noch ein bißchen OT bleiben, ich hoffe ich darf das:

1992 war sechs Jahre vor dem C++ Standard. Es ist nicht gut, Compiler zu benutzen, die vor dem Standard entwickelt wurden, um C++ zu lernen. Es fehlen wesentliche Features der Sprache, mit denen Dein Programmierstil eleganter sein könnte. Abgesehen von Deinem Problem solltest Du Dir einen Gefallen tun und Dich nach einem aktuellen Compiler umschauen. Bei Borland kann man sich eine aktuelle Version des C++Builders in der Kommandozeilenversion herunterladen. Oder schau Dich nach dem gcc um. Den gibt es ja für eine Menge von Plattformen. Hier im Forum gibt es einen Thread von Crush, der meldet, daß der Watcom jetzt auch frei ist. Ich habe ihn noch nie benutzt, aber mir ist auch noch nichts Negatives zu Ohren gekommen.

HTH

Jan

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...