Schnellere Formel gesucht

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Firstdeathmaker

Betreff: Schnellere Formel gesucht

BeitragDo, Jun 23, 2005 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Abend, ich hätte da mal eine Frage die ich in den Raum stellen möchte:

Ich bastel gerade an einer Kampfengine für ein Strategiespiel in dem viele Raumschiffe aufeinander treffen. Die Gefechte werden dabei simuliert, d.h. berechnet. In dieser Gefechtsberechnung gibt es einen kleinen Teil, der, bei großen Mengen an Schiffen, recht langsam wird.
Der Teil berechnet, ob die Schiffskanonen eines Schiffstypes der einen Flotte (a) Schiffe eines anderen Types der Flotte b treffen und das gleiche dann auch noch mal umgekehrt für die andere Flotte. Ab Schiffszahlen von <500k sind jedoch teilweise 1mio Kanonen zu berechnen, was die Angelegenheit <1 Sekunde dauern lässt, da er ja alle in der For-Schleife durchgeht.

BlitzBasic: [AUSKLAPPEN]
a_new_schusstreffer=0
For a_schuesse=1 To a_schuesse_ende
If Rnd(1)*a\s\treffsicher>Rnd(1)*b\s\wendigkeit a_new_schusstreffer=a_new_schusstreffer+1
Next



Meine weitere Forschungsrichtung war jetzt, zu sehen wie die Trefferquoten dabei aufgebaut sind, hab mir also ein kleines Programm geschrieben und folgenden Test gemacht:

user posted image
0%--------------------------------100% Getroffen

Also, was ich suche, ist eine Möglichkeit, die oben Zitierte Berechnung zu beschleunigen, dabei aber gleichzeitig die gleichen Trefferquoten zu erreichen.

Ich häng hier mal noch den Testcode für die Trefferquote an:
BlitzBasic: [AUSKLAPPEN]
;Jäger
shiptype.shiptype=New shiptype
shiptype\name=\"Starfighter\"
shiptype\angriff=2
shiptype\kanonen=2
shiptype\treffsicher=50
shiptype\verteidigung=5
shiptype\Wendigkeit=50
shiptype\Speed=0.5
shiptype\Frachtraum=5
shiptype\art=1
shiptypes(0)=Handle(shiptype)

;Breavis
shiptype.shiptype=New shiptype
shiptype\name=\"Breavis\"
shiptype\angriff=25
shiptype\kanonen=10
shiptype\treffsicher=50
shiptype\verteidigung=50
shiptype\Wendigkeit=30
shiptype\Speed=1
shiptype\Frachtraum=50
shiptype\art=2
shiptypes(1)=Handle(shiptype)

;Mutterschiff
shiptype.shiptype=New shiptype
shiptype\name=\"Mutterschiff\"
shiptype\angriff=1000000
shiptype\kanonen=50
shiptype\treffsicher=60
shiptype\verteidigung=15000
shiptype\Wendigkeit=10
shiptype\Speed=50
shiptype\Frachtraum=500
shiptype\art=3
shiptypes(2)=Handle(shiptype)


Type armeeslot
Field n.armeeslot
Field s.shiptype
Field anzahl
Field anzahl_tmp
End Type


a.armeeslot=New armeeslot
a\s.shiptype=Object.shiptype(shiptypes(0))
a\anzahl=100
a\anzahl_tmp=a\anzahl


b.armeeslot=New armeeslot
b\s.shiptype=Object.shiptype(shiptypes(1))
b\anzahl=1
b\anzahl_tmp=a\anzahl


a_schuesse_ende= a\s\kanonen*a\anzahl
Dim treffer(a_schuesse_ende)

Graphics a_schuesse_ende,800
SetBuffer BackBuffer()

runde=0
Repeat
runde=runde+1
a_new_schusstreffer=0
For a_schuesse=1 To a_schuesse_ende
If Rnd(1)*a\s\treffsicher>Rnd(1)*b\s\wendigkeit a_new_schusstreffer=a_new_schusstreffer+1
Next
treffer(a_new_schusstreffer)=treffer(a_new_schusstreffer)+1

Cls
For i=0 To a_schuesse_ende
Line 10+i,800,10+i,800-treffer(i)
Next

Text 10,10,runde
Text 10,20,a_new_schusstreffer
Flip 0

Until KeyHit(1)
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

Dreamora

BeitragDo, Jun 23, 2005 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
An der kannst du nicht wirklich etwas beschleunigen ...
Du berechnest halt extrem viele Daten.

Was du tun kannst ist nicht pro Schuss sondern pro Schiff oder pro Waffentyp auf einem Schiff (sofern du das hast) zu berechnen ... oder mit realistischen Raumschiffzahlen arbeiten.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Firstdeathmaker

BeitragDo, Jun 23, 2005 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, pro Schuss muss schon sein. Weil, ein großes Raumschiff mit 2 enormen Kanonen wird nie eine gute Chance gegen 500 Jäger haben, weil es pro Kampfrunde höchstens 2 Jäger erwischen kann. Deshalb rechne ich mit Kanonen/Treffern/Schüssen anstatt mit einzelnen Raumschiffen. Ich hab das ganze rechenmäßig ja schon ziemlich drücken können, aber dieses Problem oben blieb ja noch bestehen.

Ne weitere Idee von mir ginge so weit, eine Funktion zu finden, welche diese Quotenkurve die sich beim abspielen des Testprogrammes ergibt, nachsimuliert. Diese Funktion müsste also den Extrempunkt (und Hochpunkt) errechnen und darum in einem bestimmten noch festzustellendem Warscheinlichkeitsmuster eine abfallende Trefferrate generieren. Dann hat man schonmal das Warscheinlichkeits-Grundmuster, welches man für eine Funktion braucht die eine Zahl# zwischen 0 und 1 zu diesen Warscheinlichkeiten zuordnet, und dadurch die Anzahl der Treffer ausgeben kann.


Hmm... theoretisch hab ich´s jetzt, nun brauch ich nur noch die Formeln dazu entwickeln.

HILFE! Wink
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

hitokiri

BeitragFr, Jun 24, 2005 4:11
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn auch nicht die gewünschte funktion für den graphen aber du könntest zum beispiel auch rand(0,100) anstatt rnd(0,1) nehmen, kommt doch in etwa aufs selbe raus aber mit integern bist du schonmal sehr viel schneller als mit floats.

Firstdeathmaker

BeitragFr, Jun 24, 2005 7:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs mit Integern ausprobiert, ist nicht schneller. Hab ein paar Testdurchläufe gemacht, folgendes Ergebnis:

Integer: 4474-4542 Millisec
Float: 4012-4056 Millisec


Aber mit einer gemeingültigen Formel würde das ja keine Rolle mehr spielen.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group