kürzester abstand eines types mit einem anderem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bobbleboy

Betreff: kürzester abstand eines types mit einem anderem

BeitragDi, Jan 05, 2010 9:49
Antworten mit Zitat
Benutzer-Profile anzeigen
es geht um einen übungscode.
ich möchte eine einfache beute räuber simulation erstellen, hab auch alles innerhalb 2 stunden fertig bekommen, aber die räuber verhalten sich extremst buggy.
hier der code:

BlitzBasic: [AUSKLAPPEN]
Function moverauber()
For r.rauber = Each rauber
For b.beute = Each beute
If Sqr((r\x - b\x)^2 + (r\y - b\y)^2) < r\sichtweite ;hier ist der fehler
r\zielx = b\x
r\ziely = b\y
End If
Next
speed# = 2
winkel = ATan2((r\ziely - r\y),(r\zielx - r\x))
If winkel <0
winkel=winkel +360
End If
xspeed# = speed# * Cos(winkel)
yspeed# = speed# * Sin(winkel)
r\x = r\x + xspeed#
r\y = r\y + yspeed#
Next
End Function


wo der fehler liegt ist klar, aber wie löse ich das problem?
jeder räuber soll in richtung das für ihn nächsten beute stück laufen.
momentan läuft jeder rauber aber zu dem beute stück, das in der type liste innerhalb seiner sichtweite ist, was ja natürlich weiter weg sein kann als zum beispiel ein beute stück, das in der type liste weiter oben steht.
das führt dazu, das die rauber sich früher oder später zusammen horten und immer auf das selbe stück beute losgehen, ohne sich aufzuteilen.

ich setzte mich davor und denke natürlich weiter nach, sollte aber jemand vielleicht einen trick parat haben bin ich ganz offen.
 

mDave

BeitragDi, Jan 05, 2010 9:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute du musst:

~ Code entfernt ~
Überprüfe deinen Code das Nächste mal besser!
mfg mDave


Du musst noch eine Identifikationsnummer der Beuten erstellen, sodass nicht einer mit sich selbst verglichen wird.
  • Zuletzt bearbeitet von mDave am Di, Jan 05, 2010 10:57, insgesamt 3-mal bearbeitet
 

Bobbleboy

BeitragDi, Jan 05, 2010 10:03
Antworten mit Zitat
Benutzer-Profile anzeigen
wieso hast du zwei beuten?

was ich bisher gemacht habe:

BlitzBasic: [AUSKLAPPEN]
Function moverauber()
For r.rauber = Each rauber
nachste_beute = r\sichtweite
For b.beute = Each beute
If ((r\x - r\zielx)^2 + (r\y - r\ziely)^2) < 9
If Sqr((r\x - b\x)^2 + (r\y - b\y)^2) < nachste_beute
Sqr((r\x - b\x)^2 + (r\y - b\y)^2) = nachste_beute
r\zielx = b\x
r\ziely = b\y
End If
End If
Next
speed# = 1
winkel = ATan2((r\ziely - r\y),(r\zielx - r\x))
If winkel <0
winkel=winkel +360
End If
xspeed# = speed# * Cos(winkel)
yspeed# = speed# * Sin(winkel)
r\x = r\x + xspeed#
r\y = r\y + yspeed#
Next
For r.rauber = Each rauber
Oval r\zielx,r\ziely,9,9,0
Next
End Function


scheint auch nicht ganz das wahre zu sein... denn sie flocken immer noch, was sie nicht tun dürften. und sie wählen ziele die nicht die nächsten sind aus...
  • Zuletzt bearbeitet von Bobbleboy am Di, Jan 05, 2010 10:36, insgesamt einmal bearbeitet
 

mDave

BeitragDi, Jan 05, 2010 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Na, da zwei Beuten werden halt verglichen, wer näher ist.
Bei dieser "For...Each-Geschichte" werden _alle_ Individuen der Beute verglichen.
Nun musst du halt überprüfen, welche Beute am wenigsten entfernt ist.

Ich habe den Code ein wenig verwurschtelt, wird korrigiert.
 

Bobbleboy

BeitragDi, Jan 05, 2010 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ich gebe zu das dein code gut ist, trotzdem würde ich gerne wissen wieso meiner nicht funktioniert...

Noobody

BeitragDi, Jan 05, 2010 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Dein Code ist schon richtig, nur hast du da etwas vertauscht BlitzBasic: [AUSKLAPPEN]
Sqr((r\x - b\x)^2 + (r\y - b\y)^2) = nachste_beute

Wenn du den Ausdruck links und den rechts vom Gleichheitszeichen vertauschst, sollte es funktionieren.

mDave: Dein Code macht relativ wenig Sinn Wink
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Bobbleboy

BeitragDi, Jan 05, 2010 10:51
Antworten mit Zitat
Benutzer-Profile anzeigen
mein gott, du hast recht...
ich trottel Very Happy

BlitzBasic: [AUSKLAPPEN]
AppTitle ("hunt")
SeedRnd MilliSecs()
Global grafik_x = 200
Global grafik_y = 200
Graphics grafik_x,grafik_y,0,2
fps = CreateTimer(20)




Type beute
Field x
Field y
Field zielx
Field ziely
Field speed
Field hp
Field maxhp
End Type

Type rauber
Field x
Field y
Field zielx
Field ziely
Field sichtweite
Field hp
End Type





Repeat
Locate 1,1
Cls

drawbeute()

drawrauber()

If KeyHit(57)
start()
End If

movebeute()

moverauber()

die()

born()

WaitTimer fps
Flip 0
Until KeyDown(1)
End

Function start()
For i = 0 To 200
createbeute.beute(Rnd(grafik_x),Rnd(grafik_y))
Next
For i = 0 To 10
createrauber.rauber(Rnd(grafik_x),Rnd(grafik_y))
Next
End Function

Function createbeute.beute(x,y)
b.beute = New beute
b\maxhp = 100
b\hp = 0
b\x = x+Rnd(-5,5)
b\y = y+Rnd(-5,5)
End Function

Function createrauber.rauber(x,y)
r.rauber = New rauber
r\x = x + Rnd(-5,5)
r\y = y + Rnd(-5,5)
r\zielx = r\x
r\ziely = r\y
r\sichtweite = Rnd(10,1000)
r\hp = 50
End Function

Function drawbeute()
For b.beute = Each beute
Color 0,255,0
Plot b\x,b\y
Next
Color 255,255,255
End Function

Function drawrauber()
For r.rauber = Each rauber
Color 255,0,0
Plot r\x,r\y
Next
End Function

Function movebeute()
For b.beute = Each beute
nachste_rauber = 20
b\x = b\x+Rnd(-1,1)
b\y = b\y+Rnd(-1,1)
b\zielx = b\x
b\ziely = b\y
For r.rauber = Each rauber
If Sqr((r\x - b\x)^2 + (r\y - b\y)^2) < nachste_rauber
nachste_rauber = Sqr((r\x - b\x)^2 + (r\y - b\y)^2)
b\zielx = r\x
b\ziely = r\y
End If
Next
speed# = Rnd(0,1.3)
winkel = ATan2((b\ziely - b\y),(b\zielx - b\x))
If winkel < 0
winkel=winkel +360
End If
xspeed# = speed# * Cos(winkel) * -1
yspeed# = speed# * Sin(winkel) * -1
If yspeed = 0
xspeed = 0
End If
b\x = b\x + xspeed#
b\y = b\y + yspeed#
Next
End Function

Function moverauber()
For r.rauber = Each rauber
nachste_beute = r\sichtweite
If ((r\x - r\zielx)^2 + (r\y - r\ziely)^2) < 9
For b.beute = Each beute
If Sqr((r\x - b\x)^2 + (r\y - b\y)^2) =< nachste_beute
nachste_beute = Sqr((r\x - b\x)^2 + (r\y - b\y)^2)
r\zielx = b\x
r\ziely = b\y
End If
Next
End If
speed# = 1
winkel = ATan2((r\ziely - r\y),(r\zielx - r\x))
If winkel <0
winkel=winkel +360
End If
xspeed# = speed# * Cos(winkel)
yspeed# = speed# * Sin(winkel)
r\x = r\x + xspeed#
r\y = r\y + yspeed#
Next
End Function

Function die()
For r.rauber = Each rauber
If r\hp < 1
Delete r.rauber
End If
Next
For r.rauber = Each rauber
For b.beute = Each beute
If Sqr((r\x - b\x)^2 + (r\y - b\y)^2) < 3
r\hp = r\hp + 50 ;belohnung für den rauber
Delete b
ElseIf b\x < 0 Or b\x > grafik_x
Delete b
ElseIf b\y < 0 Or b\y > grafik_y
Delete b
End If
Next
Next
End Function

Function born()
For r.rauber = Each rauber
r\hp = r\hp -1
If r\hp > 300
createrauber.rauber(r\x,r\y)
r\hp = 70
End If
Next
For b.beute = Each beute
b\hp = b\hp + 1
If b\hp > 100
b\hp = 0
createbeute.beute(b\x,b\y)
End If
Next
End Function


das ist das komplette ding, ist ein wenig sehr unausbalanciert...

edit -> ausbalanziertere version

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group