KI für Pong



  • Hallo!

    Mittlerweile hab ich Kollisionsabfrage, und so fertig bei Pong. Nur die KI ist scheiße. Der Computer bewegt sich immer so, dass der Ball seinPaddel trefeen MUSS. Er bewegt sich immer mit dem Ball auf seinem y-Wert mit. Das ist doof, weil der Comp dan unbesiegbar ist. Wa kann man denn für einer KI da proggen?



  • 2 Vorschläge :

    • mach den Gegner einfach ein bissel langsamer als der Ball
    • lass die KI erst reagieren wenn der Ball eine gewisse Entfernung zum Paddel hat


  • Oder addiere zu der Y-Koordinate eine Zufallszahl hinzu. Ein menschlicher Gegner trifft den Ball ja auch nicht immer perfekt.



  • oder es wird immer ein bestimmter wert je nach schwierigkeitsgrad zu der Position addiert in richtung ball



  • @tobiking

    Wie meinst du das?
    Bis jetzt ist mir das lalles irgendwie zu kompliziert...
    vielleicht könnt ihr mir mal nen seudocode schicken?



    • mach den Gegner einfach ein bissel langsamer als der Ball
    paddel.m_speedY = (0.75*ball.m_speedY);
    
    • lass die KI erst reagieren wenn der Ball eine gewisse Entfernung zum Paddel if
    if (ball.m_posX > BILDSCHIRM_AUFLOESUNG_X/2)
    {
    //ki hier machen 
    }
    


  • überprüfen ob sich der Ball ober oder unterhalb des Pads befindet,
    wenn er sich über dem Pad befindet, nach oben fahren, wenn nicht, nach unten.
    Das ganze mit einer Geschwindigkeit, die nicht zu schnell ist.



  • Hi, ich habe es bei meinem Pong genauso gemacht, wie Headhunter es vorgeschlagen hat, der Computer reagiert erst ab einer bestimmten Nähe des Balls zu seinen Paddle-Koordinaten:

    // Je größer der Abstand, desto eher/schneller die Reaktion desto schwieriger
    // Ausgegegangen wird von 800*600
    #define EASY   510
    #define MIDDLE 465
    #define HARD   400
    
    void UpdateAI(PongBall* oPongBall,PongBat* oRightPongBat)
    {
        if (BallDirection != LEFT)
        {
            if ((oPongBall->GetPongBallX()) > Difficulty)
            {
                if ((oPongBall->GetPongBallY()) < (oRightPongBat->GetPongBatY()))
                    RightBatDirection = UP;
    
                else if ((oPongBall->GetPongBallY()) > (oRightPongBat->GetPongBatY()+100))
                    RightBatDirection = DOWN;
            }
    
        }
    
        if ((oPongBall->GetPongBallX()) < Difficulty)
            RightBatDirection = 0;
    } // Ende UpdateAI
    

Anmelden zum Antworten