Hallo @Oscar,
Nachdem ich mir eine goldene Münze erspielt hatte und danach eine Bombe kam, habe ich mit der Bombe auch die goldene Münze "zerstört".
In der Folge kamen nur noch goldene Münzen, die Sondersymbole für Zeit und Punkte und die Bombe.
Ich habe das Spiel dann irgendwann abgebrochen, weil ich sonst ewig hätte weiter spielen können
Chiphunter1.4.png
Beiträge von autoiter
-
-
Hallo @horphi,
Da hast du doch schon deine Funktion. Worum geht es dir mit der Frage? -
Acht Tage, bzw. sechs Updates zuvor:
Eine neue Version gibt es in Post#1.
Hoffentlich vorerst die Letzte.Aber ich denke, es hat dir auch Spaß gemacht, @Oscar.
PS: Im aktuellen Paket ist ein kleines Malheur passiert. Entweder muss man einen Ordner BASS anlegen und die BASS.au3 , bass.dll und BASSconstants.au3 hineinschieben oder das Include sowie den bass.dll-Aufruf in Zeile 50 anpassen.
-
Hallo Leute,
ich verstehe das Problem nicht. Allerdings möchte ich das mal anhand meines Systems visualisieren. Mir kommt es nicht so vor, als sei das Problem bisher getroffen.Hier meine Windows Version (x64):
Meine Werte aus der Registry:
SciTE.pngHier ein Screenshot aus der aktuellen Spielversion:
Screen.png
(Ich ballere glaube ich gerade in der Karibik ) -
Die neueste Version fetzt!
Das Menü sieht bei mir korrekt aus. Meine Windows Version ist exakt die gleiche, wie Bitnuggers. -
Hallo @Rigobert,
ich mache es wie hier beschrieben: https://www.autoitscript.com/autoit3/scite/…erCallTips.html
Lies eher hier: https://www.autoitscript.com/wiki/Adding_UD…utoIt_and_SciTEDas geht mit dem User Call Tip Manager in SciTE total schnell.
-
Du bist bei _FileWriteToLine geblieben, während Oscar FileWriteLine verwendet hat.
Die Hilfe zu _FileWriteToLine sagt:
Zitat von _FileWriteToLineReturn Value
Success: 1. Failure: 0 and sets the @error flag to non-zero. @error: 1 - File has fewer lines than $iLine2 - File does not exist3 - Error when opening file4 - $iLine is invalid
5 - $iOverWrite is invalid
6 - $sText is invalidErgänze mal ein ConsoleWrite und schaue dir den Fehler in der Konsole an.
AutoIt_FileWriteToLine($hFileOpen, 1, "[Allgemeine Auftragsdaten]") If @error Then ConsoleWrite(@error & @CRLF)
Da kommt der Fehlerwert 2 heraus. Aha, hat nicht geklappt, weil es die Zeile nicht gab.
Nimm mal FileWriteLine und nutze die Rückgaben der Funktionen, um zu prüfen, ob sie erfolgreich waren oder nicht und warum nicht. -
Der Code, den Oscar gepostet hat, erstellt eine Datei, in der mindestens der genannte Text steht. Ansonsten kannst du alles mit @error prüfen.
Ich gehe fest davon aus, dass es einen Fehler bei der Implemntierung in deinen Code gibt. Du musst da nochmal was zeigen. -
Hast du den FileSaveDialog mit OK bestätigt?
Welchen Inhalt hat $sFileSaveDialog_Auftrag nach dem Dialog?
Mindestens [Allgemeine Auftragsdaten] sollte nämlich in der Datei stehen.. -
Hm, dann habe ich wohl noch etwas anderes geändert. Da schaue ich später mal nach.
Jedenfalls ist bei mir die Konsolenausgabe gut. Wenn ich dein Beispiel nutze zerhackt mir _WinAPI_WideCharToMultiByte($sText, 65001) die Ausgabe. -
Hallo @Bitnugger,
Ich glaube ich hatte wegen der Umlaute mal folgenden Tipp von hier befolgt und die Einstellungen bearbeitet. https://www.autoitscript.com/forum/topic/17…ding-to-v33140/
Jedenfalls werden Umlaute bei mir mit UTF8 mit BOM richtig dargestellt. -
Hallo @Mikki,
dein Problem ist, dass du mit _FileWriteToLine in eine Datei schreiben willst, die nicht schon existiert. Eine @error Prüfung müsste dir das auch mitteilen.Das hier ist ein Fehler. FileInstall ist zum Inkludieren von Dateien in kompilierte Skripte und kann keine Variablen enthalten. Zumal du keine zum Zeitpunkt der Kompilierung vorhandene Datei inkludieren willst (?) sondern das Ergebnis des Dialogs während der Ausführung (?). Erstelle z.B. nach Buttondruck die Datei mit FileOpen und schreibe dann hinein.
-
Hey vielen Dank @De Rand Ere,
es gibt sie. Schau mal hier: Listview-Datenbank v3
Gerade von Oscar habe ich noch andere so extrem ausführlich kommentierte Skripte gesehen (leider gerade nicht gefunden).@autoiter
Mach das noch 27 mal und wir sind keine Freunde mehr...Hehe, gerade habe ich erst deine Drohung bemerkt, @Bitnugger ,
Da muss man einfach drüber stehen. Der alpines hat gefühlt schon hundert mal die Antwort weggeschnappt.
Außerdem bist du vielleicht einmal nicht schneller, aber hast ja meist die bessere Antwort als ich -
Hallo @MotDy2k,
mein erster Beitrag hier lautete in etwa so: "Hallo Leute, ich habe keine Ahnung von AutoIt, möchte aber alles Mögliche zum Bearbeiten von Texten lernen. Könnt ihr mir zeigen, wie ich etwa das mache..". Daher hege Sympathie für dein Anliegen
Hier gibt es viele Methoden. Den schnellsten und elegantesten hat dir Oscar mit StringRegExp gezeigt. Wenn du gleich damit loslegst, wirst du bald sehr weit kommen. Für einen Anfänger ist es aber doch schwer, dass auf andere Beispiele zu übertragen. Daher habe ich mir mal Mühe gegeben um dir ein paar Funktionen zu zeigen, mit denen du einiges mit Texten machen kannst.
Das Skript ist nicht der einfachste Weg und selbst für diesen Weg sind da einige unnötige Zeilen. Man könnte etwa direkt in der ersten Schleife mit dem FileWrite anfangen, aber ich wollte noch ein paar Zuweisungsmethoden zeigen.
ACHTUNG: Lege vor der Ausführung des Codes im gleichen Verzeichnis eine Textdatei mit Namen "Logfile.txt" ab, in der, der von dir im ersten Beitrag gezeigte, Text steht. (Der Text ist hier nicht schon integriert wie bei Oscar, sondern er soll aus einer Datei eingelesen werden).
Spoiler anzeigen
AutoIt
Alles anzeigen#include <Array.au3> #include <MsgBoxConstants.au3> #include <FileConstants.au3> _Example() Func _Example() Local $aFileText = FileReadToArray(@ScriptDir & "\Logfile.txt") _ArrayDisplay($aFileText, "Inhalt der Datei") Local $aIndex = _ArrayFindAll($aFileText, "disabled=no", 0, 0, 0, 1) _ArrayDisplay($aIndex, "Indizes mit Treffern") Local $iMaxIndex = UBound($aFileText) Local $iResultMax = UBound($aIndex) Local $aResults[$iResultMax] For $i = 0 To $iResultMax - 1 If $aIndex[$i] + 2 <= $iMaxIndex Then $aResults[$i] = StringLeft($aFileText[$aIndex[$i] + 2], StringInStr($aFileText[$aIndex[$i] + 2], " radio") - 1) Next _ArrayDisplay($aResults, "Die gesuchten Textinhalte") Local $sString = "" For $i = 0 To UBound($aResults) - 1 $sString &= "enable " & $aResults[$i] & @CRLF Next ; Ende des Schleifendurchlaufs MsgBox($MB_SYSTEMMODAL, "Die fertige Zeichenfolge", $sString) Local $hFileOpen = FileOpen(@ScriptDir & "\Ergebnis.txt", $FO_OVERWRITE) FileWrite($hFileOpen, $sString) FileClose($hFileOpen) EndFunc ;==>_Example
So und hier habe ich das Skript noch einmal ganz ausführlich (und hoffentlich in der Hauptsache korrekt) erklärt, damit du einen möglichst guten Einstieg in einige Funktionen findest, die dir hierbei ständig über den Weg laufen könnten.Spoiler anzeigen
AutoIt
Alles anzeigen; Vorbemerkung: Die Variablen beginnen immer mit $. Später kommt eine vllt. aussagekräftige Bezeichnung. ; Dazwischen ist es absolut sinnvoll und hier auch angewendet, den Variablen ein/mehrere Kürzel für den Inhalt mitzugeben, ; damit dir und anderen immer sofort klar ist, ob gerade mit einem Array, einer Integer-, oder String-Variable gearbeitet wird. ; Dazu und vieles andere Sinnvolle hier: https://www.autoitscript.com/wiki/Best_coding_practices ; ; Darüber hinaus: Du kannst in SciTE auf jeden Befehl im Quellcode klicken, dann F1 drücken und landest in der Hilfe mit ausführbaren Beispielcode zu der Funktion. #include <Array.au3> ; Für die im Skript benutzten _Array... Funktionen benötigt #include <MsgBoxConstants.au3> ; Die verwendete MsgBox hat einen Stil. Sie taucht nur mit einem OK-Button auf. Dazu könnte man das flag 0 nutzen und braucht dieses Include nicht. ; Ich möchte hier aber die sprechendere Konstante $MB_SYSTEMMODAL verwenden und binde dazu diese au3-Datei ein, in der diese Konstanten definiert sind. ; Allgemein ist es sinnvoll in den Skripten, die in der Hilfe angegebenen Konstanten zu verwenden, statt den Zahlenwerten (, auch wenn ich das selbst nicht immer mache..). ; Sollten sich in vielleicht neu erscheinenden AutoIt-Versionen Änderungen bei den Zahlenwerten ergeben, würden Fehler auftreten, hättest du die Zahlen verwendet. #include <FileConstants.au3> ; Für die verwendete Konstante im FileOpen-Aufruf. _Example() Func _Example() Local $aFileText = FileReadToArray(@ScriptDir & "\Logfile.txt") ; Datei wird in ein Array ($aArray) eingelesen. "@ScriptDir" ist ein AutoIt-Makro und steht für das Verzeichnis, in dem das Skript liegt. _ArrayDisplay($aFileText, "Inhalt der Datei") ; Inhalt wird angezeigt. WICHTIG: Hier siehst du, das die erste Zeile die Nummer Null trägt! Arrays sind nullbasiert. Das bedeutet: Anzahl der Elemente sind bspw. 9. Dann ist die letzte Elementenummer 8. Local $aIndex = _ArrayFindAll($aFileText, "disabled=no", 0, 0, 0, 1) ; Hier werden alle Zeilen mit "disabled=no" gesucht. Ergebnisse kommen in das Array $aIndex _ArrayDisplay($aIndex, "Indizes mit Treffern") ; Hier werden die Trefferzeilen angezeigt. (Es geht bei Null los. Daher ist der erste Treffer hier in Zeile bzw. Array-Index Null). Local $iMaxIndex = UBound($aFileText) ; Mit Ubound wird die Anzahl der Einträge (Indizes) in einem Array ermittelt. Hier vom Inhalte der Datei. Local $iResultMax = UBound($aIndex) ; Hier wird die Anzahl der Einträge der Trefferzeilen ermittelt. Local $aResults[$iResultMax] ; Hier wird ein Array erstellt, in das die Zielinhalte kommen. In den eckigen Klammern steht die Anzahl der Elemente, die das Array fassen soll. ; In diesem Fall nutzen wir die Variable $iResultMax, die ja die Anzahl der Treffer beinhaltet. For $i = 0 To $iResultMax - 1 ; Hier gehen wir das Array mit den Treffern durch und verarbeiten es. ; Ich nutze hierzu eine For .. To .. Schleife. Die Variable $i (sie existiert nur innerhalb der Schleife) nimmt in diesem Fall bei jedem Schleifendurchlauf einen um eins höheren Wert an. ; Die Schleife startet bei 0 und endet, wenn $i den Wert $iResultMax - 1 angenommen hat. ; $iResultMax - 1 weil $iResultMax = die Anzahl der Elemente ist. Ich beginne die Schleife aber nicht bei Eins, sondern bei Null. - Daher jede Zeile minus Eins. If $aIndex[$i] + 2 <= $iMaxIndex Then $aResults[$i] = StringLeft($aFileText[$aIndex[$i] + 2], StringInStr($aFileText[$aIndex[$i] + 2], " radio") - 1) ; Hier werden die Treffer ermittelt. Schritt für Schritt: ; "If $aIndex[$i] + 2 <= $iMaxIndex Then": ; bspw. im ersten Durchlauf in Worten (Wenn 0 + 2 kleiner oder gleich (hier) 9 dann..) ; Wenn der Wert von Element $aIndex[$i] + 2 noch innerhalb der Größe des Arrays mit den Inhalten ist, dann (soll nur Fehler vermeiden, falls mal keine zwei Zeilen nach einem Treffer kommen).. ; Im ersten Durchlauf ist $aIndex[$i] = $aIndex[0], im zweiten $aIndex[1] - wie in For $i = 0 To.. angegeben. ; $aIndex[0] hat nun, wie du im zweiten _ArrayDisplay gesehen hast, den Wert Null (weil der erste Treffer mit "disabled=no" im Element Null (erstes Element) von $aFileText war). ; Ich suche etwas zwei Zeilen darunter und sage daher immer $aIndex[$i] + 2 ; "$aResults[$i] = ": ; Wenn die If .. Then Bedingung von oben zutrifft, dann wird das Folgende als aktuelles Element von $aResults verwendet. ; Wieder am Beispiel vom ersten Durchlauf: $aResults[0] ist gleich. ; StringLeft($aFileText[$aIndex[$i] + 2], StringInStr($aFileText[$aIndex[$i] + 2], " radio") - 1): ; Hier habe ich zwei Funktionen in eine Zeile geschrieben. StringLeft und StringInStr. Schau dir zu allen Befehlen am besten auch gleich die Hilfe an. (Wort in SciTE anklicken und F1 drücken). ; StringLeft gibt vom Text, den man reinwirft, den Text bis zum n-ten Zeichen zurück. ; StringLeft ( "Gesamter Text", Anzahl der Zeichen von Links ) ; Als "Gesamter Text" gebe ich nun $aFileText[$aIndex[$i] + 2] an. Für den ersten Durchlauf ist das der Inhalt der Zeile (Element) 0 + 2 vom Array $aFileText. Also $aFileText[2] ; Hier willst du ja nicht die gesamte Zeile, sondern nur einen Teil vom Anfang. Dafür benutze ich die Funktion StringInStr. (Sucht einen Suchtext in einem bestimmten Text). ; StringInStr($aFileText[$aIndex[$i] + 2], " radio") sucht also in der angegebenen Zeile nach " radio", was ich in deinem Bsp. als eindeutigen Trenner gesehen habe. ; Diese Funktion gibt bei Erfolg die Nummer des ersten Zeichens des Treffers zurück. Man kann das in einer Variable speichern oder direkt verwenden wie hier. ; Das heißt, StringLeft("abcde", 2) ergibt genauso "ab" wie auch StringLeft("abcde", StringInStr("abcde", "b")), weil StringInStr("abcde", "b") gleich Zwei ist. ; Im Skript ziehe ich "StringInStr($aFileText[$aIndex[$i] + 2], " radio")" noch Eins ab, weil du das erste Zeichen des Treffers (das Leerzeichen) ja nicht im Ergebnis haben möchtest. ; Statt es direkt zu verwenden, hättest man die Rückgabe von StringInStr, wie geschrieben auch in einer Variable speichern können. Das ist vor Allem dann sinnvoll, ; wenn du wiederholt auf diese Information zurückgreifen möchtest. Das könnte hier dann so aussehen: ; Local $iCharNumber = StringInStr($aFileText[$aIndex[$i] + 2], " radio") ; If $aIndex[$i] + 2 <= $iMaxIndex Then $aResults[$i] = StringLeft($aFileText[$aIndex[$i] + 2], $iCharNumber - 1) Next ; Next markiert das Ende eines Schleifendurchlaufs. Alles in der Schleife spielt sich zwischen For .. To .. und Next ab. _ArrayDisplay($aResults, "Die gesuchten Textinhalte") ; Der Text, der in die Textdatei soll. Local $sString = "" ; Hier deklariere ich eine lokale Variable, in die der Text soll. For $i = 0 To UBound($aResults) - 1 ; Wieder eine Schleife. Von Null bis zur Anzahl der Elemente von $aResults minus Eins (Weil wir ja nicht bei 1 beginnen sondern bei Null). $sString &= "enable " & $aResults[$i] & @CRLF ; Hier siehst du zwei Dinge, die mit dem Verkettungs-Operator & angestellt werden können. ; 1. wird hier der leeren Variable $sString ($sString = "") in jedem Durchlauf neuer Inhalt ergänzt "&=". ; Würde hier nur "=" stehen, bekäme die Variable bei jedem Durchlauf einen neuen Wert. ; 2. werden hier ein String (Zeichenfolge "enable ") mit einer Variable $aResults[$i] (Inhalt des Array-Elementes $i) ; und dem Makro für einen Windows-Zeilenumbruch (@CRLF) verkettet und ergeben einen zusammenhängenden Text. Next ; Ende des Schleifendurchlaufs MsgBox($MB_SYSTEMMODAL, "Die fertige Zeichenfolge", $sString) ; Hier wird eine Windows Message Box eingeblendet, die dir die Zeichenkette anzeigt, die dann in die Zieldatei geschrieben werden soll. Local $hFileOpen = FileOpen(@ScriptDir & "\Ergebnis.txt", $FO_OVERWRITE) ; Schreibst du häufiger in eine Datei, ist es sinnvoll, ; die Datei mit der Funktion FileOpen zu öffnen/erstellen und mit dem handle weiter zu arbeiten. ; Das ist deutlich schneller, weil die gleich genutzte Funktion FileWrite das sonst bei jedem Aufruf selbst macht.. ; Ich verwende das hier, damit du auf die Funktion aufmerksam wirst, weil sie bei Arbeiten mit Textdateien häufig hilft/notwendig ist (Zeichensatz usw.). ; Bei dieser einmaligen Nutzung von FileWrite ist es eigentlich sinnlos, es sei denn du wolltest mit FileOpen sicherstellen, dass das Zielverzeichnis erstellt wird. FileWrite($hFileOpen, $sString) ; Hier wird schließlich die Zieldatei, die wir zuvor mit FileOpen geöffnet haben beschrieben. ; Daher steht als erster Parameter nicht der Dateipfad, sondern das Filehandle von FileOpen. FileClose($hFileOpen) ; Hat man eine Datei mit FileOpen geöffnet/erstellt, muss dieser Zugriff mit FileClose wieder beendet werden. EndFunc ;==>_Example
Viel Erfolg.
-
Hallo @AutoItler,
ich habe mal nach weiteren Beiträgen im Forum von Dir gesucht und habe feststellen müssen, dass die meisten davon genauso "gewinnbringend" waren wie Deine Kommentare zu meinem Thema.
Ich gelobe Besserung. Tatsächlich will ich gleich meine Quote etwas aufbessern. Leider nicht hier bei dir..
Ich bin nicht der Meinung, dass du dir irgendetwas einbildest. Du wirst schon Herr deiner Sinne sein und ein Icon sehen, dass da nicht hingehört. Dann schreibst du ein Skript, dass F5 drückt und Windows aktualisiert die Anzeige. Das gefällt dir nicht und du schreibst, es gäbe ein "ScreenUpdating"-Problem unter AutoIt (nicht AutoIT). Das ist nicht der Fall. Das Skript funktioniert perfekt. Es emuliert den Tastendruck F5.
In Beitrag 6 hatte ich Vorschläge gemacht. Die mögen nichts gebracht haben. Allerdings weiß ich gar nicht, ob du sie jemals ausprobiert hast. Denn von dir habe ich nur gelesen, dass du sie hier schriftlich ignoriert hast..
Das finde ich auch nicht gut.Wenn du magst, werde ich dich in Zukunft ignorieren, obwohl ich es von mir aus noch nicht notwendig finde. Ich denke eben, dass in erster Linie du etwas in den falschen Hals bekommen hast, denn ich habe wie geschrieben nicht behauptet, es gäbe das Phänomen nicht.
@Bitnugger
Vielen Dank für deine Inschutznahme und warmen Worte. Das weiß ich zu schätzen. -
Problem "ScreenUpdating" unter AutoIT
Es gibt dieses Problem nicht. Daher hat kein anderer damit Probleme. Danke fürs gelöst setzen.
-
Hallo @Oscar,
eben konnte ich die v1.3.2 spielen. Ich finde es perfekt. Optisch alles super, auch das Kontextmenü. Rundum gelungen - auch die Schwierigkeitsgrade. Vielen Dank für das Spiel -
Hallo @NO1 :-),
Du rufst die Funktion in Schleife auf und gibst als Parameter $iBtnState mit. In der Funktion wertest du das als $iState aus. Das macht deine Prüfung $iState 1 oder 0 ist natürlich sinnlos. Beim Aufruf der Funktion ist $iState immer 0.
Ersetze $iBtnState = 0 durch $iState = 0 (globale Variable) und lass $iBtnState und auch $iState als Funktionsparameter weg. Dann müsste auch deine Abfrage funktionieren.
AutoItLocal $iBtnState = 0 ... _CheckHoverButton($idBtn, $iBtnState, $hGraphics, "Test", "Arial", 18, 128, 34, 105, 30, 90, 30)
Edit: Wenn du die Variable nur in dieser Funktion auswerten musst, kannst du statt einer globalen Variable $iState auch in der Funktion (vllt. erste Zeile) die Variable local zu deklarieren: Local Static $iState = 0
-
Hallo @AutoItler,
Bildschirmaktualisierung
Du aktualisierst nicht den Bildschirm, sondern den Desktop oder die Ordneranzeige in Windows, wenn du F5 drückst. Da nutzt du eine Windows-Funktion, die eben so arbeitet, wie sie es tut. Wie soll man das manipulieren? Höchstens verstecken. Vorher einen Screenshot machen als GUI anzeigen bis die Aktualisierung fertig ist und wieder ausblenden.
Ne im Ernst.Leider ist das Löschen des Icons keine Option. Weder mit Markieren und Entfernen noch mit rechte Maustaste -> Löschen (wird gar nicht angeboten) noch auf eine andere mir bekannte Weise
Ich hatte eher an FileDelete gedacht.. Wirft die Funktion einen Fehler aus?
Alternativ verstecken? Kannst du die Datei vllt. mit FileSetAttrib verstecken ("S" = SYSTEM , "H" = HIDDEN). Vielleicht kommt die Datei dann gar nicht erneut, weil sie da ist - nur dass du sie nicht sehen musst.. -
Hey @Oscar,
super Update! Vielen Dank dafür- Treffer werden zu hundert Prozent korrekt verarbeitet!
- Der Import von Listen klappt nun perfekt. Doppelte Einträge gibt es nicht mehr und vorhandene Einträge werden richtig einsortiert!Mir ist aufgefallen, dass das Fadenkreuz bei mir sehr stark bei Bewegung flackert. Aber das kann ich ignorieren. Die oben erwähnten funktionalen Korrekturen waren für mich wichtig. Das Spiel macht echt Spaß! Ab morgen ist das Spiel im Firmen-Einsatz.
Spoiler anzeigen
Vor dem Import:VorImport.png
Nach dem Import:
NachImport.pngund hier noch ein Bild davon wie hart der Genauigkeitsfaktor zuschlägt
Beim nächsten Spiel wollte ich mal sehen, was geht und habe etwas wilder geklickt. Dadurch habe ich deutlich mehr getroffen, aber auch viel daneben geklickt:
SpielNachImport.png
Mal eben über 4000 Punkte verloren. Das erzieht zu akkuratem Klickverhalten