bessere KI

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Lord AdZ

Betreff: bessere KI

BeitragFr, Apr 06, 2007 13:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Apr 06, 2007 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 07, 2007 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 08, 2007 1:07
Antworten mit Zitat
Benutzer-Profile anzeigen
das liegt möglicherweise daran, dass die variablen deines gegners integers sind und keine floats?
versuchs mal mit

Global xsp1# = xmax/2

Smily

BeitragSo, Apr 08, 2007 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
Wink
Warum muss ich gerade an Robot Karol denken? ^^

Jetzt musst du es nur noch in einen BB-Freundlichen Syntax umwandeln

Lord AdZ

BeitragSo, Apr 08, 2007 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group