Anfängerproblem



  • Hi zusammen,

    ich habe eine Frage an Euch. Ich möchte ein kleines Prog. schreiben, bei dem ein Ball über den Bildschirm wandert und am Rand des Bildschirmes wieder abprallt. Das wandern über den Bildschirm ist kein Problem.

    Nur die Sache mit dem Rand bekomme ich nicht hin. Kann mir da jemand eine Hilfestellung geben ?

    cu

    Michael



  • Hier ein Beispiel wie ma es machen könnte:

    #include <iostream>
    #include <string>
    using namespace std;

    #include <conio.h> // Für kbhit() und getch()
    #include "myMakros.h"

    #define ESC 27 // ESC beendet das Programm

    unsigned long delay = 100L; // Verzögerung in Millisekunden

    int main()
    {
    int x = 2, y = 2, dx = 1, geschw = 0;
    bool ende = false;
    string boden(80, '-'),
    header = "**** SPRINGENDER BALL ****",
    commands = "[Esc] = Beenden "

    FARBE(WEISS,BLAU);
    CLS;
    LOCATE(1,25); cout << header;
    LOCATE(24,1); cout << boden;
    LOCATE(25,10); cout << commands;

    while( !ende) // solange das Ende-Flag
    { // nicht gesetzt ist.
    LOCATE(y,x); cout << 'o'; // Ball anzeigen

    Sleep(delay); // Etwas warten

    if(x == 1 || x == 79) dx = -dx; // An einer Wand?
    if( y == 23 ) // Am Boden?
    {
    geschw = - geschw;
    if( geschw == 0 ) geschw = -7; // Neu anstossen
    }
    geschw += 1; // Beschleunigung = 1

    LOCATE(y,x); cout << ' '; // Anzeige löschen
    y += geschw; x += dx; // Neue Position

    if( kbhit() != 0 ) // Taste gedrückt?
    {
    switch(getch()) // ja
    {
    case '+': delay -= delay/5; // schneller
    break;
    case '-': delay += 1+ delay/5; // langsamer
    break;
    case ESC: ende = true; // Pgm. beenden
    }
    }
    }
    NORMAL;
    CLS;
    return 0;
    }



  • Hi,

    erst mal danke. Aber ich denke als Anfänger bin ich da etwas überfordert. Wie bekomm ich nur die Sache mit dem Rand raus ?

    Gruß

    Michael



  • Hi Spike,

    Wie lässt du denn den Ball wandern:
    Benutzt du direkt die Win32 API oder bedienst du den X-Server?
    Oder verwendest du ein GUI-Toolkit (MFC/QT)?
    Wandert dein Ball innerhalb eines Fensters oder wirklich über den Bildschirm?
    Möchtest du die Bildschirmgrösse (in Pixeln) oder die Fenstergrösse?

    Sorry das ich mehr Fragen als Antworten gebe - aber ich fand die Frage etwas schwammig gestellt

    gruss
    Tobi



  • Hi,

    also ich habe folgende Aufgabenstellung.

    Ich soll ein Programm schreiben, bei dem ein Ball ("o") per Tastatureingabe über den Bildschirm läuft. Dieser soll, sobald er am Bildschirmrand angekommen ist abprallen.
    Das Programm soll mit der Eingabe von "e" abgebrochen werden.
    Soweit habe ich das so gemacht:

    int main()
    {
    int x,y;
    char taste;
    printf("Anfangsposition festlegen");
    printf("\n\nPosition x:");
    scanf("%i",&x);
    printf("Position y:");
    scanf("%i",&y);
    clrscr();

    do
    {
    gotoxy(x,y);

    // Rand testen

    printf("o");
    printf("%i %i",x,y);
    x=x+1;
    y=y+1;
    taste=getch();
    }
    while (taste!='e');



  • Erstmal: Bitte, bitte Codetags benutzen, denn das ist ja grauenvoll zu lesen.

    Zweitens: Wo hast du denn gotoxy hergezaubert? Ist das eine Bibliotheksfunktion? Was bedeuten die Werte x und y? _Falls_ x und y Pixelkoordinaten sind, muss du nur prüfen, ob diese Koordinaten ausserhalb des sichtbaren bereiches sind.

    Etwa so:

    spike78 schrieb:

    int main()
    {
        int x,y;
        char taste;
        printf("Anfangsposition festlegen");
        printf("\n\nPosition x:");
        scanf("%i",&x);
        printf("Position y:");
        scanf("%i",&y);
        clrscr();
    
        do
        {
            /**
             * Erst den Rand testen, dann dahingehen, oder eben nicht
             */
    
            if (x<=0)
            {
                // andere Richtung z.B.
                x--;
            }
            else if (x>=SCREENSIZE_X)    // also Anzahl der Pixel in x-Richtung,                    
            {                            // oder eben Koordinaten, was du da halt hast
                x++;
            }
    
            (if <= 0)
            {
                // ...
            }
            else if (y >= SCREENSIZE_Y)
            {
                // ...
            }
    
            gotoxy(x,y);
    
            printf("o");
            printf("%i %i",x,y);
            x=x+1;
            y=y+1;
            taste=getch();
        } while (taste!='e');
    
        // kommt da noch was ???
    
        return 0;
    }
    

    SCREENSIZE_X und SCREENSIZE_Y sind nur Platzhalter. So würde ich das mit einer ganz simplen Collisiondetection machen.

    Gruß Mea



  • Die Idee von Meaculpa geht schon in die richtige Richtung. Funktioniert aber leider so nicht ganz. Würde es so machen.

    int main() {
        int x,y, dx, dy;
        dx=1; dy=1;
        char taste;
        printf("Anfangsposition festlegen");
        printf("\n\nPosition x:");
        scanf("%i",&x);
        printf("Position y:");
        scanf("%i",&y);
        clrscr();
        do {
            if ( x<=0 || x>=SCREENSIZE_X ) {
                // andere Richtung
                dx=-dx;
            }
            (if y<= 0 || y >= SCREENSIZE_Y ) {
                // andere Richtung
                dy=-dy;
            }
            gotoxy(x,y);
            printf("o");
            printf("%i %i",x,y);
            x+=dx;
            y+=dy;
            taste=getch();
        } while (taste!='e');
        return 0;
    }
    

    Kurt


Anmelden zum Antworten