Ich schreibe gerade einige Skripte für Bot Land . Bot Land ist ein Echtzeit-Strategiespiel, bei dem Sie anstelle der Steuerung Ihrer Einheiten mit Maus und Tastatur Code schreiben, um Ihre Bots über eine API zu steuern, und dann Ihre Bots gegen die Bots anderer kämpfen. Wenn Sie mit Einheiten in SC2 vertraut sind, können Sie Bots erstellen, die Blink-Stalkern, Belagerungspanzern, Medizinern und Ultralisken ähneln. (Es ist ein ziemlich lustiges Spiel für Softwareentwickler, aber das liegt außerhalb des Rahmens dieser Frage.)
Die Bot-Steuerung weist drei Ebenen zunehmender Komplexität auf: eine Standard-KI, eine Scratch- ähnliche Programmiersprache und einen reduzierten JavaScript-Satz namens BotLandScript. Obwohl der integrierte Editor für BotLandScript sinnvoll ist, müssen Sie Ihren gesamten Code als eine einzige Datei mit globalen Funktionen der obersten Ebene überall hochladen . Natürlich wird dies nach einer Weile schmerzhaft, wenn Ihr Code langsam wird und verschiedene Bots die gleichen Funktionen haben.
Um das Schreiben von Code für mehrere Bots zu vereinfachen, die Wahrscheinlichkeit unbeabsichtigter Fehler beim Codieren in Bare JS zu verringern und meine Chancen zu erhöhen, andere Spieler zu schlagen, habe ich das obige TypeScript-Projekt eingerichtet , um eine gemeinsame Bibliothek sowie Code für jeden meiner Bots bereitzustellen . Die aktuelle Verzeichnisstruktur sieht ungefähr so aus:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
ist der allgemeine Code, der von Bots gemeinsam genutzt wird und TypeScript-Definitionen für die Bot Land-API (ohne TS) enthält. Jeder Bot erhält dann einen eigenen Ordner, wobei eine Datei den Bot-Code und die andere ein Boilerplate enthält tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Wenn jeder erstellt tsconfig.json
wird, wird ein entsprechender bot.js
Code erstellt, der den vom Bot selbst transpilierten Code sowie den gesamten Code enthält common.js
. Dieses Setup ist unter anderem aus mehreren Gründen nicht optimal: Es erfordert viel doppeltes Boilerplate, erschwert das Hinzufügen neuer Bots, enthält viel unnötigen Code für jeden Bot und erfordert, dass jeder Bot separat erstellt wird.
Aufgrund meiner bisherigen Forschung scheint es jedoch nicht einfach zu sein, das zu tun, was ich will. Insbesondere die Verwendung der neuen tsc -b
Option und der neuen Referenzen funktioniert nicht, da hierfür der Code modularisiert werden muss und für Bot Land eine einzige Datei mit allen auf der obersten Ebene definierten Funktionen erforderlich ist.
Was ist der beste Weg, um so viele der folgenden Ziele wie möglich zu erreichen?
- Es ist keine neue Boilerplate erforderlich, um einen neuen Bot hinzuzufügen (z. B. keine
tsconfig.json
pro Bot). - Verwenden Sie diese Option
import
für allgemeine Funktionen, um die Ausgabe von nicht verwendetem Code zu vermeiden. - Geben Sie weiterhin alle Funktionen als eine einzige Datei im spezifischen Format von Bot Land aus
- Ein einzelner Erstellungsschritt, der mehrere Ausgabedateien erzeugt, eine für jeden Bot
- Bonus: Integration des Build-Prozesses in VS Code. Für die Erstellung
tasks.json
jedes Teilprojekts gibt es derzeit eine entsprechende Kesselplatte .
Ich vermute vage, dass die Antwort wahrscheinlich zusätzlich etwas wie Grunzen beinhaltet tsc
, aber ich weiß nicht genug darüber, um sicher zu sein.
quelle
<root>/MissileKite.ts
)bot.js
?tsconfig.json
. Transpilierte Bot-Dateien können beliebig benannt werden, vorzugsweise die .js-Version der Originaldatei. Ich habe es jetzt so in der Repo-Ausgabe an eingerichtetbuild/MissileKite.js
.tsconfig-gas.json
das Relevante dort zu sehen?Antworten:
Hier ist mein Versuch , Ihre Anforderungen zu beantworten.
Bemerkenswerte Dateien:
src/tsconfig-botland.json
Enthält Einstellungen für jedes bot.land- Skript (einschließlich Ihrer benutzerdefinierten Deklarationen, in die ich verschoben habetypes/bot-land/index.d.ts
). Sie können diestrict
Einstellungen ändern, die ich verwendet habe.src/tsconfig.json
enthält Verweise auf alle Ihre Bots. Dies ist die Datei, die bearbeitet werden muss, wenn Sie ein weiteres Bot-Skript hinzufügen möchtenEin Bot-Skript besteht aus mindestens zwei Dateien: einer minimalistischen
tsconfig.json
und einer oder mehreren.ts
Skriptdateien.Zum Beispiel
src/AggroMiner/tsconfig.json
:In den meisten Fällen sollten Sie Folgendes tun, um ein neues Bot-Skript zu starten:
src/AggroMiner
) in einen neuen Ordner untersrc
src/<newBotFolder>/tsconfig.json
, um dasoutFile
mit dem Namen Ihres Bots zu bearbeitensrc/tsconfig.json
und einen Verweis auf hinzufügensrc/<newBotFolder>
Das folgende
npm
/yarn
Skript wurde festgelegt:build
um alle Bots zu bauenbuild-clean
die denbuild
Ordner löschen, bevor abuild
format
um Prettier für alle.ts
Dateien unter auszuführensrc
lint
um eine tslint-Prüfung für alle Bot-Skripte durchzuführenLassen Sie jetzt Ihre Anforderungen herunter:
Um dies zu erreichen, müssten Sie ein Skript erstellen, das Ihren Bots-Ordner / Ihre Bots-Skripte auflistet ... und die entsprechenden pro Bot einrichten
tsconfig.json
und ausführentsc
. Sofern dies nicht unbedingt erforderlich ist, kann eine minimale Einrichtung (siehe oben) ausreichend sein.Beachten Sie zunächst , dass Sie, wenn Sie ein Modul
export
/ eineimport
Anweisung verwenden, zusätzliche Drittanbieter zum Packen / Treeshake benötigen, um eine einzelne Dateiausgabe zu erzielen. Soweit ich von Bot.land erfahren habe, werden Ihre Skripte auf dem Server ausgeführt. Wenn Deadcode keinen Einfluss auf Ihre Bot-Leistung hat, würde ich mich nicht wirklich darum kümmern.Erledigt.
Erledigt.
Die
npm
Skripte sollten in der Aufgabenliste von vsc erscheinen (zumindest in meiner), wodurch dastasks.json
Unnötige unnötig wird.quelle
types/bot-land
die Definitionen verwendet haben und warum Siestrict
Einstellungen gewählt haben?types
oder ob dies nur eine bestimmte Art der Organisation war, die Sie ausgewählt haben.Sie könnten tatsächlich Projektreferenzen verwenden. Befolgen Sie diese Schritte, um die gleichen Ergebnisse zu erzielen, die Sie für Ihre Originaldateien erhalten haben, wobei sich alle Funktionen auf der obersten Ebene in einer Datei befinden. Ich konnte jedoch keine Lösung finden, um nur benötigte Funktionen in Bots zu importieren. Das heißt, ohne Importe und Exporte zu verwenden.
In Ihrer tsconfig.json im Stammverzeichnis
Fügen Sie als Nächstes in Ihrem lib-Ordner eine solche tsconfig.json hinzu
Wir müssen einige Anpassungen in data.ts, motion.ts und utils.ts vornehmen, damit ts uns nicht mit Kompilierungsfehlern stört.
data.ts
Bewegung.ts
utils.ts
Als nächstes fügen wir base.json im Stammverzeichnis hinzu (die Datei tsconfig.json der Bots erweitert sie).
base.json
und die tsconfig.json der Bots (entsprechend den Bots anpassen)
Das ist es. Jetzt lauf einfach
quelle
build/MissileKite.js
, was ausgegeben wird, wenn Sie das ursprüngliche Repo erstellen.