AI-Frage

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

NoneX

Betreff: AI-Frage

BeitragSa, Apr 24, 2010 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versuche gerade ein kleines Airhockey game zu programmieren, habs jetzt fast schon so weit das es richtig Spielbar ist. Mir fehlt noch eine richtige AI. Jetzt weiß ich nicht wie man eine richtige AI macht.
Hatte beim ersten mal einfach xB (x-Koordinate des gegners)=xP (x-Koordinaten des Puks). Leider ergibt sich ja da das Problem das man nicht gewinnen kann.
Hab dann ein bisschen im Forum gesucht aber nichts wirklich konkretes gefunden. Nur das sich eine einfache AI mit rnd machen lässt.

Jetzt zu meinem Problem:

Ich bekomme es einfach nicht hin. Hier der Code:

Ganzer Code:
BlitzBasic: [AUSKLAPPEN]
Graphics 1280,720,16,0

rot=LoadImage ("gfx\rot.bmp")
blau=LoadImage ("gfx\blau.bmp")
Puk=LoadImage ("gfx\Puk.bmp")
Tor1=LoadImage ("gfx\Tor1.bmp")
Tor2=LoadImage ("gfx\Tor2.bmp")
rando=LoadImage ("gfx\Rando.bmp")
randu=LoadImage ("gfx\Randu.bmp")
randl=LoadImage ("gfx\Randl.bmp")
randr=LoadImage ("gfx\Randr.bmp")

.Reset

xR=400 ; Rot
yR=500

xB=400 ; Blau
yB=-80

xP=450 ; Puk
yP=200

move=1 ; Puk Bewegung
winkel=0 ;Puk Winkel


ScoreR=0
ScoreB=0



Repeat

DrawImage rot,xR,yR
DrawImage blau,xB,yB
DrawImage Puk,xP,yP
DrawImage Tor1,500,-250
DrawImage Tor2,500,440
DrawImage randl,0,0
DrawImage randr,0,0
DrawImage rando,0,0
DrawImage randu,0,-5

Locate 100,100
Print ScoreR
Locate 100,150
Print ScoreB

Speed=1

AI = Rand (1,6)



If KeyDown(205) Then xR=xR+1 ; Rot Bewegung
If KeyDown(203) Then xR=xR-1 ; Rot Bewegung


If AI=1 And xB>xP Then test=1; AI
If AI=2 And xB>xP Then test=2 ; AI
If AI=3 And xB<xP Then test=3 ; AI
If AI=4 And xB<XP Then test=4 ; AI
If AI=5 And xB>xP Then test=5; AI
If AI=6 And xB<xP Then test=6; AI

If test=1 Then Repeat xB=xB+1 Until xB=xP
If test=2 Then Repeat xB=xB+1 Until xB=xP+40
If test=3 Then Repeat xB=xB-1 Until xB=xP-10
If test=4 Then Repeat xB=xB-1 Until xB=xP-100
If test=5 Then Repeat xB=xB+1 Until xB=xP+10
If test=6 Then Repeat xB=xB-1 Until xB=xP-40

If xP<200 Then xP=200 ;max X Puk
If xP>1050 Then xP=1050 ;max X Puk

If move=1 Then yP=yP+2 ; Puk Bewegung
If move=2 Then yP=yP-2 ; Puk Bewegung

If winkel=1 Then xP=xP+Tan(xA) ;Apprall winkel
If winkel=2 Then xP=xP+Tan(xA) ;Apprall winkel


If ImagesCollide(rot, xR, yR, 0, puk, xP, yP, 0) Then move=2*speed
If ImagesCollide(blau, xb, yB, 0, puk, xP, yP, 0) Then move=1*speed

If ImagesCollide(blau, xb, yB, 0, puk, xP, yP, 0) Then winkel=2
If ImagesCollide(rot, xR, yR, 0, puk, xP, yP, 0) Then winkel=1

If ImagesCollide(blau, xb, yB, 0, puk, xP, yP, 0) Then xA=xP-xB
If ImagesCollide(rot, xR, yR, 0, puk, xP, yP, 0) Then xA=xP-xR

If ImagesCollide(Puk, xP, yP, 0, Tor2, 500, 441, 0) Then yP=200
If ImagesCollide(Puk, xP, yP, 0, Tor2, 500, 440, 0) Then scoreB=ScoreB+1

If ImagesCollide(Puk, xP, yP, 0, Tor1, 500, -251, 0) Then yP=200
If ImagesCollide(Puk, xP, yP, 0, Tor1, 500, -250, 0) Then scoreR=ScoreR+1


If ImagesCollide(Puk, xP, yP, 0, Rando, 0, 0, 0) Then Move=1
If ImagesCollide(Puk, xP, yP, 0, Randl, 0, 0, 0) Then Block=1
If ImagesCollide(Puk, xP, yP, 0, Randr, 0, 0, 0) Then Block=2
If ImagesCollide(Puk, xP, yP, 0, Randu, 0, -5, 0) Then Move=2

Flip
Cls
Until KeyHit(1)



End


Mein AI-Versuch:
BlitzBasic: [AUSKLAPPEN]
AI = Rand (1,6)

If AI=1 And xB>xP Then test=1; AI
If AI=2 And xB>xP Then test=2 ; AI
If AI=3 And xB<xP Then test=3 ; AI
If AI=4 And xB<XP Then test=4 ; AI
If AI=5 And xB>xP Then test=5; AI
If AI=6 And xB<xP Then test=6; AI

If test=1 Then Repeat xB=xB+1 Until xB=xP
If test=2 Then Repeat xB=xB+1 Until xB=xP+40
If test=3 Then Repeat xB=xB-1 Until xB=xP-10
If test=4 Then Repeat xB=xB-1 Until xB=xP-100
If test=5 Then Repeat xB=xB+1 Until xB=xP+10
If test=6 Then Repeat xB=xB-1 Until xB=xP-40


Problem:

.Spiel hängt sich auf

Vorheriger Versuch:

BlitzBasic: [AUSKLAPPEN]

If AI=1 And xB>xP Then xB=xP; AI
If AI=2 And xB>xP Then xB=xP+40 ; AI
If AI=3 And xB<xP Then xB=xP-10 ; AI
If AI=4 And xB<XP Then xB=xP-100 ; AI
If AI=5 And xB>xP Then xB=xP+10; AI
If AI=6 And xB<xP Then xB=xP-40 ; AI


Problem:

.funktioniert aber der Gegner hüpft hin und her


Wäre sehr nett wenn mir es jemand erklären könnte,wie man das mit der AI hinbekommt ^^

Lg NoneX

M0rgenstern

BeitragSa, Apr 24, 2010 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, es gibt ein Problem, was du nicht bedenkst:

BlitzBasic: [AUSKLAPPEN]

If AI=1 And xB>xP Then xB=xP; AI
If AI=2 And xB>xP Then xB=xP+40 ; AI
If AI=3 And xB<xP Then xB=xP-10 ; AI
If AI=4 And xB<XP Then xB=xP-100 ; AI
If AI=5 And xB>xP Then xB=xP+10; AI
If AI=6 And xB<xP Then xB=xP-40 ; AI


Du übergiebst die Koordinaten des Puks an die des Gegners und rechnest nach was drauf.
Dass der Gegner dann springt ist klar.

Ich würde dir zu sowas raten:
Dem Gegner eine bestimmte Geschwindigkeit zu geben, sagen wir 10.

Dann schreibst du (Pseudocode):

BlitzBasic: [AUSKLAPPEN]
If xP > xB Then xB = xB + SpeedB
ElseIf xP < xB Then xB = xB - SpeedB


Dadurch wird die Bewegung des Gegners abhängig von seiner Position neu berechnet.

Das sieht besser aus und ist auch fairer dem Spieler gegenüber.

Lg, M0rgenstern
 

NoneX

BeitragSa, Apr 24, 2010 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke,

hab nun noch eine Frage zur AI. Mit dem Code den du mir beschrieben hast schiesst mein gegner den ball nur gerade zurück (auser er ist zu langsam), Ist es möglich es so zu schreiben das es z.B.: 5 weiter fährt
damit es auch manchmal schräg zurück spielt

Lg NoneX

M0rgenstern

BeitragSo, Apr 25, 2010 9:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, das ist jetzt nicht mehr schwer.
Da gibt es zwei Möglichkeiten:

Entweder, du rechnest immer eine Toleranz drauf:

BlitzBasic: [AUSKLAPPEN]
If (xP+Rand(0,15)) > xB Then xB = xB + SpeedB
ElseIf (xP-Rand(0,15)) < xB Then xB = xB - SpeedB


Oder du machst es folgendermaßen:
Du deklarierst eine Variable, sagen wir Toleranz = 10 und Toleranz2.
Dann deklarierst du eine Variable, sagen wir SchlagZufall

Vor der Bewegung des Gegners machst du dann folgendes:

BlitzBasic: [AUSKLAPPEN]
Schlagzufall = Rand(0,1)
Toleranz2 = Toleranz + Rand(-10,10)
If Schlagzufall = 1 Then
If (xP+Toleranz2) > xB Then xB = xB + SpeedB
ElseIf (xP-Toleranz2) < xB Then xB = xB - SpeedB
ElseIf SChlagzufall = 0 Then
If xP > xB Then xB = xB + SpeedB
ElseIf xP < xB Then xB = xB - SpeedB
EndIf


Bei Möglichkeit 1 ist es wahrscheinlicher, dass er den Ball nie genau anholt und bei Möglichkeit 2 besteht ne 50/50 Chance.
Bitte am anfang SeedRnd Millisecs() nicht vergessen (also ganz am Anfang von COde).

Kann sein, dass du mit den Werten hantieren musst, dass der SChläger nicht zu weit vom Puk entfernt ist.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group