PONG-Spiel in ANSI C
-
Hi,
Ich habe ein PONG-Spiel programmiert in ANSI C für die API-Konsole. Jedoch
musste ich bald einmal feststellen, dass der Befehl system("cls"); das Spiel
völlig unbrauchbar macht. Es flimmert ständig.
Den Befehl clrscr(); kann ich auch nicht brauchen aus irgendwelchen Gründen, die ich nicht kenne. (Entwicklungsumgebung DEV-C++)
Ihr könnt es selbst ausprobieren.
Die EXE-Datei befindet sich hier und hesst EdPong:http://members.lycos.co.uk/cyborgkiller/
Ich hoffe es gibt eine einfache Lösung, sonst bin ich völlig aufgeschmissen.
SEUFZER*
Aja hät ich fast vergessen.
Bedienungsanleitung:-Nach dem Doppelklick auf die EXE-Datei solltet ihr die Konsole maximieren.
od. noch besser den Vollbildmodus aktivieren
-Danach einfach RETURN
-Steuerung für den linken Balken mit 'q' und 'a'
-Steuerung für den rechten Balken mit 'o' und 'l'
-Beenden mit'z'Ich bin für jede mögliche Antwort (od. noch besser) Lösung sehr froh.
MfG Ed
-
Gib halt mal den quellcode, sonst kann man nicht helfen.
Aber ich denke das liegt daran, dass du den "Löschvorgang" in eine Warteschleife stecken musst.Den Befehl clrscr(); kann ich auch nicht brauchen aus irgendwelchen Gründen, die ich nicht kenne. (Entwicklungsumgebung DEV-C++)
Wenn du die Headerdatei dazu richtig einbindest, sollte es gehen. PS aber dann ist das Problem vermutlich das selbe
-
Ja Logo, es wird keinen Unterschied geben mit clrscr();!Danke
Hier ist der Code. Noch völlig frisch und unberrührt.(Keine Kommentare)#include <stdio.h> #include <conio.h> #define x_koord1 0 #define x_koord2 78 int x_koord_ball=0; int y_koord_ball=17; int speed=0; int richtung; enum bewegung { oben_links_rechts, oben_rechts_links, unten_links_rechts, unten_rechts_links, }; char variable='0'; int y_koord1=0; int y_koord2=0; int i; int punkte1=0; int punkte2=0; balken1() { for(i=0;i!=y_koord1;i++) { printf("\n"); } printf("X\n"); printf("X\n"); printf("X\n"); printf("X\n"); printf("X\n"); for(i=0;i!=((47-y_koord1)-4);i++) { printf("\n"); } printf("%02d---------------------------------------------------------------------------%02d",punkte1,punkte2); system("cls"); } balken2() { for(i=0;i!=y_koord2;i++) { printf("\n"); } for(i=0;i!=x_koord2;i++) { printf(" "); } printf("X\n"); for(i=0;i!=x_koord2;i++) { printf(" "); } printf("X\n"); for(i=0;i!=x_koord2;i++) { printf(" "); } printf("X\n"); for(i=0;i!=x_koord2;i++) { printf(" "); } printf("X\n"); for(i=0;i!=x_koord2;i++) { printf(" "); } printf("X\n"); system("cls"); } ball() { for(i=0;i!=y_koord_ball;i++) { printf("\n"); } for(i=0;i!=x_koord_ball;i++) { printf(" "); } printf("o"); system("cls"); } ball_richtung(int richtung) { if(richtung==oben_links_rechts) { x_koord_ball++; y_koord_ball++; if((y_koord2<=y_koord_ball)&&((y_koord2+5)>=y_koord_ball)&&(x_koord_ball==77)) { richtung=oben_rechts_links; } if((y_koord_ball==47)&&(x_koord_ball==80)) { y_koord_ball-=2; } if(y_koord_ball==47) { richtung=unten_links_rechts; } if(x_koord_ball==80) { richtung=oben_rechts_links; punkte2++; } } if(richtung==unten_links_rechts) { x_koord_ball++; y_koord_ball--; if((y_koord2<=y_koord_ball)&&((y_koord2+5)>=y_koord_ball)&&(x_koord_ball==77)) { richtung=unten_rechts_links; } if((y_koord_ball==0)&&(x_koord_ball==80)) { y_koord_ball+=2; } if(y_koord_ball==0) { richtung=oben_links_rechts; } if(x_koord_ball==80) { richtung=unten_rechts_links; punkte2++; } } if(richtung==unten_rechts_links) { x_koord_ball--; y_koord_ball--; if((y_koord1<=y_koord_ball)&&((y_koord1+5)>=y_koord_ball)&&(x_koord_ball==1)) { richtung=unten_links_rechts; } if((y_koord_ball==0)&&(x_koord_ball==0)) { y_koord_ball+=2; } if(y_koord_ball==0) { richtung=oben_rechts_links; } if(x_koord_ball==0) { richtung=unten_links_rechts; punkte1++; } } if(richtung==oben_rechts_links) { x_koord_ball--; y_koord_ball++; if((y_koord1<=y_koord_ball)&&((y_koord1+5)>=y_koord_ball)&&(x_koord_ball==1)) { richtung=oben_links_rechts; } if((y_koord_ball==47)&&(x_koord_ball==0)) { y_koord_ball-=2; } if(y_koord_ball==47) { richtung=unten_rechts_links; } if(x_koord_ball==0) { richtung=oben_links_rechts; punkte1++; } } return(richtung); } int main() { getchar(); enum bewegung richtung; richtung=oben_links_rechts; while(variable!='z') { balken1(); balken2(); ball(); speed++; if(kbhit()) { variable=_getch(); } if((variable=='a')&&(y_koord1!=43)) { y_koord1++; variable='0'; } if((variable=='q')&&(y_koord1!=0)) { y_koord1--; variable='0'; } if((variable=='l')&&(y_koord2!=43)) { y_koord2++; variable='0'; } if((variable=='o')&&(y_koord2!=0)) { y_koord2--; variable='0'; } if(speed==(2)) { speed=0; richtung=ball_richtung(richtung); } } }
MfG Ed
-
Naja du hast system("CLS"); in einer Endlos schleife, das heisst, der löscht ständig den Bildschirm, deshalb auch das "blinken".
Also ich würde es mal mit folgenden 2 Möglichkeiten machen:
Mach mal _sleep(50); in die main-Funktion.
lösche nicht den kompletten Bildschirm, sondern nur die Positon, wo der Ball (bzw. die Balken) waren.
-
system() sollte man in Verbindung mit Systembefehlen (wie CLS) sowieso nicht verwenden. Aber auch mit clrscr() (oder einer andern betriebssystem spezifischen Funktion zum Löschen des Bildschirms) würde es nicht besser werden, denn das Flimmern bleibt.
Die richtige Lösung für das Problem ist also:
lösche nicht den kompletten Bildschirm, sondern nur die Positon, wo der Ball (bzw. die Balken) waren.
Anstatt _sleep() würde ich besser Sleep() (WinAPI) verwenden, da bei dieser Funktion Windows die Prozessorleistung wieder verteilen kann und diese nicht ständig im Programm für nix verbraten wird.
Und hier sind wir auch bei einem anderen Punkt angelangt. Durch Verwendung von betriebssystem spezifischen Funktionen gehört das ganze auch nicht mehr nach ANSI-C, sondern in diesem Fall zu DOS und Win32 Konsole.
-
Dieser Thread wurde von Moderator/in AJ aus dem Forum ANSI C in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
sie dir mal LCGI an da kannst sicher was anfangen mit
http://www.the-tetris-project.at.tt/ dann auf downloadz dann auf win und schon kannst es dir runterladen
-
--linuxuser-- schrieb:
sie dir mal LCGI an da kannst sicher was anfangen mit
http://www.the-tetris-project.at.tt/ dann auf downloadz dann auf win und schon kannst es dir runterladenWas soll ihm das in der Win32-Konsole helfen? Versteh ich nicht
MfG SideWinder