Physiker gesucht.

03/15/2011 21:57 LuckyLuke#1
hey leute, ich habe mithilfe von der autoitbot community etwas meiner meinung nach nicht schlechtes geschaffen. bei dem winhttp teil half mir simon1602.

ich machs kurz. viele werden von euch das spiel worms kennen. es basiert von der physik her auf der wurfparabel und dem stokeschen satz. (=flugbahn in abhängigkeit von wind)

ich habe also x,y koordinaten der spieler ermittelt und aufgrund der entfernung von spieler 1 zu spieler 2 unter winkel 45° ausgerechnet wie stark man schießen muss. was mir in der formel fehlt ist der gegenwind bzw wind mit dem das geschoss beschleunigt wird und ich habe keine ahnung wie ich das hinkriegen kann.

es handelt sich um das facebookspiel ddtank.


ihr könnt gerne auch den source leechen weil da paar nette sachen drin sind, aber wäre auch nett wenn mir da wer helfen könnte.

die momentane formel sieht so aus: Vo=Sqrt(g*(x*x)/((2*cos(45)*(sin(45)*x-cos(45)*y)))

ich muss da irgendwie wind reinkriegen. kann mir wer vll noch sagen wie ich die erdanziehung ermitteln könnte im spiel? momentan verwende ich einen wert den ich nach gefühl gewählt habe.

hier mal der source für alle leecher&helfer

Code:
#NoTrayIcon
#include <Misc.au3>
#include <String.au3>
#include <Array.au3>
#include <GUIConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <WinHTTP.au3>


Global $aLink,$i=25, $Winpos
Opt("WinTitleMatchMode", 3)
$width = 1000
$height = 700

HotKeySet("x", "self")
HotKeySet("{esc}", "ende")
HotKeySet("<", "save")
HotKeySet("y", "wurfweite")


$mail2 = InputBox("FB Login", "Enter your email.", "")
$pass2 = InputBox("FB Login", "Enter your password.", "", "*")
_getFlashFile($mail2,$pass2)




If IsArray($aLink) = True Then
	$movie ="http://s1.ddt.facebookmmo.com/" & $aLink[0]
	$filey = FileOpen("pagelink.txt", 1)
	FileWrite($filey,$movie)
GUICreate("DDTank", $width, $height, (@DesktopWidth/2)-200, (@DesktopHeight/2)-200)
GUISetBkColor(0x000000)
$flash = ObjCreate("ShockwaveFlash.ShockwaveFlash.1")
GUICtrlCreateObj($flash, 0, 0, 1000, 600)
$Label1 = GUICtrlCreateLabel("Choosen Power:", 16, 648, 240, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label3 = GUICtrlCreateLabel("PO", 256, 648, 50, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Label4 = GUICtrlCreateLabel("Recommended Power:", 320, 648, 327, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFFFFFF)
$Label5 = GUICtrlCreateLabel("NA", 648, 648, 51, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0xFF0000)
$Label6 = GUICtrlCreateLabel("DDT Buddy v1.0", 904, 672, 84, 17)
GUICtrlSetColor(-1, 0xFFFFFF)
Else
	MsgBox(48, "Achtung!", "Login nicht erfolgreich, entweder ist das Password falsch oder DDTank ist noch nicht als App hinzugefügt!")
	EndIf

With $flash
    .Movie =$movie
    .ScaleMode = 0;0 showall, 1 noborder, 2 exactFit, 3 noscale
    .bgcolor = "#000000"
    .Loop = True
    .wmode = "Opaque"
EndWith

GUISetState()

While 1
    if _IsPressed ("6B") then
		Sleep (100)
		$i += 1
		GUICtrlSetData($label3,$i)
		EndIf
	if _IsPressed ("6D") Then
		Sleep (100)
		$i -= 1
		GUICtrlSetData($Label3, $i)
		EndIf
	Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _getFlashFile($sEmail,$sPasswort)
	 
  $hOpen = _WinHttpOpen("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5")

    $hConnect = _WinHttpConnect($hOpen, "www.facebook.com")
    $sHTML = _WinHTTPRequest($hConnect, '/login.php?api_key=42495f32cc7f1f6e6fe6102600c721a6&v=1.0&next=http%3A%2F%2Fddt.facebookmmo.com%2Fs1.php&req_perms=publish_stream%2Cemail')
    $aLSD = StringRegExp($sHTML, '"lsd" value="(.+?)"', 3)
    $sHTML = _WinHTTPRequest($hConnect, '/login.php?login_attempt=1', 'charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84&lsd=' & $aLSD[0] & '&next=http%3A%2F%2Fddt.facebookmmo.com%2Fs1.php&api_key=42495f32cc7f1f6e6fe6102600c721a6&return_session=0&req_perms=publish_stream%2Cemail&legacy_return=1&display=&session_key_only=0&trynum=1&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84&lsd=' & $aLSD[0] & '&email=' & $sEmail & '&pass=' & $sPasswort & '&persistent=1&default_persistent=1&login=Anmelden', '', '', True, True, 1)
    _WinHttpCloseHandle($hConnect)
    $aLocation = StringRegExp($sHTML, 'Location: http://ddt.facebookmmo.com/(.*)', 3)
    If Not IsArray($aLocation) Then Return False

    $hConnect = _WinHttpConnect($hOpen, "ddt.facebookmmo.com")
    $sHTML = _WinHTTPRequest($hConnect, $aLocation[0])
    _WinHttpCloseHandle($hConnect)
    $aIframe = StringRegExp($sHTML, 'src="http://s1.ddt.facebookmmo.com/(.+?)"', 3)
    If Not IsArray($aLocation) Then Return False

    $hConnect = _WinHttpConnect($hOpen, 's1.ddt.facebookmmo.com')
    $sHTML = _WinHTTPRequest($hConnect, $aIframe[0])
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    If Not IsArray($aLocation) Then Return False
    $aLink = StringRegExp($sHTML, "value='(Loading\.swf.+?)'", 3)
	
EndFunc

Func _WinHTTPRequest($hConnect, $sSite, $sPost = "", $sReferer = "", $sExtraHeaders = "", $bUseHTTPS = False, $bIsBinary = False, $iGetHeaderOnly = 0)

    ;|---------------------_WinHTTPRequest by Simon---------------------|
    ;|                                                                    |
    ;|                    Parameter für $iGetHeaderOnly:                    |
    ;|                                                                    |
    ;|                    0 = Body zurückgeben                            |
    ;|                    1 = Header zurückgeben                            |
    ;|                    2 = Header und Body zurückgeben                    |
    ;|------------------------------------------------------------------|

    Local $hRequest, $sData, $sMode = "GET", $sOptional = $WINHTTP_NO_REQUEST_DATA, $sHeaders = $WINHTTP_NO_ADDITIONAL_HEADERS, _
            $iFlags = $WINHTTP_FLAG_ESCAPE_DISABLE, $sReferers = $WINHTTP_NO_REFERER

    If $sPost <> "" Then
        $sMode = "POST"
        $sPost = StringReplace($sPost, "ä", "%C3%A4")
        $sPost = StringReplace($sPost, "ö", "%C3%B6")
        $sPost = StringReplace($sPost, "ü", "%C3%BC")
        $sPost = StringReplace($sPost, "Ä", "%C3%84")
        $sPost = StringReplace($sPost, "Ö", "%C3%96")
        $sPost = StringReplace($sPost, "Ü", "%C3%9C")
        $sPost = StringReplace($sPost, "É", "%C3%89")
        $sPost = StringReplace($sPost, "é", "%C3%A9")
        $sPost = StringReplace($sPost, "ß", "%C3%9F")
        $sPost = StringReplace($sPost, "@", "%40")
        $sOptional = $sPost
        $sHeaders = "Content-Type: application/x-www-form-urlencoded" & @CRLF
    EndIf

    If $sReferer Then $sReferers = $sReferer
    If $bUseHTTPS Then $iFlags = $WINHTTP_FLAG_SECURE
    If $sExtraHeaders Then $sHeaders &= $sExtraHeaders

    $hRequest = _WinHttpOpenRequest($hConnect, $sMode, $sSite, "HTTP/1.1", $sReferers, $WINHTTP_DEFAULT_ACCEPT_TYPES, $iFlags) ; Anfrage an die Seite stellen
    _WinHttpSendRequest($hRequest, $sHeaders, $sOptional) ; Anfrage senden.

    _WinHttpReceiveResponse($hRequest) ; Warte auf Antwort des Servers
    If _WinHttpQueryDataAvailable($hRequest) Then
        If $iGetHeaderOnly Then $sData = _WinHttpQueryHeaders($hRequest)
        If $iGetHeaderOnly == 1 Then Return $sData
        If $bIsBinary Then
            $sData &= "0x"
            While 1
                $sTempData = _WinHttpReadData($hRequest, 2)
                If @error Then ExitLoop
                $sData &= StringTrimLeft($sTempData, 2)
            WEnd
            _WinHttpCloseHandle($hRequest)
        Else
            Do
                $sData &= _WinHttpReadData($hRequest) ; Antwort aus dem Buffer lesen.
            Until @error ; bis ein fehler auftritt (übertragung abgeschlossen)
            _WinHttpCloseHandle($hRequest)
        EndIf
        Return $sData
    EndIf
EndFunc   ;==>_WinHTTPRequest

Func wurfweite()
	$g = 3
	$pi = 3.14159265358979
	$degToRad = $pi / 180
	$x0 = FileReadLine("coords.txt", 1)
	$y0 = FileReadLine("coords.txt", 2)
	$x1 = FileReadLine("coords.txt", 3)
	$y1 = FileReadLine("coords.txt", 4)
	$xdelta = $x1-$x0
	$x = Sqrt($xdelta*$xdelta)*5.7
	$ydelta = $y1-$y0
	$y = Sqrt($ydelta*$ydelta)*5.7
	$staerke = Sqrt($g*($x*$x)/((2*cos(45*$degToRad))*(sin(45*$degToRad)*$x-cos(45*$degToRad)*$y)))
	$zeit = $staerke*40
	Send ("{SPACE down}") 
	Sleep ($zeit) 
	Send ("{SPACE UP}")
	FileDelete("coords.txt")
EndFunc

Func ende() ; logischerweise: Ende xD
    FileDelete("coords.txt")
	Exit
EndFunc 

Func save() ;speichert die Koordinaten
    $file = FileOpen("coords.txt", 1)
    If $file = -1 Then Exit MsgBox(0, 'Maus-Koordinaten', 'Datei konnte nicht geöffnet werden!') ;überprüft ob die Datei schon vorhanden ist
    $WinPos = WinGetPos("DDTank")
		
	$pos = PixelSearch( $WinPos[0]+750, $WinPos[1], $WinPos[0]+1000, $WinPos[1]+200, 0xFF0000 ) 
if IsArray($pos) then
FileWrite($file, $pos[0] & @CRLF & $pos[1] & @CRLF)
Else
	MsgBox(0,"RED","was not found.")
	EndIf
	
	$pos = PixelSearch( $WinPos[0]+750, $WinPos[1], $WinPos[0]+1000, $WinPos[1]+200, 0x0033CC)  
if IsArray($pos) then
	FileWrite($file, $pos[0] & @CRLF & $pos[1] & @CRLF)
Else
	MsgBox(0,"BLUE","was not found.")
	EndIf


If IsArray($pos) = True Then
	$g = 3
	$pi = 3.14159265358979
	$degToRad = $pi / 180
	$x0 = FileReadLine("coords.txt", 1)
	$y0 = FileReadLine("coords.txt", 2)
	$x1 = FileReadLine("coords.txt", 3)
	$y1 = FileReadLine("coords.txt", 4)
	$xdelta = $x1-$x0
	$x = Sqrt($xdelta*$xdelta)*5.7
	$ydelta = $y1-$y0
	$y = Sqrt($ydelta*$ydelta)*5.7
	$staerke = Sqrt($g*($x*$x)/((2*cos(45*$degToRad))*(sin(45*$degToRad)*$x-cos(45*$degToRad)*$y)))
	GUICtrlSetData($Label5,$staerke)
Else
	MsgBox(4096,"OOPS","There is no active challenge / something gone wrong. Before scanning get into a game.")
	EndIf
	sleep(1000)
    FileClose($file)
EndFunc   ;==>save

Func self()
	$zeit1 = $i*40
	Send ("{SPACE down}") 
	Sleep ($zeit1) 
	Send ("{SPACE UP}")
EndFunc
gruß
03/17/2011 23:51 LuckyLuke#2
scheinbar alles nur leecher hier, schwach
03/18/2011 12:42 | Moep |#3
Die erdanziehung g= 9,81 m/s². Diese Kraft wirkt senkrecht nach unten und bremst dein projektil bis zum Scheitelpunkt der Parabel ab, danach wirkt sie beschleunigend. Die Kraft des Windes wirkt parallel zum erdboden, je nach richtung wird dein projektil beschleunigt oder abgebremst. Die Einheit des Windes sollte auch in m/s² gewählt werden. Jetzt musst du nurnoch herrausfinden mit welcher Kraft dein Projektil abgefeuert wird und welche Masse es besitzt. Damit kannst du auf die Geschwindigkeit des Projektils zum Zeitpunkt des abfeuerns schließen. Davon rechnest du dann die oben aufgeführten Beschleunigungs und Abbremskräfte mit ihrer ausrichtung ein. Keine Ahnung ob die Programmierer des Spiels auch die Reibung des Projektils an den Luftteilchen mit einberechnet haben, wenn ja musst du das auch noch mit beachten.

Ist alles nur so ein Gedankenspiel, vom Prinzip her müsste es aber funktionieren, einfach rumprobieren.

Viel Spass!..
03/18/2011 17:02 LuckyLuke#4
so wie ich das verstehe wird im endeffekt durch den wind v0 erhöht oder vermindert
03/18/2011 17:30 xNopex#5
v(t) wird durch den Wind beeinflusst bzw. v(s). V0 sollte deine Startgeschwindigkeit sein und damit konstant. Aus V0 kannst du dann v(t) bzw. v(s) iterativ berechnen. Zum Thema Luftwiderstand:
[Only registered and activated users can see links. Click Here To Register...]

Nun könntest du einfach einen konstanten Wert a einführen, um den v(t)/v(s) erhöht verringert wird. Z.B. pro Meter um 1m/s² beschleunigt. Das wäre sicherlich das einfachste. Natürlich kannst du jetzt auch den Winkel mit einrechnen, wenn der Wind nicht 100%tig von vorne bzw. von hinten kommt:

100% Beschleunigung in Flugrichtung (negativ+positiv) = 0° Abweichung von der Windrichtung
0% Beschleunigung in Flugrichtung(negativ+positiv)= -90° und +90° Abweichung von der Windirchtung
-> pro Grad abweichung ((1/90)*100)% Weniger Beschleunigung (negativ+positiv)

Damit ergibt sich:
alpha = Abweichwinkel des Flugobjekts von der Windrichtung
t = Zeitpunkt
a = Beschleunigung (positiv/negativ)
v(t2) = ((( 1 - |alpha| * (1/90) ) * a ) * t ) + v(t1)

Ist natürlich komplex und es können sich bei meinen Ausführungen Fehler eingeschlichen haben. Hab das nur mal eben im Kopf gerechnet/mir überlegt.
03/21/2011 17:59 | Moep |#6
Quote:
Originally Posted by LuckyLuke View Post
so wie ich das verstehe wird im endeffekt durch den wind v0 erhöht oder vermindert
Ja, das einfachste wäre wohl wenn du bei einem Windstillen match die Zielgenauigkeit perfektionierst. Und dann bei wind einfach in folgender Zeile:

Code:
$zeit = $staerke*40
die Windstärke subtrahierst (bei Rückenwind), bzw addierst (bei gegenwind). Hat dann aber weniger was mit präziser Mathemathik zu tun, eher eine Sache des ausprobierens und verfeinerns.