Anfänger brauucht hilfe!



  • 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!!!



  • Ich habe jetzt keine Zeit umd as ganze zu testen aber trotzdem ein Tipp:
    Achte darauf, dass du eine gute Einrückung im Code hast. Es ist sehr schwierig deinen Code zu lesen.



  • 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   
    }
    

    wie kann ich hier den Endstand einbauen???


Anmelden zum Antworten