--VB0 --OZ1 11 topaz.font --OZ2 18 Bocklin.font --OZ3 27 bocklin.font --DF titelb --FF31 --ZS2 --SA0 --PA --SA1 --ZS0 --FF21 DEFEND --DF titelc --FF31 --ZS1 --SA0 --PA --SA1 --ZS0 --FF21 DEFEND --DF titelchen --FF31 --ZS0 --PA --ZS0 --FF21 DEFEND --DF climode --FF00 --PA --FF21 DEFEND --FF31 --ZS3 --SA0 3.4 Turniermodus --SA1 --ZS0 --FF21 --titelb 3.4.1 Einleitung Ab Version 2.00a bietet CoreWars einen Turnierinterpreter. Durch diesen Programmteil wird ein automatisierter Ablauf mehrerer Kämpfe zwischen beliebigen Redcode Programmen ermöglicht. In einer einfach zu verstehenden Kommandosprache wird mit einem Editor eine Turnierdatei erstellt, die eine Liste der am Turnier teilnehmenden Programme und weitere Angaben zum Verlauf der Kämpfe enthält. Mit Hilfe des Turnierinterpreters wird die Turnierdatei dann eingelesen und die nötigen Kämpfe werden ausgeführt, das Resultat schliesslich besteht aus einer Rangliste aller teilnehmenden Programme mit den erreichten Punktezahlen. Mit dem Interpreter können schnell und komfortabel auch grosse Turniere zwischen vielen Redcode Programmen ausgetragen werden. Weil während einem Turnier ausser der Turnierdatei keine Eingaben nötig sind, kann dies ohne Aufsicht (ev. über Nacht) geschehen. In der folgenden Beschreibung des Turniermodus werden zur Definition der Sprache der Turnierdateien sogenannte EBNF-Produktionen (Erweiterter Backus-Naur Formalismus). verwendet, wie sie in [8] ab Seite 10 beschrieben sind. Die folgenden Zeichen sind Metasymbole des EBNF und besitzen besondere Bedeutung: {a} - Das Symbol a innerhalb der geschweiften Klammern kann beliebig oft hintereinander wiederholt werden, inklusive Null Mal. [a] - Das Symbol a innerhalb der eckigen Klammern kann genau einmal oder gar nicht verwendet werden. a|b - Es muss entweder das Symbol a links oder das Symbol b rechts des vertikalen Striches verwendet werden. a:=b - Dem Namen a wird die auf der rechten Seite stehende Produktion b zugewiesen. a. - Der Punkt schliesst die Produktion a ab. Zeichen oder Wörter zwischen Anführungszeichen bedeuten Schlüsselwörter, die genau so in der Turnierdatei geschrieben werden müssen. Die Namen der Produktionen sind für die Turnierdatei nicht relevant, wichtig sind nur die Schlüsselwörter und die Reihenfolge der in den Produktionen definierten Symbole. Mit runden klammern kann die Priorität oder Zusammengehörigkeit einer Gruppe von Symbolen herausgestellt werden. Ein Beispiel dazu: --climode Befehl := (`PRINT'|`END') {Zeichenkette} Dem Namen `Befehl' wird die Produktion auf der rechten Seite zugeordnet: Zuerst muss eines der Schlüsselwörter `PRINT' oder `END' verwendet werden, anschliessend können beliebig viele Zeichenketten folgen. `Zeichenkette' ist kein Schlüsselwort, sondern ein Name und weist somit auf eine weitere, separat zu definierende Produktion hin. --titelb 3.4.2 Bedienung/Menüfunktionen Eine Turnierdatei wird mit einem beliebigen Editor erstellt, z. B. kann dazu der Redcode Editor von CoreWars verwendet werden. Nach dem Abspeichern der Turnierdatei wird diese aus dem Hauptprogramm von CoreWars mit Hilfe eines Turniermenüs gestartet und ausgeführt. Ausser dem Auswählen einer Turnierdatei können mit dem Turniermenü weitere Aktionen wie das Kopieren aller Ausgaben in eine Datei oder das Einschalten des Druckers vollzogen werden. Im Folgenden Abschnitt werden alle neuen Menüfunktionen beschrieben (der Aufbau der Turnierdatei folgt später). --titelchen Turnier starten: H-401 In einer Dateiauswahlbox kann eine Turnierdatei ausgewählt werden, die dann eingelesen und ausgeführt wird. Während der Ausführung hat nur die Menüfunktion `Turnier stoppen: H-402' eine unmittelbare Wirkung. --titelchen Turnier stoppen: H-402 Hält ein laufendes Turnier an. Auf dem Bildschirm wird eine entsprechende Meldung ausgedruckt, unvollständige Ranglisten werden nicht ausgegeben. --titelchen Fehlergrenze: H-403 In einer Dialogbox kann die Anzahl der Fehler eingegeben werden, nach denen die Ausführung einer Turnierdatei automatisch abgebrochen wird. Der voreingestellte Wert ist Abbruch nach fünf Fehlern, der eingegebene Wert kann in der Konfigurationsdatei gesichert werden. --titelchen Protokoll: H-404 Alle Ausgaben in das Standardausgabefenster werden zusätzlich in eine Datei kopiert. Der Da-tei-name wird mit einer Dateiauswahlbox eingegeben, wobei es egal ist, ob die Datei bereits existiert oder nicht. Im Gegensatz zu den mit dem `LOG'-Befehl gewählten lokalen Protokolldateien wird hier eine globale Protokolldatei bestimmt, in die jede Bildschirmausgabe (inkl. Fehlermeldungen) kopiert wird. Eine Protokolldatei muss vor jedem Turnier neu gewählt werden, auch wenn das vorhergehende Turnier mit einem Fehler oder vom Benützer abgebrochen wurde. --titelchen Drucker: H-405 Alle Ausgaben in das Standardausgabefenster werden zusätzlich ausgedruckt. Der Drucker wird als Gerät mit dem Namen `PRT:' angesprochen, die Druckerparameter werden aus den Preferences geholt. Ein zweites Anwählen dieser Funktion oder das Ausführen eines zweiten Turnieres (auch abgebrochen) schaltet den Drucker wieder aus. --titelchen Wecker: H-406 Schaltet einen Piepston ein, der nach der Ausführung einer Turnierdatei ertönt. Ein zweites Anwählen dieser Funktion schaltet den Ton wieder aus. Unabhängig vom Zustand des Tones wird nach jedem Turnier ein Bildschirmblitz erzeugt, sofern dieser nicht mit den Kommandozeilenoptionen ausgeschaltet wurde (siehe `Optionen'). --titelchen Turnier prüfen: H-407 Um nicht unliebsame Ueberraschungen während der Ausführung eines langen Turniers zu erleben, wurde diese Funktion eingeführt. Nach dem Aufruf kann über eine Dateiauswahlbox der Name einer Turnierdatei eingegeben werden. Diese Datei wird dann auf Syntaxfehler überprüft. Ausserdem wird sichergestellt, dass alle in der Turnierdatei angegebenen Kampfprogramme auch tatsächlich existieren. Es lohnt sich, vor dem Starten eines Turnier noch rasch die Turnierdatei durchzuchecken. --titelb 3.4.3 Turnierdatei Der Turnierinterpreter ist ein Programmteil, der eine Turnierdatei einliest und verarbeitet. Während dem Einlesen und der Verarbeitung werden Fehlermeldungen und Nachrichten zum Verlauf des Turniers auf dem Standardausgabefenster von CoreWars ausgegeben. Wahlweise können diese Texte auch ausgedruckt oder in eine Datei kopiert werden. Die Liste der Programme wird dem Turnierinterpreter in einer Turnierdatei übergeben. Sie enthält die Befehle der Kommandosprache, mit denen auf die teilnehmenden Programme verwiesen wird oder die bestimmte Aktionen während dem Turnier bewirken. Die vollständige Liste aller Befehle befindet sich weiter unten. Befehle und Schlüsselwörter sind in allen folgenden Beispielen mit Grossbuchstaben geschrieben. Der Interpreter selbst unterscheidet jedoch bei Befehlen und Schlüsselwörtern nicht zwischen Gross- und Kleinschreibung. In der Turnierdatei können an beinahe jeder Stelle Kommentare eingefügt werden. Ein Kommentar wird durch eines der Zeichen `#' (Doppelkreuz) oder `;' (Semikolon) begonnen und dauert dann bis zum Ende der Textzeile. Kommentare können überall begonnen werden, nur nicht innerhalb einer Zeichenkette (siehe Definition weiter unten). Bei einigen der folgenden Beispiele für Turnierdateien werden Kommentare zur Erläuterung von Befehlen verwendet. --titelc 3.4.3.1 Aufbau der Turnierdatei Alle teilnehmenden Programme werden in Gruppen zusammengefasst. Jede Gruppe muss einzigartig sein und erhält zu diesem Zweck einen Namen, der nur einmal in einer Turnierdatei einer Gruppe zugewiesen werden darf. Eine Turnierdatei darf beliebig viele Gruppen enthalten, von denen jede wiederum beliebig viele Gruppen enthalten kann, und so weiter. Die Syntaxdefinition für eine Turnierdatei lautet: --SA0 Turnier := {Gruppendefinition}. --SA1 Innerhalb einer Gruppe kämpft jedes Programm gegen jedes und erhält nach jedem Kampf eine im Voraus bestimmte Anzahl Punkte für einen Sieg, eine Niederlage oder ein Unentschieden. Jede Gruppe kann beliebig viele Namen von Redcode Programmen, Querverweise auf andere (aussenstehende) Gruppen und vollständige weitere Gruppen (Untergruppen) enthalten. Obwohl es sich bei den drei eben erwähnten Namen `Programm', `Querverweis' und `Untergruppe' scheinbar um verschiedene Objekte handelt, repräsentieren sie trotzdem immer dasselbe: Eine bestimmte Menge von Programmen. Eine Gruppe wird durch die `GROUP'-`ENDGROUP' Konstruktion definiert. Der Name der Gruppe (`Identifikation') steht unmittelbar nach dem `GROUP' Befehl und wird mit einem Doppelpunkt abgeschlossen. Danach folgen Programme, Querverweise und Untergruppen in beliebiger Reihenfolge und schliesslich ein Block mit Befehlen, die sich auf die Art der Kämpfe und die Umgebung von CoreWars auswirken (`Umgebung'). Die Syntaxdefinition für eine Gruppe lautet: --SA0 Gruppendefinition := `GROUP' Identifikation `:' {Programm | Querverweis | Gruppendefinition | Umgebung} `ENDGROUP'. --SA1 Der Name einer Gruppe (`Identifikation') muss mit einem Buchstaben beginnen und darf nur Buchstaben und Ziffern enthalten. Die Gross- und Kleinschreibung wird im Gegensatz zu Befehlen und Schlüsselwörtern unterschieden. Die Syntaxdefinition für eine Identifikation lautet: --SA0 Identifikation := Buchstabe {Buchstabe | Ziffer}. Buchstabe := (`A'...`Z')|(`a'...`z'). Ziffer := `0'...`9'. --SA1 Mit den bisher gezeigten Elementen können bereits Gruppen definiert werden. Hier sind einige Beispiele für korrekt definierte Gruppen: --FF00 GROUP Martini: ENDGROUP GROUP X287: ENDGROUP --FF21 und diese hier sind nicht korrekt definiert: --FF00 GROUP Martini ENDGROUP # Doppelpunkt fehlt GROUP 287: ENDGROUP # Ziffer als erstes Zeichen --FF21 Eine Gruppe kann, wie erwähnt, Programmnamen, Querverweise auf andere Gruppen und vollständige Gruppen enthalten. Die Syntaxdefinition der Gruppe wurde bereits gezeigt, es folgt jetzt die Definition eines Programmnamens (`Programm'): --SA0 Programm := Zeichenkette. Zeichenkette := `<'{Buchstabe | Ziffer | Sonderzeichen | Fluchtsequenz}`>'. Sonderzeichen := ($00..$2F) | ($3A..$40) | ($5B) | ($5D..$60) |($7B..$7E) | ($7F..$FF'). Fluchtsequenz := `\'(Buchstabe | Ziffer | Sonderzeichen`\'). --SA1 Im Gegensatz zur Identifikation kann ein Programmname (nach obiger Definition eine Zeichenkette) also den gesamten Zeichensatz enthalten, die nicht druckbaren Zeichen eingeschlossen. Eine Zeichenkette wird mit `>' (grösser als) oder durch das Zeilenende (`CR', Carriage Return, Wagenrücklauf) abgeschlossen, wobei der Interpreter im zweiten Fall eine Fehlermeldung anzeigt: `Unbeendete Zeichenkette' (Fehler Nr 3). Um diese beiden Zeichen trotzdem in eine Zeichenkette aufzunehmen, wird eine Fluchtsequenz benötigt, die die Sonderfunktion der Zeichen aufhebt. Eine Fluchtsequenz wird mit `\' (umgekehrter Schrägstrich, Backslash) eingeleitet und enthält eines oder mehrere Zeichen, die nach folgenden Regeln in ein einzelnes Zeichen umgewandelt werden: a) Wenn das nächste Zeichen nach `\' eine Ziffer ist, werden diese und bis zu zwei weitere Ziffern als Zahl zur Basis acht (Oktalsystem) interpretiert und ergeben so den Wert des erzeugten Zeichens. Nach dem `\' werden maxi- mal drei Ziffern berücksichtigt. b) Wenn das nächste Zeichen nach `\' einer der nachstehenden Buchstaben ist, wird anstelle der Fluchtsequenz das rechts daneben angegebene Zeichen er- zeugt: `n' Zeilenende: $0A (10) `t' Horizontaler Tabulator: $09 (9) `v' Vertikaler Tabulator: $0B (11) `b' Letztes Zeichen löschen: $08 (8) `r' Wagenrücklauf: $0D (13) `f' Seitenvorschub: $0C (12) `a' Glocke: $07 (7) c) Wenn das nächste Zeichen nach `\' ein Zeichen mit einer Sonderfunktion ist, wird das entsprechende Zeichen ohne seine Sonderfunktion übernommen. d) Bei allen anderen Zeichen wird das entsprechende Zeichen übernommen. Sinnvolle Fluchtsequenzen sind z. B. `\>' oder `\\', was ein einzelnes `>' bzw. `\' ergibt. Wenn ein `\'-Zeichen am Ende einer Zeile steht, wird das folgende `CR' (Zeilenende) ohne Fehlermeldung in die Zeichenkette übernommen. Die Namen der Programme einer Gruppe werden in spitzen Klammern eingefasst und in der Gruppendefinition hintereinander aufgeführt. Die Reihenfolge der Programme spielt keine Rolle, weil innerhalb einer Gruppe jedes Programm gegen jedes kämpft. Eine vollständige Gruppe mit mehreren Programmen sieht so aus: --FF00 GROUP Cointreau: ENDGROUP --FF21 Es ist unwichtig, ob und wie die Programmnamen eingerückt werden. Massgebend sind alleine die Reihenfolge der Befehls- und Schlüsselwörter und die Namen der Programme. Mehrere Zwischenräume ausserhalb der Programmnamen werden überlesen, jedes Formatieren einer Turnierdatei dient lediglich der besseren Lesbarkeit und der Uebersichtlichkeit. --titelchen Untergruppen Für einfache Anwendungen genügen die bis jetzt bekannten Befehle `GROUP' und `ENDGROUP' sowie die Programmnamen. Wenn jedoch viele Programme an einem Turnier teilnehmen sollen, treten die Grenzen einer einzelnen Gruppe schnell hervor. Für n Programme benötigt ein Turnier `Jeder gegen Jeden' n tief 2 Entscheidungen, bei einem Turnier zwischen n=30 Programmen sind deshalb bereits 435 Entscheidungen nötig. Für eine Entscheidung werden drei Einzelkämpfe ausgetragen (Standardeinstellung), was schliesslich insgesamt 1305 Kämpfe ergibt. CoreWars benötigt in der Version 2.00a für einen einzelnen Kampf mit 20000 Zyklen ohne Grafikanzeige etwa 25 Sekunden, für das gesamte Turnier müsste der Amiga demnach etwa neun Stunden laufen, sofern jeder Kampf über die volle Distanz von 20000 Zyklen geht. Die Rechenzeit kann drastisch verkürzt werden, wenn nach dem Cupsystem (z. B. Tennis, Fussball) gekämpft wird. Dabei werden jeweils mehrere Programme willkürlich zu Gruppen zusammengefasst, innerhalb denen dann Jedes gegen Jedes kämpft. Aus jeder Gruppe geht eine bestimmte Anzahl Programme hervor, von denen dann wiederum Jedes gegen Jedes kämpft. Die Verschachtelung der Gruppen kann beliebig tief sein, was ein Turnier auch zwischen sehr vielen Programmen innerhalb einer angemessenen Zeit ermöglicht. Es folgt ein Beispiel für ein Turnier zwischen zwölf Programmen, die nach einer Art Cupsystem kämpfen. Jede Untergruppe bringt einen Sieger hervor (Standardeinstellung), die Sieger aller Untergruppen steigen in die nächste Gruppe auf. Für das ganze Turnier werden 18 Entscheidungen (54 Kämpfe, ca. 22 Minuten) benötigt, im Gegensatz dazu stehen 66 Entscheidungen (196 Kämpfe, ca. 80 Minuten) bei einem Turnier mit allen Teilnehmern in einer einzigen Gruppe. --FF00 GROUP Sieger: GROUP FourRoses: ENDGROUP GROUP Pastis: ENDGROUP GROUP Wermouth: ENDGROUP GROUP Campari: ENDGROUP ENDGROUP --FF21 --titelchen Querverweise Ein weiteres Werkzeug, um die Rechenzeit für ein Turnier zu verkürzen, ist der Querverweis. Innerhalb einer Gruppe können Querverweise auf andere, aussenstehende Gruppen gemacht werden. Der oder die Gewinner der Gruppen, auf die verwiesen wird, werden anstelle des Querverweises in die eigene Gruppe aufgenommen. Der Vorteil der Querverweise zeigt sich, wenn der Gewinner einer Gruppe gegen den Gewinner mehrerer anderer Gruppen antreten soll: Anstatt eine Gruppe mehrmals in anderen Gruppen zu definieren (und zu berechnen) muss sie nur das erste Mal definiert werden und erscheint dann in den übrigen Gruppen als Querverweis. Die Syntaxdefinition eines Querverweises ist: --SA0 Querverweis := Identifikation`:'. --SA1 Das Symbol `Identifikation' steht für den Namen einer in dieser Turnierdatei definierten Gruppe, wobei es egal ist, ob die Gruppe vor oder nach dem Querverweis definiert wurde. Ein Querverweis kann auf eine beliebige Gruppe zeigen, auch wenn diese eine Untergruppe innerhalb einer äusseren Gruppe ist. Als Beispiel für die Bedeutung des Querverweises stehen die zwei Lösungen des folgenden Problems: Der Sieger eines Turniers zwischen drei Redcode Programmen soll in zwei weiteren Turnieren als normaler Teilnehmer mitspielen. Die Turnierdatei ohne Querverweise könnte so aussehen: --FF00 GROUP Amaretto: GROUP GrandMarnier1: ENDGROUP ENDGROUP GROUP Tequila: GROUP GrandMarnier2: ENDGROUP ENDGROUP --FF21 Einer von zwei Nachteilen ist offensichtlich: Die Gruppen `GrandMarnier1' und `GrandMarnier2' werden mit identischem Inhalt definiert und demnach auch zwei Mal berechnet, obwohl die teilnehmenden Programme dieselben sind. Der zweite Nachteil ist, dass aus den beiden `GrandMarnier'-Turnieren nicht zwangsläufig ein einziger Sieger hervorgeht. Wenn das erste Mal `Mice' gewinnt, kann beim zweiten Mal `Killer' gewinnen, was nicht das gewünschte Resultat ergibt. Die obige Turnierdatei mit Querverweisen versehen beseitigt diese Mängel und sieht so aus: --FF00 GROUP Amaretto: GROUP GrandMarnier: ENDGROUP ENDGROUP GROUP Tequila: GrandMarnier: # Querverweis ENDGROUP --FF21 In der Gruppe `Tequila' befindet sich ein Querverweis auf die Gruppe `GrandMarnier', die in der ersten Gruppe `Amaretto' definiert wurde. Der Sieger aus `GrandMarnier' tritt jetzt als Teilnehmer sowohl in `Amaretto' als auch in `Tequila' auf. Während bei der ersten Version der Turnierdatei insgesamt 12 Entscheidungen (36 Kämpfe, ca. 15 Minuten) anfallen, werden in der zweiten Version nur 9 Entscheidungen (27 Kämpfe, weniger als 11 Minuten) benötigt. --titelchen Einstellungen Mit verschiedenen Einstellungen, die mit Hilfe von Befehlen und Schlüsselwörtern in der Turnierdatei getätigt werden, kann der Verlauf eines Turniers in weiten Grenzen beeinflusst werden. Alle Einstellungen müssen innerhalb einer Gruppe erfolgen und sind nur in dieser Gruppe gültig. Wenn mit einem Querverweis eine fremde Gruppe in eine Gruppe eingebunden wird, gelten die Einstellungen der eigenen Gruppe. Die Konstruktion von Einstellungen geschieht mit den Befehlen `USE' und `ENDUSE', deren Syntaxdefinition wie folgt lautet (`Umgebung'): --SA0 Umgebung := `USE' {Grafik | Kampfmodus | Protokoll | Entscheidung | Sieger | Anzeige | Nachricht | Gewinner | Verlierer | Unentschieden} `ENDUSE'. Grafik := `GRAPH' `=' (`NONE' | `STATUS' | `MAP' | `TRACE'). Kampfmodus := `MODE' `=' `EACH'. Protokoll := `LOG' `=' Zeichenkette. Entscheidung := `FIGHT' `=' Zahl. Sieger := `MOVE' `=' Zahl. Anzeige := `VIEW' `='(`RANK' | `LIST' | `READ'). Nachricht := `PRINT' Zeichenkette. Gewinner := `WINNER' `=' Zahl. Verlierer := `LOOSER' `=' Zahl. Unentschieden := `EQUAL' `=' Zahl. Zahl := [`+' | `-'] {Ziffer}. --SA1 Die Position von `USE'-`ENDUSE' innerhalb einer Gruppe ist unwichtig, es ist auch möglich, mehrere `USE'-`ENDUSE' Konstruktionen in einer Gruppe zu verwenden. Wird ein und derselbe Befehl in einer Gruppe mehrmals verwendet, so ist das letzte Auftreten des Befehls für die Einstellung massgebend (Ausnahme: `GRAPH', `View' und `PRINT', siehe unten). Das Formatieren der Einstellungen dient wie bei `GROUP'-`ENDGROUP' nur der Uebersichtlichkeit. Es folgt eine kurze Beschreibung jedes Befehls und seiner Schlüsselwörter bzw. Argumente mit jeweils einem Beispiel zur Anwendung des Befehls und mit der Standardeinstellung, die ohne Verwendung des Befehls wirksam ist. --titelchen GRAPH Bestimmt die Anzeige, die während eines Kampfes zwischen zwei Programmen dieser Gruppe aktiv ist. Mit den Schlüsselwörtern `NONE', `STATUS', `MAP' und `TRACE' wird keine, die Status-, die Grafik- oder die Einzelschrittanzeige aktiviert. Mehrere `GRAPH' Befehle können gemischt werden, um mehrere Anzeigen gleichzeitig zu verwenden. Wenn nur die Grafikanzeige (`MAP') eingeschaltet ist, wird automatisch die schnelle Version der grafischen Darstellung gewählt. Standardeinstellung: Keine Anzeige (`NONE'). Beispiel: Einschalten der Status- und der Grafikanzeige. --FF00 USE GRAPH = STATUS GRAPH = MAP ENDUSE --FF21 --titelchen MODE Wählt den Modus, in dem die Programme dieser Gruppe gegeneinander kämpfen. In der Version 2.00a gibt es nur den Modus `EACH', bei dem jedes Programm gegen jedes antritt, was auch die Standardeinstellung ist. Es ist möglich, dass in späteren Versionen weitere Kampfmodi dazukommen werden. Zur Zeit ist der `MODE' Befehl zwar bekannt, bleibt aber ohne Wirkung. --titelchen LOG Bestimmt eine Datei, in die das Kampfprotokoll (Rangliste, Liste der Teilnehmer, Kampfliste u.s.w.) kopiert wird. Pro Gruppe ist nur eine Protokolldatei möglich, es gilt daher immer der zuletzt aufgetretene `LOG' Befehl in einer Gruppe. Die Art des Kampfprotokolles kann mit dem Befehl `View' gesteuert werden, siehe unten. Als Datei kann jeder AmigaDOS Pfadname verwendet werden, also auch `PRT:' (ausdrucken) oder `CON:' (CLI-Fenster). Standardeinstellung: Kampfprotokoll nur im Hauptbildschirm von CoreWars, keine Datei vorgesehen. Beispiel: Das Kampfprotokoll der Gruppe soll in die RAM-Disk unter dem Namen `Log-1' kopiert werden. --FF00 USE LOG = ENDUSE --FF21 --titelchen WINNER, LOOSER, EQUAL Die drei Befehle bestimmen die Anzahl Punkte, die der Gewinner (`WINNER') und der Verlierer (`LOOSER') einer Entscheidung erhält. Bei einem Unentschieden wird jedem Programm die durch `EQUAL' bestimmte Anzahl Punkte gutgeschrieben. Negative Werte für `WINNER', `LOOSER' und `EQUAL' sind nicht erlaubt. Standardeinstellungen: `WINNER=2', `LOOSER=0' und `EQUAL=1'. Demnach erhält der Gewinner einer Entscheidung zwei und der Verlierer Null Punkte. Für ein Unentschieden erhält jede Partei einen Punkt. Beispiel: Der Gewinner soll vier Punkte, der Verlierer einen Punkt erhalten. --FF00 USE WINNER = 4 LOOSER = 1 # Wert für Unentschieden bleibt gleich ENDUSE --FF21 --titelchen FIGHT Bestimmt die Anzahl der Einzelkämpfe, die für eine Entscheidung zwischen zwei Redcode Programmen ausgeführt werden. Gewinner der Entscheidung wird das Programm, dass die Mehrzahl der Einzelkämpfe für sich entscheiden kann. Für eine Entscheidung muss mindestens ein Einzelkampf stattfinden, Null oder negative Werte sind nicht erlaubt. Standardeinstellung: Drei Kämpfe für eine Entscheidung (`FIGHT=3'). Beispiel: Pro Entscheidung soll nur ein Kampf stattfinden. --FF00 USE FIGHT = 1 ENDUSE --FF21 --titelchen MOVE Bestimmt die Anzahl der Programme, die aus einer Gruppe in die Nächste aufsteigen. Die nicht aufsteigenden Programme scheiden aus und können keine weiteren Punkte mehr erringen. In jeder Gruppe muss mindestens ein Programm aufsteigen, Null als Argument ist nicht erlaubt. Mit einem negativen Wert als Argument steigen immer alle Programme der Gruppe auf. Standardeinstellung: Aus jeder Gruppe steigt ein Programm auf (`MOVE=1'). Beispiel: Aus einer Gruppe sollen die drei besten Programme aufsteigen. --FF00 USE MOVE = 3 ENDUSE --FF21 --titelchen VIEW Beeinflusst die Art des ausgegebenen Protokolls (siehe auch `LOG'). Es gibt drei verschiedene Protokollteile: Die Rangliste, die Teilnehmerliste und die Kampfliste, die mit den Schlüsselwörtern `RANK', `READ' und `LIST' eingeschaltet bzw. mit dem Schlüsselwort `NONE' ausgeschaltet werden. `Rangliste:' Für jede Gruppe wird eine eigene Rangliste ausgegeben. `Teilnehmerliste:' Die Namen aller Programme werden vor dem ersten Kampf gruppenweise ausgegeben. `Kampfliste:' Bei jeder Entscheidung werden die beiden Programmnamen und die dabei errungenen Punkte sowie die neuen Punktesummen ausgegeben. Die drei Protokollteile können einzeln eingeschaltet werden, indem mehrere `View' Befehle in einer Gruppe verwendet werden. Standardeinstellung: Rangliste für jede Gruppe ist eingeschaltet (`View'=RANK'). Beispiel: Die Teilnehmerliste sowie die Kampfliste sollen ein- und die Rangliste ausgeschaltet werden. --FF00 USE VIEW = NONE # Alles ausschalten VIEW = READ # Teilnehmerliste einschalten VIEW = LIST # Kampfliste einschalten ENDUSE --FF21 --titelchen PRINT Gibt vor dem ersten Kampf eines Programmes dieser Gruppe die dem `PRINT'-Befehl folgende Meldung aus. Wenn in einer Gruppe mehrere `PRINT'-Befehle verwendet werden, erscheinen beim ersten Kampf alle Meldungen in der Reihenfolge ihrer `PRINT'-Befehle. Wenn mit dem `LOG'-Befehl eine Protokolldatei gewählt wurde, werden die `PRINT' Meldungen auch in diese Datei kopiert. Standardeinstellung: Keine Meldung. Beispiel: Für eine Gruppe soll vor dem ersten Kampf eine dreizeilige Meldung ausgegeben werden. --FF00 USE PRINT PRINT < - Knirps.prg> PRINT < - Redcode.prg> ENDUSE --FF21 --titelc 3.4.3.2 Zusammenfassung --titelchen Zeichenkette Innerhalb von Zeichenketten können alle Zeichen vorkommen. Besondere Bedeutung besitzen lediglich `\', `>' und `CR' (Zeilenende). Mit `\' wird die Sonderfunktion der drei genannten Zeichen aufgehoben: `\\' wird zu `\', `\>' wird zu `>' und `\ CR' wird zu `CR'. Ferner kann nach `\' eine Zahl zur Basis Acht angegeben werden, deren Wert als einzelnes Zeichen über- nommen wird. Ohne das Fluchtzeichen `\' schliessen `>' und `CR' eine Zeichen- kette ab, wobei eine mit `CR' beendete Zeichenkette eine Fehlermeldung verur- sacht. --titelchen Gruppe Alles, was zwischen `GROUP'-`ENDGROUP' eingeschlossen wird, gehört zu dieser Gruppe. Der Name der Gruppe heisst Identifikation, sie muss als erstes Wort nach `GROUP' stehen und mit `:' abgeschlossen werden. Eine Identifikation muss mit einem Buchstaben beginnen und darf nur Buchstaben und Zahlen enthalten. --titelchen Querverweis Er weist mit Hilfe der Identifikation auf eine andere Gruppe. Das oder die Programme, die aus dieser Gruppe als Sieger hervorgehen, werden in die Gruppe mit dem Querverweis übernommen. --titelchen Programm Eine Zeichenkette innerhalb einer Gruppe stellt ein Kampfprogramm dar. Der Inhalt der Zeichenkette wird als AmigaDOS Pfadname eines assemblierten Kampfprogrammes angesehen. --titelchen Einstellung Die Befehle Innerhalb eines `USE'-`ENDUSE' Blockes sind nur für die Gruppe gültig, in der sich der Einstellungsblock befindet. Auch wenn die Gruppe eine Untergruppe ist, gelten die Einstellungen nicht für die übergeordnete Gruppe. Einstellungsbefehle ausserhalb `USE'-`ENDUSE' werden nicht erkannt. --titelchen Kommentar Ein Kommentar wird mit `#' oder `;' eingeleitet und umfasst den ganzen Rest der Zeile bis zum Zeilenende. Die beiden Kommentarzeichen werden ausser in einer Zeichenkette überall erkannt, auch ausserhalb der Gruppen. --titelchen Interpretieren Der Turnierinterpreter liest eine Turnierdatei Zeichen für Zeichen ein. Mehrere Zeichen werden zu Wörtern zusammengefasst, die - vom Kontext abhän- gig - mit den möglichen Befehlen verglichen oder als Programmnamen angesehen werden. Zwischen den Wörtern dürfen beliebig viele Leerzeichen, Tabulatoren, Zeilenenden (`CR') und Kommentare vorkommen. --titelchen Befehlsliste - GROUP --> Beginnt eine Gruppe - ENDGROUP --> Beendet eine Gruppe - USE --> Beginnt einen Einstellungsblock - ENDUSE --> Beendet einen Einstellungsblock - GRAPH --> Wählt Grafikanzeige während Kampf - NONE --> Keine Anzeige (Standard) - STATUS --> Statusanzeige - MAP --> Grafikanzeige - TRACE --> Einzelschrittanzeige - MODE --> Kampfmodus - EACH --> Jeder gegen Jeden (Standard) - LOG --> Bestimmt eine Protokolldatei (Standard: Keine) - FIGHT --> Anzahl Einzelkämpfe pro Entscheidung (Standard: 3) - MOVE --> Anzahl Programme, die aufsteigen (Standard: 1) - WINNER --> Punkte für Gewinner einer Entscheidung (Standard: 2) - LOOSER --> Punkte für Verlierer einer Entscheidung (Standard: 0) - EQUAL --> Punkte bei Unentschieden (Standard: 1) - VIEW --> Bestimmt Art des Protokolls - LIST --> Ergebnis jeder Entscheidung wird angezeigt - READ --> Teilnehmerliste der Gruppe - RANK --> Rangliste der Gruppe (Standard) - NONE --> Kein besonderes Protokoll während Turnier - PRINT --> Ausgabe von Nachrichten (Standard: Keine) --titelc 3.4.3.3 Fehlermeldungen Beim Einlesen der Turnierdatei und während der Ausführung können verschiedene Fehler auftreten. Jeder Fehler inkrementiert einen internen Zähler, sobald der Zähler einen bestimmten Grenzwert erreicht, wird die Ausführung der Turnierdatei abgebrochen. Der Grenzwert kann in der Konfigurationsdatei voreingestellt und mit einer Menüfunktion verändert werden. Es gibt drei verschiedene Fehlermeldungen, die sich in ihrer Ausgabe unterscheiden: Ein normaler Fehler besteht aus der Fehlernummer und einer kurzen, einzeiligen Problembeschreibung. Bei einem Fehler in der Turnierdatei kommt die fragliche Zeile der Datei und die genaue Lokalisierung des Fehlers hinzu (Zeile, Spalte). Bei einem Fehler während dem Schreiben in oder Lesen aus einer Datei wird der vom Betriebssystem erhaltene Fehlercode angezeigt. Viele der folgenden Fehlermeldungen können in mehreren der drei Fehlerarten auftreten. Die meisten Fehler sind selbsterklärend; auf einige Meldungen, bei denen dies nicht zutrifft, wird am Ende der Liste näher eingegangen. Nr. 1: Kann Turnierdatei nicht zum Lesen öffnen. Nr. 2: Erwarte `GROUP'-Befehl. Nr. 3: Unbeendete Zeichenkette. Nr. 4: Turnier wegen Fehler Abgebrochen. Nr. 5: Unbekannter Befehl. Nr. 6: `USE' oder `GROUP' erwartet. Nr. 7: Identifikation fehlt. Nr. 8: Dateiende vor Turnierende. Nr. 9: Kein Speicher mehr. Nr.10: Erwarte einen Befehl. Nr.11: Dieser Befehl ist innerhalb `USE'-`ENDUSE' nicht möglich. Nr.12: Schlüsselwort für diesen Befehl nicht möglich. Nr.13: Unbekanntes Schlüsselwort. Nr.14: Syntaxfehler im `GRAPH' Befehl. Nr.15: Syntaxfehler im `MODE' Befehl. Nr.16: Syntaxfehler im `LOG' Befehl. Nr.17: Syntaxfehler im `FIGHT' Befehl. Nr.18: Syntaxfehler im `MOVE' Befehl. Nr.19: Erwarte eine Zahl. Nr.20: Erwarte einen Dateinamen. Nr.21: Querverweis auf unbekannte Gruppe. Nr.22: Laufzeitfehler während Kampf. Nr.23: Anzahl Kämpfe kleiner als Eins. Nr.24: Weiterkommende Programme kleiner als Eins. Nr.25: Kann Drucker nicht ansprechen. Nr.26: Globale Logdatei kann nicht geöffnet werden. Nr.27: Fehler beim Drucken. Nr.28: Fehler beim Schreiben in eine Datei. Nr.29: Lokale Logdatei kann nicht geöffnet werden. Nr.30: Erwarte eine Zeichenkette. Nr.31: Vorzeichen ohne nachfolgende Zahl. Nr.32: Unmögliche Punktezahl für Gewinner/Verlierer/Unentschieden. Nr.33: Syntaxfehler im `View' Befehl. Nr.34: Syntaxfehler im `WINNER', `LOOSER' oder `EQUAL' Befehl. Nr.35: Gruppe wurde bereits definiert. Nr.36: Turnier vom Benützer abgebrochen. --titelchen Fehler Nr. 21 * Querverweis auf unbekannte Gruppe. * Gruppennamen wurde in dieser Turnierdatei nicht definiert. * Während bei Befehlen und Schlüsselwörtern die Gross- und Kleinschreibung nicht unterschieden wird, muss bei den Gruppennamen (Identifikation) darauf geachtet werden, dass Querverweise eine exakte Abschrift des Gruppennamens enthalten. --titelchen Fehler Nr. 22 * Laufzeitfehler während Kampf. * Fehlermeldung von MARS. * Der `übliche' Laufzeitfehler wird durch ein unbekanntes Kampfprogramm hervorgerufen, weil die Pfadnamen der angegebenen Programme erst während den Einzelkämpfen selbst überprüft werden. --titelchen Fehler Nr. 35 * Gruppe wurde bereits definiert. * Ein Gruppenname wurde das zweite Mal definiert. * Die Meldung erfolgt, wenn zwei oder mehr Gruppen denselben Namen besitzen. Trotzdem wird die Gruppe eingelesen und die Turnierdatei ausgeführt, so- lange der interne Fehlerzähler nicht höher als der eingestellte Wert ist. Die Definition mehrerer Gruppen mit dem gleichen Namen wird bei Querverwei- sen problematisch: Wenn ein Querverweis auf einen mehrfach definierten Na- men zeigt, wird nur die erste mit diesem Namen versehene Gruppe verwendet.