Pong KI Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

tobias185

Betreff: Pong KI Problem

BeitragDo, Feb 09, 2006 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo mache gerade ein Pong klone aber irgendwie komme ich bei dem gegner schläger nicht weiter das er hinter den ball hergeht das er ihn auch trift habe auch schon mehreres probiert mit If und mit der Repeat until schleife aber hat beides nicht funktioniert, wie würdet ihr das lösen. Ich habe auch schon die suchfunktion probiert und habe zu diesem thema nichts richtiges gefunden.

Code: [AUSKLAPPEN]

Global Gfx_x = 800
Global Gfx_y = 600

Graphics Gfx_x,Gfx_y,16,2

SetBuffer BackBuffer()

Player = LoadImage("Player.bmp")
MaskImage Player,255,0,255
Gegner = LoadImage("Gegner.bmp")
MaskImage Gegner,255,0,255
Balken = LoadImage("Balken.bmp")
MaskImage Balken,255,0,255
Balken2 = LoadImage("Balken2.bmp")
MaskImage Balken2,255,0,255
Ball = LoadImage("Ball.bmp")
MaskImage Ball,255,0,255

Type Gegner
Field gegnerx
Field gegnery
Field speed
End Type

speed = 3
gegnerx = 780
gegnery = 300

Balkenx = 0
Balkeny = 594

Balken2x = 0
Balken2y = -3

Ballx = 400
Bally = 300
SpeedBallx = 2
SpeedBally = 2

Repeat
Cls

gegnery = gegnery + speed
Bally = Bally + SpeedBally
Ballx = Ballx + SpeedBallx

If ImagesCollide(Gegner,Gegnerx,Gegnery,0,Balken,Balkenx,Balkeny,0) Then
speed = -speed
EndIf

If ImagesCollide(Gegner,Gegnerx,Gegnery,0,Balken2,Balkenx2,Balkeny2,0) Then
speed = -speed
EndIf

If ImagesCollide(Ball,Ballx,Bally,0,Balken,Balkenx,Balkeny,0) Then
SpeedBally = -SpeedBally -1
EndIf

If ImagesCollide(Ball,Ballx,Bally,0,Balken2,Balkenx2,Balkeny2,0) Then
SpeedBally = -SpeedBally -1
EndIf

If ImagesCollide(Gegner,gegnerx,gegnery,0,Ball,Ballx,Bally,0) Then
SpeedBallx = -SpeedBallx -1
EndIf

DrawImage Gegner,gegnerx,gegnery
DrawImage Balken,Balkenx,Balkeny
DrawImage Balken2,Balken2x,Balken2y
DrawImage Ball,Ballx,Bally


Flip

Until KeyDown(1)
End
http://gncboard.gn.funpic.de/index.php

Cardonic

BeitragDo, Feb 09, 2006 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich würde das etwa so machen:
Code: [AUSKLAPPEN]

GegnerX = GegnerX + (BallX-GegnerX) / 3
GegnerY = GegnerY + (BallY-GegnerY) / 3

Bei diesem code bewegt sich der Schläger des Gegners in Richtung des Balles (mit ein wenig verzögerung, oder wie man das nennen will)

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.
 

tobias185

BeitragFr, Feb 10, 2006 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Es funktioniert zwar aber irgendwie geht aber nichts mehr richtig mit der Imagecollide am rand vom bildschirm wo ich zwei balken hingesetzt habe da geht der schläger einfach durch.
http://gncboard.gn.funpic.de/index.php

Spikespine

BeitragFr, Feb 10, 2006 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Cardonic hat Folgendes geschrieben:
Hi, ich würde das etwa so machen:
Code: [AUSKLAPPEN]

GegnerX = GegnerX + (BallX-GegnerX) / 3
GegnerY = GegnerY + (BallY-GegnerY) / 3

Bei diesem code bewegt sich der Schläger des Gegners in Richtung des Balles (mit ein wenig verzögerung, oder wie man das nennen will)

mfg Cardonic


Eine solche KI ist langweilig.
Spielspaß kommt auf, wenn ich der KI eine Reaktionszeit gebe, die manchmal in einem kleinen Bereich zufällig variiert, so dass der Gegner etwas menschenähnlicher wird.
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax
 

tobias185

BeitragFr, Feb 10, 2006 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du ein Tip dafür?
http://gncboard.gn.funpic.de/index.php

Cardonic

BeitragFr, Feb 10, 2006 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Man kann z.B. eine Variabel für die Ungenauigkeit erstellen, die sich fortan ändert. Dann kann man noch machen, dass der Schläger des Gegners sich erst bewegt, wenn der Ball schon über der Hälfte ist und sonst nur ein wenig auf und ab wippt. Man kann die Gegner-KI beliebig ausbauen.
Ich habe auch mal so etwas geproggt: Es sieht am besten aus, wenn mehrere Faktoren die gegnerische Bewegungen beeinflussen.

mfg Cardonic
If you should go skating on the thin ice of modern life, dragging behind you the silent reproach of a million tear-stained eyes, don't be surprised when a crack in the ice appears under your feet.
 

tobias185

BeitragFr, Feb 10, 2006 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt funktioniert alles ausser das der Ball irgendwie nicht schneller wird udn wenn der Bally und y = 400 ist geht der schläger nur nach unten aber reagiert nicht auf mein imagescollide.

Hier der code:
Code: [AUSKLAPPEN]
Global Gfx_x = 800
Global Gfx_y = 600

Graphics Gfx_x,Gfx_y,16,2

SetBuffer BackBuffer()

Player = LoadImage("Player.bmp")
MaskImage Player,255,0,255
Gegner = LoadImage("Gegner.bmp")
MaskImage Gegner,255,0,255
Balken = LoadImage("Balken.bmp")
MaskImage Balken,255,0,255
Balken2 = LoadImage("Balken2.bmp")
MaskImage Balken2,255,0,255
Ball = LoadImage("Ball.bmp")
MaskImage Ball,255,0,255

Const Rauf = 200, Runter = 208


Type Gegner
Field gegnerx
Field gegnery
Field speed
End Type

Type Bally
Field Ballx
Field Bally
Field SpeedBallx$
Field SpeedBally$
End Type

Playerx = 3
Playery = 300

speed = 5
gegnerx = 780
gegnery = 300

Balkenx = 0
Balkeny = 594

Balken2x = 0
Balken2y = -4

Ballx = 400
Bally = 300
SpeedBallx = 2
SpeedBally = 2

Repeat
Cls

If KeyDown(Rauf) Then
Playery = Playery - 3
EndIf
If KeyDown(Runter) Then
Playery = Playery + 3
EndIf

If Ballx < 400 Then
gegnery = gegnery + speed
EndIf

If ballx > 400 Then
If bally - gegnery > 4 Then
gegnery = gegnery + speed
EndIf
If bally - gegnery < -4 Then
gegnery = gegnery - speed
EndIf
EndIf




Bally = Bally + SpeedBally
Ballx = Ballx + SpeedBallx

If ImagesCollide(Gegner,gegnerx,gegnery,0,Balken2,Balkenx2,Balkeny2,0) Then
gegnery = gegnery - speed
EndIf

If ImagesCollide(Gegner,gegnerx,gegnery,0,Balken,Balkenx,Balkeny,0) Then
gegnery = gegnery - speed
EndIf

If ImagesCollide(Ball,Ballx,Bally,0,Balken,Balkenx,Balkeny,0) Then
SpeedBally = -SpeedBally - 0.1
EndIf

If ImagesCollide(Ball,Ballx,Bally,0,Balken2,Balkenx2,Balkeny2,0) Then
SpeedBally = -SpeedBally -0.1
EndIf

If ImagesCollide(Gegner,gegnerx,gegnery,0,Ball,Ballx,Bally,0) Then
SpeedBallx = -SpeedBallx -0.1
EndIf

If ImagesCollide(Player,Playerx,Playery,0,Ball,Ballx,Bally,0) Then
SpeedBallx = -SpeedBallx -0.1
EndIf


DrawImage Player,Playerx,Playery
DrawImage Gegner,gegnerx,gegnery
DrawImage Balken,Balkenx,Balkeny
DrawImage Balken2,Balken2x,Balken2y
DrawImage Ball,Ballx,Bally



Flip

Until KeyDown(1)
End


Ich habe probier auch die ganzen geschwindigkeiten auf das bild zu bringen aber das geht irgendwie nicht.
Print "Speedgegner = " speed
Print "Ballspeedx = " SpeedBallx#
Print "Ballspeedy = " SpeedBally#
http://gncboard.gn.funpic.de/index.php

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group