Anfänger brauucht hilfe!



  • ping(int) und pong(int) sind exakt die gleichen Funktionen! Macht überhaupt keinen Sinn die zwei mal zu definieren.

    Edit: Nagut, steht so in der Aufgabe, Sinn macht es dennoch keinen.

    Edit2: Und so wie ich die Aufgabe verstehe, läuft der Ballwechsel so lange, bis einer der beiden einen Punkt macht (ping bzw pong == 1). Du brauchst also noch eine Whileschleife, oder nicht?



  • Dan müssten doch eine oder zwei Schleifen rein. Eine Schleife die läuft, bis einer einen Ballwechsel beginnt. Und eine Schleife, die endet wenn das Spiel zu Ende ist. Diese Schleifen sollte man dann verschachteln. Im Moment rufst du ja nur insgesamt 2 mal ping(..) und 2 mal pong(..) auf. In der Schleife müsstest du dann auch die Zufallszahl abändern.

    Ausserdem musst du den Rückgabewert in einer Variablen speichern und dann den gespeicherten Wert ausgeben. Sonst ergibt das aus meiner Sicht nicht wirklich viel Sinn.

    *Edit
    Versuch da mal die Schleifen reinzupacken. Ich glaube eine while-Schleife würde hier ganz gut funktionieren. Wenn du das dann im Code hast kannst den Code nochmals posten.



  • Panke schrieb:

    ping(int) und pong(int) sind exakt die gleichen Funktionen! Macht überhaupt keinen Sinn die zwei mal zu definieren.

    Edit: Nagut, steht so in der Aufgabe, Sinn macht es dennoch keinen.

    Edit2: Und so wie ich die Aufgabe verstehe, läuft der Ballwechsel so lange, bis einer der beiden einen Punkt macht (ping bzw pong == 1). Du brauchst also noch eine Whileschleife, oder nicht?

    das mit dem ballwechsel wollte ich zum schluss machen...

    "Dann gibt die erfolgreiche Funktion (ping() oder pong()) eine 1 zurück."
    das hab ich ja in den funktionen ja eingebaut...nur wie erhöt sich denn der spielstand?



  • Evolution am Werk 🙂

    int ping(int a)
    {
        int d;
        d = rand()%10+1;  
        if(a==d)
            return 1;
    
        else return 0;
    
        return a;
    } 
    
    int pong(int b)
    {
        int d;
        d = rand()%10+1;  
        if(b==d)
            return 1;
        else return 0;
    }
    
    int ping(int a)
    {
        return pong(a);
    } 
    
    int pong(int b)
    {
        const int d = rand()%10+1;  
    
        if(b==d)    return 1;
        else        return 0;
    }
    
    int ping(int a)
    {
        return pong(a);
    } 
    
    int pong(int b)
    {
        if(rand()%10+1 == b)
            return 1;
    
        return 0;
    }
    
    int ping(int a)
    {
        return pong(a);
    } 
    
    int pong(int b)
    {
        return ( rand()%10+1 == b);
    }
    


  • welive schrieb:

    Panke schrieb:

    ping(int) und pong(int) sind exakt die gleichen Funktionen! Macht überhaupt keinen Sinn die zwei mal zu definieren.

    Edit: Nagut, steht so in der Aufgabe, Sinn macht es dennoch keinen.

    Edit2: Und so wie ich die Aufgabe verstehe, läuft der Ballwechsel so lange, bis einer der beiden einen Punkt macht (ping bzw pong == 1). Du brauchst also noch eine Whileschleife, oder nicht?

    das mit dem ballwechsel wollte ich zum schluss machen...

    "Dann gibt die erfolgreiche Funktion (ping() oder pong()) eine 1 zurück."
    das hab ich ja in den funktionen ja eingebaut...nur wie erhöt sich denn der spielstand?

    Kannst ja oben noch meinen Post durchlesen.

    Wie du den Spielstand erhöhen kannst:
    Mache zwei Variablen int ping_wins, pong_wins. Wenn ping gewinnt machst du ping_wins++ und wenn pong gewinnt pong_wins++. (Falls du nicht weisst was das ++ bedeutet, google mal nach Post- und Pre-Inkrement).



  • icarus2 schrieb:

    welive schrieb:

    Panke schrieb:

    ping(int) und pong(int) sind exakt die gleichen Funktionen! Macht überhaupt keinen Sinn die zwei mal zu definieren.

    Edit: Nagut, steht so in der Aufgabe, Sinn macht es dennoch keinen.

    Edit2: Und so wie ich die Aufgabe verstehe, läuft der Ballwechsel so lange, bis einer der beiden einen Punkt macht (ping bzw pong == 1). Du brauchst also noch eine Whileschleife, oder nicht?

    das mit dem ballwechsel wollte ich zum schluss machen...

    "Dann gibt die erfolgreiche Funktion (ping() oder pong()) eine 1 zurück."
    das hab ich ja in den funktionen ja eingebaut...nur wie erhöt sich denn der spielstand?

    Kannst ja oben noch meinen Post durchlesen.

    Wie du den Spielstand erhöhen kannst:
    Mache zwei Variablen int ping_wins, pong_wins. Wenn ping gewinnt machst du ping_wins++ und wenn pong gewinnt pong_wins++. (Falls du nicht weisst was das ++ bedeutet, google mal nach Post- und Pre-Inkrement).

    ++ bedeutet um eins erhöhen oder?

    meinst du so

    if(ping_wins<pong_wins){
          pong_wins++;
    }
    else if(ping_wins>pong_wins){
         ping_wins++;
    }
    


  • welive schrieb:

    ++ bedeutet um eins erhöhen oder?

    meinst du so

    if(ping_wins<pong_wins){
          pong_wins++;
    }
    else if(ping_wins>pong_wins){
         ping_wins++;
    }
    

    Genau. Du musst aber aufpassen. ++a und a++ ist nicht das selbe oder zumindest nicht immer.



  • padreigh schrieb:

    Evolution am Werk 🙂

    int ping(int a)
    {
        int d;
        d = rand()%10+1;  
        if(a==d)
            return 1;
    
        else return 0;
    
        return a;
    } 
    
    int pong(int b)
    {
        int d;
        d = rand()%10+1;  
        if(b==d)
            return 1;
        else return 0;
    }
    
    int ping(int a)
    {
        return pong(a);
    } 
    
    int pong(int b)
    {
        const int d = rand()%10+1;  
    
        if(b==d)    return 1;
        else        return 0;
    }
    
    int ping(int a)
    {
        return pong(a);
    } 
    
    int pong(int b)
    {
        if(rand()%10+1 == b)
            return 1;
    
        return 0;
    }
    
    int ping(int a)
    {
        return pong(a);
    } 
    
    int pong(int b)
    {
        return ( rand()%10+1 == b);
    }
    

    ....ist es nicht genau das was ich gemacht hab?



  • icarus2 schrieb:

    welive schrieb:

    ++ bedeutet um eins erhöhen oder?

    meinst du so

    if(ping_wins<pong_wins){
          pong_wins++;
    }
    else if(ping_wins>pong_wins){
         ping_wins++;
    }
    

    Genau. Du musst aber aufpassen. ++a und a++ ist nicht das selbe oder zumindest nicht immer.

    das forum ist echt top und die leute auch 🙂



  • icarus2 schrieb:

    welive schrieb:

    ++ bedeutet um eins erhöhen oder?

    meinst du so

    if(ping_wins<pong_wins){
          pong_wins++;
    }
    else if(ping_wins>pong_wins){
         ping_wins++;
    }
    

    Genau. Du musst aber aufpassen. ++a und a++ ist nicht das selbe oder zumindest nicht immer.

    Öhm - nein eben nicht genau 🙂
    Was soll das für einen Sinn ergeben?
    Gemeint ist wohl:

    int ping_wins = 0, pong_wins = 0;
    //...
    while (....) {
        int randomnr = rand()%10+1;
        if (ping(randomnr)) {
            ++ping_wins;
            continue;
        }
        if (pong(randomnr))
            ++pong_wins;
    //...
    }
    

    P.S.: hier hat immer ping Aufschlag - muss also noch geändert werden, aber ich will ja noch nicht alles verraten, sonst schimpft Otze wieder 🙂



  • inter2k3 hat Recht. Ich hatte deinen Post falsch gelesen und nur auf die ++ geachtet und den Rest nicht angeschaut ^^



  • Coden ist ja nett, aber am Anfang kommt eigentlich ein Pseudoablauf, zB so:

    Start: 
    runde: 0 (wegen aufschlagwechsel)
    win_PING: 0 
    win_PONG: 0
    
    aufschlag_ping = WAHR
    
    Solange  ( ((win_PING < 11) UND (win_PONG << 11))   ODER   (ABSOLUT(win_PING-win_PONG) < 2)   )
    {
       ziehe "zahl"
       ping_gewinnt = pong_gewinnt = FALSCH
       ballwechsel = 0
    
       Solange weder ping_gewinnt noch pong_gewinnt RICHTIG
       {
          incrementiere ballwechsel
    
          wenn aufschlag_ping
          {
             ping_gewinnt = ping("zahl");
             wenn nicht ping_gewinnt
             {
                 pong_gewinnt = pong("zahl");
             }
          }
          sonst
          {
             // dasselbe nur umgekehrt :P
          }
       }
    
       win_PING += ping_gewinnt; // booleans sind 0 oder 1 ... 1 wenn wahr 0 wenn falsch
       win_PONG += pong_gewinnt;
    
       Ausgabe: Anzahl Ballwechsel, Punkt PING, Punkte PONG
       incrementiere runde
    
       wenn runde >= 5 und runde < 10 aufschlag_ping = FALSCH  // pong ist dran
       sonst aufschlag_ping = nicht aufschlag_ping             // wechsel den status da punktweise gewechselt wird   
    }
    


  • ich danke euch! ich muss das jetzt erst mal alles nachvollziehen und verstehen 🙂



  • padreigh schrieb:

    Coden ist ja nett, aber am Anfang kommt eigentlich ein Pseudoablauf, zB so:

    Start: 
    runde: 0 (wegen aufschlagwechsel)
    win_PING: 0 
    win_PONG: 0
    
    aufschlag_ping = WAHR
    
    Solange  ( ((win_PING < 11) UND (win_PONG << 11))   ODER   (ABSOLUT(win_PING-win_PONG) < 2)   )
    {
       ziehe "zahl"
       ping_gewinnt = pong_gewinnt = FALSCH
       ballwechsel = 0
    
       Solange weder ping_gewinnt noch pong_gewinnt RICHTIG
       {
          incrementiere ballwechsel
    
          wenn aufschlag_ping
          {
             ping_gewinnt = ping("zahl");
             wenn nicht ping_gewinnt
             {
                 pong_gewinnt = pong("zahl");
             }
          }
          sonst
          {
             // dasselbe nur umgekehrt :P
          }
       }
    
       win_PING += ping_gewinnt; // booleans sind 0 oder 1 ... 1 wenn wahr 0 wenn falsch
       win_PONG += pong_gewinnt;
    
       Ausgabe: Anzahl Ballwechsel, Punkt PING, Punkte PONG
       incrementiere runde
    
       wenn runde >= 5 und runde < 10 aufschlag_ping = FALSCH  // pong ist dran
       sonst aufschlag_ping = nicht aufschlag_ping             // wechsel den status da punktweise gewechselt wird   
    }
    

    🙂 danke das hilf echt weiter TOP:)



  • welive schrieb:

    padreigh schrieb:

    Evolution am Werk :)[snipp]

    ....ist es nicht genau das was ich gemacht hab?

    Im Prinzip schon. Nur brauchst du dafür 20 Zeilen Quelltext, einige Zwischenspeicher-Integers und hast den doppelten und ansonsten identischen Code mit einer(zwei) nie erreichbaren return Anweisung. Wenn du in meiner letzten Version die Zufallszahl von 1/10 auf 1/100 ändern möchtest brauchst du eine Zeile ändern:

    int ping(int a)
    {
        return pong(a);
    }
    
    int pong(int b)
    {
        // return ( rand()%10+1 == b);
        return ( rand()%100+1 == b);
    }
    

    Wenn du das selbe bei dir ändern willst sind es wesentlich mehr Zeilen, daher ist mein Code wartbarer 😉 nicht das es darauf ankommt - ist eher was für die B-Note.

    Ebenfalls für die B-Note wäre eine Kapselung der Zufallszahlbestimmung:

    inline int myRand() { return rand()%10+1; }
    

    dann benutzt du das überall wo du sonst rand()%10+1; stehen hast - wenn du das Spiel dann einheitlich auf MersenneTwister umstellen willst um es fairer zu machen geht das wieder wartbarer als bei dir, du änderst einfach den { /* ... */ } Teil der myRand() Methode



  • padreigh schrieb:

    welive schrieb:

    padreigh schrieb:

    Evolution am Werk :)[snipp]

    ....ist es nicht genau das was ich gemacht hab?

    Im Prinzip schon. Nur brauchst du dafür 20 Zeilen Quelltext, einige Zwischenspeicher-Integers und hast den doppelten und ansonsten identischen Code mit einer(zwei) nie erreichbaren return Anweisung. Wenn du in meiner letzten Version die Zufallszahl von 1/10 auf 1/100 ändern möchtest brauchst du eine Zeile ändern:

    int ping(int a)
    {
        return pong(a);
    }
    
    int pong(int b)
    {
        // return ( rand()%10+1 == b);
        return ( rand()%100+1 == b);
    }
    

    Wenn du das selbe bei dir ändern willst sind es wesentlich mehr Zeilen, daher ist mein Code wartbarer 😉 nicht das es darauf ankommt - ist eher was für die B-Note.

    ja hast recht 🙂 hehe sieht übersichtlicher aus



  • padreigh schrieb:

    Coden ist ja nett, aber am Anfang kommt eigentlich ein Pseudoablauf, zB so:

    Start: 
    runde: 0 (wegen aufschlagwechsel)
    win_PING: 0 
    win_PONG: 0
    
    aufschlag_ping = WAHR
    
    Solange  ( ((win_PING < 11) UND (win_PONG << 11))   ODER   (ABSOLUT(win_PING-win_PONG) < 2)   )
    {
       ziehe "zahl"
       ping_gewinnt = pong_gewinnt = FALSCH
       ballwechsel = 0
    
       Solange weder ping_gewinnt noch pong_gewinnt RICHTIG
       {
          incrementiere ballwechsel
    
          wenn aufschlag_ping
          {
             ping_gewinnt = ping("zahl");
             wenn nicht ping_gewinnt
             {
                 pong_gewinnt = pong("zahl");
             }
          }
          sonst
          {
             // dasselbe nur umgekehrt :P
          }
       }
    
       win_PING += ping_gewinnt; // booleans sind 0 oder 1 ... 1 wenn wahr 0 wenn falsch
       win_PONG += pong_gewinnt;
    
       Ausgabe: Anzahl Ballwechsel, Punkt PING, Punkte PONG
       incrementiere runde
    
       wenn runde >= 5 und runde < 10 aufschlag_ping = FALSCH  // pong ist dran
       sonst aufschlag_ping = nicht aufschlag_ping             // wechsel den status da punktweise gewechselt wird   
    }
    

    Solange weder ping_gewinnt noch pong_gewinnt RICHTIG
    müsste so aussehen?

    while(ping_gewinnt==true && pong_gewinnt==true){
    //....
    }
    

    beide müssen eigentlisch auf FALSCH gesetzt werden?



  • welive schrieb:

    Solange weder ping_gewinnt noch pong_gewinnt RICHTIG
    müsste so aussehen?

    while(ping_gewinnt==true && pong_gewinnt==true){
    //....
    }
    

    beide müssen eigentlisch auf FALSCH gesetzt werden?

    In Worten ausgedrückt:
    Solange weder ping noch pong gewonnen hat ... mach irgendwas.

    entspricht dann als Code:

    bool ping_gewinnt = false, pong_gewinnt = false;
    //...
    while (!ping_gewinnt && !pong_gewinnt) {
        // irgendwas machen
    }
    

    Sobald einer gewonnen hat, hat die entsprechende Variable (ping_gewinnt oder pong_gewinnt) den Wert true.
    Aus !ping_gewinnt bzw. !pong_gewinnt wird dann also false.
    Da du eine Verknüpfung mit logischem UND (&&) hast, wird dann aus dem Gesamtausdruck ebenfalls false - da dieser nur wahr ist, wenn beide Teilausdrücke wahr sind.
    Wenn der Gesamtausdruck false ist - dann wird die Schleife nicht weiter durchlaufen.



  • inter2k3 schrieb:

    welive schrieb:

    Solange weder ping_gewinnt noch pong_gewinnt RICHTIG
    müsste so aussehen?

    while(ping_gewinnt==true && pong_gewinnt==true){
    //....
    }
    

    beide müssen eigentlisch auf FALSCH gesetzt werden?

    In Worten ausgedrückt:
    Solange weder ping noch pong gewonnen hat ... mach irgendwas.

    entspricht dann als Code:

    bool ping_gewinnt = false, pong_gewinnt = false;
    //...
    while (!ping_gewinnt && !pong_gewinnt) {
        // irgendwas machen
    }
    

    Sobald einer gewonnen hat, hat die entsprechende Variable (ping_gewinnt oder pong_gewinnt) den Wert true.
    Aus !ping_gewinnt bzw. !pong_gewinnt wird dann also false.
    Da du eine Verknüpfung mit logischem UND (&&) hast, wird dann aus dem Gesamtausdruck ebenfalls false - da dieser nur wahr ist, wenn beide Teilausdrücke wahr sind.
    Wenn der Gesamtausdruck false ist - dann wird die Schleife nicht weiter durchlaufen.

    danke 🙂



  • vielen danke für eure hilfe!!!


Anmelden zum Antworten