Ping Pong in Ansi C verzweifle



  • hm also hab dv-cpp ich weis aber nicht wie ich anfangen soll ich weiß auch nicht wie ich eine begrenzung mache mit arrays? und wenn ja wie?



  • Deine größte Schwierigkeit dürfte sein die Grafikfunktionen zu basteln. C kennt keine Grafik, du musst dich auf eine Plattform und deren Grafikfunktionen festlegen. Selbst wenn du nur printf benutzt und wie du sagst die Schläger als | und den Ball als * darstellst kannst du die Position an der du Text ausgibst nicht festlegen ohne dich von der entsprechenden Shell abhängig zu machen.

    Du müsstest dich also erstmal auf eine Plattform festlegen. Ich rate mal basierend auf Microsofts streitbaren 99.5% Marktanteil du willst es unter Windoof mit der cmd.exe zum Laufen bringen.
    Ich weiß dass die cmd tatsächlich ein carriage return versteht. Das heißt "setze den cursor auf den Zeilenanfang". Ich weiß allerdings nicht wie man den Cursor eine Zeile nach oben bekommt.
    Einfach das ganze Spielfeld ausgeben ist wahrscheinlich eine blöde Idee, aber ein Anfang. Bis du antwortest und wahrscheinlich die 0.4% Linux oder 0.1% Mac triffst bastle ich mal was.



  • ja windows (:

    aber ich hab so gernell kP wie ich das realisiere.
    Kann mir denn jemand
    einen code geben mit einem begernzten spielfeld und einen punkt der sich in diesem spielfeld durch die pfeil tasten bewegen lassen.
    Dann hätt ich schonmal was entscheidendes gelernt ^^
    dankeeuch



  • Ich hab mal ein bisschen rumgespielt und festgestellt dass das alles nicht klappt. Das Hauptproblem ist, dass man keine Eingabe kriegt. Selbst wenn man die Tasten Q und A bzw P und L benutzt kriegt man auch mit getchar die Eingabe nicht, bis mit Enter bestätigt wurde. Man kann auch nicht mit putchar('\n') schummeln.
    Man könnte direkt die FILE-Struktur von stdin manipulieren, aber ich hab sowas noch nie gemacht. Die Ausgabe sieht auch derbe schlecht aus wenn man immer 25 Zeilen printet.

    Edit: Man könnte ein normales Fenster aufmachen mit Edit-Control und es dort machen. Dann kriegt man alle Eingaben und es sieht auch nicht so schrecklich aus wenn man das Spielfeld neu zeichnet. Bist du auf die Kommandozeile festgelegt?



  • okay danke, könntest du dich mit dem oben stehenden problem befassen, wäre sehr lieb ^^



  • Ich hab jetzt schonmal drüber nachgedacht

    ich mach ein 2 Dimensionales Array und wenn ich links drücke dann soll er das array -1 machen und mit einem neuen Zeichen überschreiben, das hauptproblem ist
    dass ich cin und cout benutze und das zerstört natürlich die optik von meinem array, hat da jemand noch ne idee wie ich die Pfeiltasten einbinde dass sie "on the fly" funktionieren?



  • Du hast dir nichts von meinem Beitrag durchgelesen oder?
    Dein Array sollte ungefähr so aussehen: char Spielfeld[80][25];
    Und du kannst die Pfeiltasten nicht einbinden. Garnicht. Und auch wenn du andere Tasten wie Q+A und P+L benutzt funktionierts nicht, weil du Eingaben mit Enter bestätigen musst.
    Deswegen habe ich ein Fenster mit Edit-Contol vorgeschlagen, da kriegst du die Eingaben und hast quasi dasselbe wie die cmd.



  • schwachsinn getch benötigt keine eingabe daher klappts



  • Hallo,

    ich versuch mich da jetzt einfach mal einzuklinken hier. Bin zwar selbst noch am Lernen von C/C++, aber vielleicht kann ich doch etwas beisteueren.

    Wenn ich das richtig verstehe sollte bei dem Ping-Pong der 'Ball' immer schön in Bewegung sein und die 'Schläger' über Tasten bewegt werden können.
    Aber würde bei Verwendung von getch() das Programm nicht dort stehen bleiben bis irgendeine Taste gedrückt wurde? Somit würde ja auch der 'Ball' stehen bleiben?

    Grüße Netzschleicher



  • Yup, würde es. Aber das könnte man hinkriegen indem man direkt in stdin rumpfuscht. Aber nachdem meine Hilfe als Schwachsinn abgetan wurde fehlt mir die Motivation.



  • @nwp2
    Jau, da kann ich Dich gut verstehen. Es ist wirklich nicht nett eine Antwort gleich mal als Schwachsinn abzucanceln. Wenn er meint das es das mit getch() hinbekommt hätte er das auch freundlicher schreiben können.

    Aber dann lag ich ja mit getch() richtig. Früher (man möge mich schlagen) gab es in ZX-81 Basic eine $inkey Funktion. Sowas wäre für die gestelle Aufgabe gut zu gebrauchen.



  • getch() in verbindung mit kbhit() müsste doch funktionieren?
    z.b.

    char c;
    while(!kbhit())
         doSomething(); //ball bewegen, schlaeger des Computers bewegen etc.
    c=getch(c);
    switch(c){
    ...}
    


  • Wenn man einen Borland-Compiler hat sollte das gehen. Standard C ist das aber nicht.



  • Ups, hast recht.
    Aber ist getch() nicht sogar auch nicht Standard c?
    Oder verwechsle ich da gerade etwas..



  • Nun, ich hab nen Borland-Compiler.
    Für kbhit müsste dann conio.h includiert werden. Zumindest wäre das dann doch für den Treadsteller mal ein Ansatzpunkt. Allesdings wissen wir ja nicht mit welchem Compiler er arbeitet, oder hab ich da was überlesen ??? 😕



  • hmmm, wer lesen kann ist klar im Vorteil. 😡
    Der Treadsteller verwendet dv-cpp. Denn kenn ich leider überhaupt nicht.



  • Hey nimm einen DOS ompiler und mach alles im textmode im grafikspeicher
    dann brauchst's dir kein Array anlegen USW
    BTW bloede Handy tastatur
    🙂



  • Mit standard C gibt das nur nerviges geflimmer.
    Für Windows eignen sich die Console Functions bestens für son Ping Pong Ding.
    [url]
    http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx
    [/url]
    Damit kann man sehr gut animierte Ascii Grafiken flimmerfrei auf dem Bildschirm tanzen lassen. Alle Beispiele, die ich zu diesem Thema im Formum DOS und Win32-Konsole gepostet habe, sind allerdings bereits gelöscht. 👎



  • Big Brother schrieb:

    Damit kann man sehr gut animierte Ascii Grafiken flimmerfrei auf dem Bildschirm tanzen lassen.

    das hier musste dafür nehmen: http://freshmeat.net/projects/libcaca/
    🙂



  • Big Brother schrieb:

    Damit kann man sehr gut animierte Ascii Grafiken flimmerfrei auf dem Bildschirm tanzen lassen.

    Aber nicht ruckelfrei 😃 wegen dem doofen, groben Buchstabenzellen-Raster.
    Also wenn du mich fragst, ich würde das nicht in der Console machen.
    Wenns schon unbedingt Konsole sein muss, dann sowas hier
    http://www.brackeen.com/vga/intro.html
    und dann in nem Dos Emulator wie DOSBox laufen lassen oder so.

    ;fricky schrieb:

    das hier musste dafür nehmen: http://freshmeat.net/projects/libcaca/

    Wie ist da die Ausgabe, im Text Modus(Buchstabenzellen) oder Pixelmode?
    Ich glaube im Textmodus, dann wird der Ping Pong Ball ziemlich ruckelig laufen:

    #include <windows.h> 
    
    typedef int bool;
    enum boolean{false, true};
    
    HANDLE hIn, hOut;
    
    #define BLANK ' '
    #define BALL '*'
    #define SLEEP_TIME 70
    
    bool init_console() {
    	hOut = GetStdHandle ( STD_OUTPUT_HANDLE );
    	hIn = GetStdHandle ( STD_INPUT_HANDLE );
    	return hOut != INVALID_HANDLE_VALUE && hIn != INVALID_HANDLE_VALUE; 
    }
    
    void gotoxy ( short x, short y ) { 
    	COORD pos; pos.X = x, pos.Y =  y;
    	SetConsoleCursorPosition ( hOut, pos ); 
    }  
    
    int main() {
    	int x = 0, y = 0;
    	if ( false == init_console() ) return 0;
    	while(1) {
    		gotoxy ( x, y );
    		putchar(BALL);
    		Sleep(SLEEP_TIME);
    		gotoxy ( x, y );
    		putchar(BLANK);
    		x++, y++;
    		if ( x == 79 ) x = 0;
    		if ( y == 24 ) y = 0;
    	}
    	return 0;
    }
    

Anmelden zum Antworten