geloescht_saschabu Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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 Zitieren
Klotzkopp Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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? Zitieren
Guybrush Threepwood Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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. Gruß Guybrush Zitieren
brixxie Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 Was habt ihr eigentlich mit dem gotoxy()? Dort springt man doch bloß an eine bestimmte stelle auf dem Monitor. Hat doch nichts mit dem Programmablauf zu tun. Um aufklärung wäre ich sehr dankbar. brixxie Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 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 Zitieren
Guybrush Threepwood Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 Hi, es geht nicht um gotoxy(), sondern um goto, mitdem man an ein beliebiges Label im Quellcode springen kann. Gruß Guybrush Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 goto (x,y) ist der sprung zu dem besagten Punkt auf dem Display und goto gameover; ist eine anweisung im Quelltext zu springen..verstehst es? Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 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(); } */ } Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 Aber noch eine vorabinfo ich bin grad etwas am probieren deswegen kann es zu fehlern in der darstellung kommen ....hoffe das verzeiht ihr mir genauso die übersicht...ist net ganz so der hammer...weiß ich ist ja auch einiges an test code drin Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 habt ihr schon eine lösung? Zitieren
Klotzkopp Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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. Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 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 Zitieren
Klotzkopp Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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. Zitieren
Guybrush Threepwood Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 Bist du dir sicher das delay() funktioniert? Ich meine nämlich das in meiner alten Schule (da hatten wir auch Compiler von Borland) es mit delay ein paar Probleme gab. Probiers mal mit Sleep(); Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 ok mach ich doch klar sollte delay funzen. also ich muss den Borland compiler neu starten wenn der schwarze bildschirm kommt, denn bei einem neuen run des compilers kommt nur der schwarze bildschirm. Das Programm ist für BORLAND C++ GESCHRIEBEN mfg SASCHABU Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 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 Zitieren
Klotzkopp Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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. Zitieren
geloescht_saschabu Geschrieben 16. Januar 2003 Autor Geschrieben 16. Januar 2003 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 Zitieren
Orffi Geschrieben 16. Januar 2003 Geschrieben 16. Januar 2003 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 Zitieren
Klotzkopp Geschrieben 17. Januar 2003 Geschrieben 17. Januar 2003 @saschabu: Setzt mal ein textcolor(15); vor das letzte clrscr(); Zitieren
geloescht_saschabu Geschrieben 17. Januar 2003 Autor Geschrieben 17. Januar 2003 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 Zitieren
Orffi Geschrieben 17. Januar 2003 Geschrieben 17. Januar 2003 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 Zitieren
geloescht_saschabu Geschrieben 17. Januar 2003 Autor Geschrieben 17. Januar 2003 ja ist das aber noch c im dos modus? das ist doch win... oder? mfg saschabu Zitieren
Empfohlene Beiträge
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.