bessere KI
Übersicht

![]() |
Lord AdZBetreff: bessere KI |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin grade dabei ein einfaches Ping-Pong-Spiel zu schreiben, aber bei der KI hab ich noch Probleme. Momentan ist das bei mir so, das der Gegner die selbe x-Position hat, wie die Kugel, was aber langweilig ist. Ich stell mir das so vor, das sich der Gegner nur bewegt, wenn der Ball in seiner Hälfte ist und ansonsten nur ein bisschen hin und her wippt. Hat jemand eine Idee, wie das geht?
Hier ist mein Code: Zitat: Global xmax=1024,ymax=768 Graphics xmax,ymax,32,1 SetBuffer BackBuffer() Global frametimer = CreateTimer(60) SeedRnd MilliSecs() Global kugel=LoadImage("Bullet2.png") MidHandle kugel Global spieler1=LoadImage("Spieler_1.png") MidHandle spieler1 MaskImage spieler1,255,255,255 Global spieler2=LoadImage("Spieler_2.png") MidHandle spieler2 MaskImage spieler2,255,255,255 Global begrenzung=LoadImage("Wand.png") MaskImage begrenzung,255,255,255 Global xsp1=xmax/2;in der Mitte Global xsp2=xmax/2 Global ysp1 Global ysp2 Global sp1st Global sp2st Global xkugel# Global ykugel# Global winkel Global geschwindigkeit=10 Global fehlersp1 Global fehlersp2 Global beweglichkeit Global cheats Bullet2y = Bullet2y + SpeedBullet2y Bullet2x = Bullet2x + SpeedBullet2x cheats=0 ClsColor 0,0,200;blauer Hintergrund resetkugel;richtige Position der Kugel Repeat WaitTimer (frametimer) beweglichkeit=geschwindigkeit For z2=0 To 1 If z2=1 Then x=xmax-50 Else x=0 For z=0 To ymax/50 DrawImage begrenzung,x,z*50 Next Next ; der Spielstand von beiden Spielern ist gleich 0, wenn 0 gedrückt wurde If KeyHit(11) Then fehlersp1=0 fehlersp2=0 EndIf If KeyHit(38) Then cheats=cheats+1 ;aktiviert die Cheateingabe, wenn L gedrückt wurde If KeyHit(1) Then End ;beendet das Spiel, wenn esc gedrückt wurde If KeyHit(201) Then geschwindigkeit=geschwindigkeit+1 ;erhöht die spielgeschwindigkeit um 1, wenn man 5 drückt If KeyHit(209) Then geschwindigkeit=geschwindigkeit-1 ;verringert die spielgeschwindigkeit um 1, wenn man 6 drückt If KeyDown(78) Then geschwindigkeit=geschwindigkeit+1 ;erhöht die spielgeschwindigkeit um 1, wenn man + drückt If KeyDown(74) Then geschwindigkeit=geschwindigkeit-1 ;verringert die spielgeschwindigkeit um 1, wenn man - drückt If KeyHit(14) Then resetkugel;setzt die kugel zurück, wenn entf gedrückt wurde ;cheats If KeyHit(59) And cheats=1 Then geschwindigkeit=geschwindigkeit+100000 ;wenn F1 gedrückt wurde, verändert sich die Geschwindigkeit If KeyHit(60) And cheats=1 Then geschwindigkeit=10 ;wenn F2 gedrückt wurde, ist die Geschwindigkeit wieder normal If KeyHit(61) And cheats=1 Then ClsColor 10, 100, 29 ;wenn F3 gedrückt wurde verändert sich der Hintergrund If KeyHit(62) And cheats=1 Then ClsColor 0,0,200 ;wenn F4 gedrückt wurde, ist der Hintergrund wieder blau If KeyHit(63) And cheats=1 Then fehlersp2=fehlersp2+142480647 ;haha ;hat Spieler1 gewonnen? If fehlersp2>9 Then Text xmax/2, 100, "Spieler1 hat gewonnen" resetkugel geschwindigkeit=0 EndIf ;hat Spieler2 gewonnen? If fehlersp1>9 Then Text xmax/2, 100, "Spieler2 hat gewonnen" resetkugel geschwindigkeit=0 EndIf ;neues Spiel, wenn W gedrückt wurde If fehlersp1>9 And KeyHit(17) Then fehlersp1=0 fehlersp2=0 geschwindigkeit=10 EndIf If fehlersp2>9 And KeyHit(17) Then fehlersp1=0 fehlersp2=0 geschwindigkeit=10 EndIf ;die Spielersteuerung If KeyHit(2) Then resetkugel sp1st=sp1st+1;verändert die Spielsteuerung, wenn 1 gedrückt wurde EndIf If KeyHit(3) Then sp2st=sp2st+1;verändert die Spielsteuerung, wenn 2 gedrückt wurde resetkugel EndIf If sp1st>2 Then sp1st=0 If sp2st>2 Then sp2st=0 ;die automatische Steuerung, wenn die Steuerungsvariable 0 ist: If xsp1>xkugel And sp1st=0 Then xsp1=xsp1-beweglichkeit If xsp1<xkugel And sp1st=0 Then xsp1=xsp1+beweglichkeit If xsp2>xkugel And sp2st=0 Then xsp2=xsp2-beweglichkeit If xsp2<xkugel And sp2st=0 Then xsp2=xsp2+beweglichkeit ;die Tastatursteuerung, wenn die Steuerungsvariable 1 ist: If KeyDown(203) And sp1st=1 Then xsp1=xsp1-beweglichkeit;linke Pfeiltaste If KeyDown(205) And sp1st=1 Then xsp1=xsp1+beweglichkeit;rechte Pfeiltaste If KeyDown(44) And sp2st=1 Then xsp2=xsp2-beweglichkeit;Y If KeyDown(45) And sp2st=1 Then xsp2=xsp2+beweglichkeit;X ;die Maussteuerung, wenn die Steuerungsvariable 2 ist: If sp1st=2 Then xsp1=xsp1+MouseXSpeed() If sp2st=2 Then xsp2=xsp2+MouseXSpeed() ;die Überprüfung: If xsp1<70 Then xsp1=70 If xsp1>xmax-70 Then xsp1=xmax-70 If xsp2<70 Then xsp2=70 If xsp2>xmax-70 Then xsp2=xmax-70 ;die Kollisionsabfrage der Spieler If ImagesCollide(spieler1,xsp1,ymax-10,0,kugel,xkugel,ykugel,0) Then;wenn eine Kollision besteht winkel=360-winkel ;prallt die Kugel ab abweichung=2*(xsp1-xkugel) ;Richtungssteuerung der Kugel winkel=winkel+abweichung EndIf If ImagesCollide(spieler2,xsp2,10,0,kugel,xkugel,ykugel,0) Then winkel=360-winkel abweichung=2*(xsp2-xkugel) winkel=winkel-abweichung EndIf ;damit der Winkel nicht über den Bereich von 0-360 geht: If winkel>360 Then winkel=winkel-360 If winkel<0 Then winkel=winkel+360 ;Kollisionsabfrage Seitenwände If xkugel<60 Then winkel=180-winkel ;damit prallt die Kugel ab EndIf If xkugel>xmax-60 Then winkel=180-winkel EndIf ;wenn die Kugel durchgelassen wurde If ykugel<-10 Then ;oben fehlersp2=fehlersp2+1 ;der Obere bekommt einen Fehlerpunkt dazu resetkugel EndIf If ykugel>ymax+10 Then ;unten fehlersp1=fehlersp1+1 ;der Untere bekommt einen Fehlerpunkt dazu resetkugel EndIf ;Berechnung der Kugelkoordinaten xkugel=xkugel+Cos(winkel)*geschwindigkeit ykugel=ykugel-Sin(winkel)*geschwindigkeit ;Informationen auf dem Bildschirm Text 200,300,"Geschwindigkeit:" + geschwindigkeit Text 500,300,"Spielstand: "+fehlersp2 + " : " + fehlersp1 ;Steuerungsart Text 55,ymax-25,"Spieler1 " If sp1st>0 Then If sp1st=2 Then Text 120,ymax-25," Maussteuerung " Else Text 120,ymax-25," Tastatursteuerung " Else Text 120,ymax-25," Computer " EndIf If spieler1man>0 Then Text 250,ymax-25,scorep1 Text 55,5,"Spieler2 " If sp2st>0 Then If sp2st=2 Then Text 120,5," Maussteuerung " Else Text 120,5," Tastatursteuerung " EndIf Else Text 120,5," Computer " EndIf Text 200, 370, "1 drücken, um die Steuerung von Spieler1 zu verändern" Text 200, 390, "2 drücken, um die Steuerung von Spieler2 zu verändern" Text 200, 410, "Bild auf drücken, um die Geschwindigkeit zu erhöhen" Text 200, 430, "Bild ab drücken, um die Geschwindigkeit zu verringern" Text 200, 450, "ESC drücken, um das Spiel zu beenden" Text 200, 470, "W drücken, um nach einem gewonnenem oder verlorenem Spiel fortzufahren" Text 200, 150, "Spieler2 mit y und x steuern" Text 200, 600, "Spieler1 mit den Pfeiltasten steuern" DrawImage kugel,xkugel,ykugel;Kugelbild DrawImage spieler1,xsp1,ymax-10 DrawImage spieler2,xsp2,10 Flip Cls Until KeyHit(1) End Function resetkugel() xkugel=xmax/2:ykugel=ymax/2 If Rand(0,1)=1 Then winkel=Rand(105,45) Else winkel=Rand(315,225);der Winkel wird durch Zufall ermittelt End Function |
||
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] if ykugel > Graphicsheight()*0.5 then ;Die Kugel befindet sich auf der unteren Bildschirmhälfte ; das "hin und her wackeln" kannst du mit einer variablen steuern, z.B.: xZufall# = xZufall# + Rnd(-0.5,0.5) ; damit die Bewegung nicht zu heftig wird: If xzufall < -1 xZufall = -1 Else If xZufall > 1 xZufall = 1 xsp1=xsp1+xZufall else ;Die Kugel befindet sich auf der oberen Bildschirmhälfte ;- Gegner verfolgt Kugel endif |
||
![]() |
Lord AdZ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit deiner Lösung gehts auch nicht. Der Gegner bewegt sich jetzt fast gar nicht mehr.
Hier der neue Code: Code: [AUSKLAPPEN] If ykugel>GraphicsHeight()*0.5 And sp2st=0 Then ;Die Kugel befindet sich auf der unteren Bildschirmhälfte ; das "hin und her wackeln" kannst du mit einer variablen steuern, z.B.: xZufall#=xZufall#+Rnd(-0.5,0.5) ; damit die Bewegung nicht zu heftig wird: If xZufall<-1 xZufall=-1 Else If xZufall>1xZufall=1 xsp1=xsp1+xZufall Else If ykugel<GraphicsHeight()/2 And sp2st=0 And xsp2>xkugel Then xsp2=xsp2-beweglichkeit ;Die Kugel befindet sich auf der oberen Bildschirmhälfte If ykugel<GraphicsHeight/2 And xsp2<xkugel And sp2st=0 Then xsp2=xsp2+beweglichkeit ;- Gegner verfolgt Kugel EndIf |
||
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
das liegt möglicherweise daran, dass die variablen deines gegners integers sind und keine floats?
versuchs mal mit Global xsp1# = xmax/2 |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du scheinst ja schon so ziemlich genau zu wissen, was du willst:
WENN der ball in der hälfte des gegner ist, DANN soll er sich richtung ball bewegen, SONST soll er nur ein wenig hin-und her wippen. ![]() Warum muss ich gerade an Robot Karol denken? ^^ Jetzt musst du es nur noch in einen BB-Freundlichen Syntax umwandeln |
||
![]() |
Lord AdZ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, danke, mit diesem Code hats jetzt geklappt:
Code: [AUSKLAPPEN] ;die automatische Steuerung, wenn die Steuerungsvariable 0 ist: If xsp1>xkugel And sp1st=0 And ykugel>GraphicsHeight()/2 Then xsp1=xsp1-beweglichkeit If xsp1<xkugel And sp1st=0 And ykugel>GraphicsHeight()/2 Then xsp1=xsp1+beweglichkeit If xsp2>xkugel And sp2st=0 And ykugel<GraphicsHeight()/2 Then xsp2=xsp2-beweglichkeit If xsp2<xkugel And sp2st=0 And ykugel<GraphicsHeight()/2 Then xsp2=xsp2+beweglichkeit ;erweiterte KI von Spieler2 If ykugel>768/2 And sp2st=0 Then ;hin und her wackeln von Spieler2 xZufall#=xZufall#+Rnd(-3,3) If xZufall<-3.5 xZufall=-3.5 Else If xZufall>3.5xZufall=3.5 xsp2=xsp2+xZufall EndIf |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group