4. Kapitel: Der Computer als Stratege

Ein beliebtes Test- und Übungfeld für die Methoden der künstlichen Intelligenz stellen nach wie vor die strategischen Spiele dar. Eine überschaubare Anzahl Spielfiguren, ein genau definierter Satz Regeln, so etwas mag der Computer, da er hier ungestört von den oft nicht kalkullerbaren Ereignissen der realen Welt sein Können beweisen kann.

Trotzdem werden in diesem Kindergarten der künstlichen Intelligenz bereits Anforderungen gestellt, die nicht von schlechten Eltern sind. Gefragt ist insbesondere

Keine Frage, daß Maschinen mit diesen Fähigkeiten nicht nur für den schachspielenden Computerfreak interessant sind; auch Militärs und Manager finden hier ein willkommenes Werkzeug, um sich noch effektiver gegenseitig zu bedrohen oder Geld abzuluchsen. Doch die traurige Tatsache, daß maschinelle Intelligenz, gepaart mit menschlicher Dummheit, eine absolut katastrophale Mischung ergeben kann, soll uns nicht daran hindern, in den nächsten Kapiteln des Software-Experiments einige der Grundlagen zu erforschen, die Computer in gewiefte Strategen verwandeln - im Vertrauen darauf, daß Sie, lieber Leser, zu intelligent sind, um die dabei gewonnenen Erkenntnisse im Rahmen eines ausgeklügelten Selbstmord-Systems einzusetzen.

Jedes der Spielprogramme, die in den nächsten Kapiteln zur Sprache kommen, demonstriert ein bestimmtes Arbeitsprinzip und wird dem Charakter des Software-Experiments entsprechend nicht nur als Spielpartner geeignet sein, sondern zum dran drehen und Experimentieren einladen; wie immer sind Sie zur Mitarbeit aufgerufen. Und soviel sei jetzt schon versprochen: Wir werden keine Trivialspiele wie etwa Tic-Tac-Toe behandeln, das bei dieser Gelegenheit meist herhalten muß, sondern Strategiespiele, die Ihnen mit Sicherheit einiges zu denken geben werden.

Unser erstes Studienprojekt wird das japanische Gobang-Spiel sein (auch als Go-Moku bekannt), eines jener reizvollen archaischen Spiele, die mit einfachen Mitteln sehr interessante und komplexe Abläufe erzeugen und deshalb für die Programmierung besonders gut geeignet sind. Bevor wir uns jedoch diesem Thema zuwenden, werden wir zunächst einen Blick darauf werfen, wie eigentlich der Mensch strategisch spielt.

Von Meistern und Mustern

Nach landläufiger Meinung handelt es sich bei Schachmeistern um Gehirnakrobaten, die in Windeseile eine Vielzahl möglicher Züge vorausberechnen können und aus diesem Grund dem durchschnittlichen Amateurspieler weit überlegen sind. Doch entspricht das wirklich den Tatsachen? Recht überraschend ist zumindest die Antwort, die der amerikanische Schachmeister Marshall auf die Frage gab, wieviel Züge er im allgemeinen vorausberechnet: 'Zwei, aber dann zwei Gute!' Zunächst einmal fühlt man sich auf den Arm genommen - soll das alles sein? Doch in der Tat hat sich herausgestellt, daß Schachmeister zwar durchaus in der Lage sind, bestimmte Zugfolgen sehr weit zu durchdenken, aber dabei nur eine kleine Auswahl der vielen möglichen Züge in Betracht ziehen, nämlich wie gesagt nur die guten.

Für den Schachprogrammierer ist das sehr frustrierend: Wie soll er diesen schwer zu definierenden Instinkt für die Qualität bestimmter Züge auf seine Maschine übertragen? Hinsichtlich der kombinatorischen Fähigkeiten haben die modernen Schachmaschinen durchaus schon Meisterniveau erreicht, doch es fehlt nach wie vor der Blick für die Situation, der dem Meister auf Anhieb verrät, welche Züge überhaupt betrachtenswert sind.

Unerwartete Schützenhilfe erhält der Programmierer jedoch von den Psychologen, die ebenfalls ein lebhaftes Interesse dafür entwickeln, wie solche geistigen Leistungen zustande kommen. Sie haben herausgefunden, daß der Schachmeister weniger einzelne Figuren und deren Zugmöglichkeiten betrachtet, sondern bestimmte Teilstrukturen auf dem Schachbrett wiedererkennt. Diese Muster werden z.B. durch die Bauernketten in einer bestimmten Eröffnung gebildet, durch die Gruppierung der Offiziere auf der Königsseite oder die Stellung der Figuren im Zentrum. Der Meister sieht diese Muster als Ganzes, so wie wir ein Wort unmittelbar verstehen können, ohne es erst in seine Buchstaben zu zerlegen, und weiß aus Erfahrung, welche Fortsetzungen in den speziellen Situationen besonders erfolgversprechend sind.

Gut, sagt sich der Schachprogrammierer, dann machen wir das genauso. Zunächst schaffen wir ein Festplattenlaufwerk an, um genügend Speicherplatz zu haben, dann bekommt der Rechner eine Liste aller relevanten Teilstrukturen, die beim Schach auftreten können, und zu guter Letzt engagieren wir einen Spezialisten, der die dazugehörigen guten Züge eintippt - fertig ist der elektronische Großmeister! Und dieses Konzept sieht in der Tat sehr erfolgversprechend aus: Leistungsfähige Algorithmen zur Identifizierung von Mustern (Pattern Recognition) sind bereits erforscht und bekannt, an Speicherplatz mangelt es heutzutage auch nicht mehr, und wenn dann noch die Geschwindigkeit und die daraus resultierende Kombinationsstärke moderner Rechner dazukommt... ja, dann wäre wirklich bald ein Computer Schachweltmeister, wenn es nicht noch ein entscheidendes Hindernis gäbe.

Erinnern wir uns noch einmal an die Analogie zur Sprache. Um den Sinn eines Wortes zu erfassen, genügt es meist nicht, das Wort zu identifizieren, sondern wir müssen auch die spezielle Bedeutung des Wortes innerhalb eines Satzes oder sogar eines ganzen Textes erfassen, den Sinnzusammenhang. Es stellt im Prinzip kein Problem dar, einem Computer ein ganzes Wörterbuch einzutrichtern und ihm alle grammatikalischen Regeln beizubringen, aber das heißt noch lange nicht, daß er jetzt die Sprache versteht!

Während der Speicherplatz für die Wörter, Deklinationen, Konjugationen usw. allemal ausreicht, erreicht die Anzahl der möglichen Sinnbeziehungen zwischen verschiedenen Wörtern astronomische Dimensionen und ist programmtechnisch nur sehr schwer in den Griff zu bekommen. Und genau hier liegt der Hund begraben: Der Schachmeister kennt nicht nur eine große Anzahl von Teilstrukturen (Schachwörter), er kann sie auch zueinander in Beziehung setzen und ihre Bedeutung innerhalb eines größeren Zusammenhangs erkennen, und das macht ihm bis heute kein Computer nach.

Aus dieser Tatsache ergibt sich ein wesentlicher Unterschied in der Verfahrensweise bei menschlichen und elektronischen Schachspezialisten: Der Computer muß alle Züge (und meistens noch tausende von Folgezügen) probeweise ausführen, bevor er sie anhand der resultierenden Stellung beurteilen kann; der Großmeister beurteilt erst die Stellung und rechnet dann nur ein paar Kombinationen durch. Es liegt auf der Hand, welches Verfahren effektiver ist.

Let's go bang!

Bevor wir dazu kommen, wie sich solche Probleme in der Praxis darstellen, hier zunächst die Spielregeln: Gobang wird ursprünglich auf einem 19x19 Feld gespielt. Kenner dieses ehrwürdigen Spiels mögen verzeihen, daß es für unser Programm auf computergerechte 16x16 Felder zurechtgestutzt wurde; die Programmierung in Assembler wurde auf diese Weise besonders einfach.

Zwei Spieler setzen nun abwechselnd verschiedenfarbige Plättchen auf das Spielfeld, und zwar mit dem Ziel, horizontal, vertikal oder in einer der beiden Diagonalrichtungen eine ununterbrochene Reihe aus fünf eigenen Steinen zu bilden. Gewonnen hat, wer es als erster schafft. Es kommt also darauf an, Züge zu finden, die möglichst in mehreren Richtungen etwas bewirken, also z.B. gleichzeitig eine eigene Reihe ergänzen und eine gegnerische Reihe blockieren. Dabei gilt es, einen guten Überblick zu bewahren - vielleicht ist es ganz sinnvoll, wenn Sie jetzt schon das Programm GOBANG.BAS starten und ausprobieren, um sich einen Eindruck von dem Spiel zu verschaffen; das Verständnis für die folgenden Ausführungen wird dadurch erleichert.

Nach dem Programmstart wird zunächst das Spielfeld gezeichnet, danach können Sie entscheiden, wer anfängt. Wenn Sie am Zug sind, erscheint ein Cursor, der wie üblich mit den Pfeiltasten gesteuert wird. Bewegen Sie ihn einfach zu dem Feld, auf das Sie setzen wollen und drücken Sie dann <ENTER>, worauf ein roter Stein erscheint (Ihre Farbe) und das Programm seinen nächsten Zug berechnet. Wenn nach 120 Zügen kein Gewinner feststeht, gilt die Partie als unentschieden; nach dem Spielende startet ein beliebiger Tastendruck eine neue Partie. Falls Sie als GobangAnfänger zunächst einige saftige Niederlagen hinnehmen müssen, lassen sie sich nicht allzusehr frustrieren: Das Programm ist zu schlagen - aber wie, das müssen Sie schon selbst herausfinden!

Und jetzt zur Programmierung: Was den Programmierer zunächst einmal erschreckt, ist die große Anzahl der Zugmöglichkeiten bei Gobang. Während in Schachstellungen durchschnittlich 40 Züge zur Auswahl stehen, sind es bei diesem Spiel zumindest in der Anfangsphase mehr als 200, und das bedeutet im Klartext, daß der Computer seine eigentliche Stärke, nämlich die Vorausberechnung aller möglichen Zugfolgen bis zu einer gewissen Tiefe, in diesem Fall nicht ausspielen kann.

Eine kurze Rechnung zeigt sofort die Hoffnungslosigkeit dieses Unterfangens: Um nur zwei Züge weit im voraus zu denken, müßte das Programm auf dem 16x16-Brett zu Beginn insgesamt 256x255x254x253 Stellungen untersuchen, und das wäre selbst für ein schnelles Maschinenprogramm zuviel. Zwar sind aus der Schachprogrammierung Methoden bekamt, um die Anzahl der zu untersuchenden Stellungen zu reduzieren (Alpha/Beta-Algorithmus, mehr dazu im nächsten Kapitel), doch auch das würde bei Gobang nur bedingt helfen - wer hat schon Lust, eine Stunde oder länger auf den nächsten Zug des Rechners zu warten?

Deshalb müssen wir uns wohl oder übel auf die Methode der Meister besinnen und einen Weg finden, den Wert eines Zuges auf Anhieb zu bestimmen, ohne die möglichen Fortsetzungen probeweise durchzuspielen. Von Vorteil ist immerhin, daß es nur zwei verschiedene Arten von Spielsteinen gibt, und die ziehen glücklicherweise nicht auf dem Brett herum, sondern bleiben brav an ihrem Ort.

Idiotisch oder genial?

Der Mensch denkt bei der Spielbewertung qualitativ und spricht in diesem Zusaumenhang von idiotischen, schlechten, annehmbaren, guten oder sogar genialen Zügen. Doch mit dieser sprachlichen Klassifizierung kann ein Rechner nur wenig anfangen, seine Domäne sind die Zahlen, und deshalb muß sich der Programmierer Gedanken darum machen, wie die Qualität durch Zahlenwerte dargestellt werden kann. Wäre das Programm in der Lage, alle Konsequenzen eines Zuges bis zum Ende der Partie zu berechnen, so könnte das so aussehen:

-1 = verloren   1 = gewonnen   0 = unentschieden

und ein einfacher arithmetischer Vergleich stellt dann klar, welche Züge besser oder schlechter sind.

Doch wie bereits erwähnt, ist das endgültige Spielergehnis für den Computer wegen der Vielzahl von Zugmöglichkeiten absolut außer Sichtweite, und deshalb müssen wir uns darauf beschränken, gewisse Teilerfolge zu bewerten, die erfahrungsgemäß eine Bedeutung für den Spielausgang haben. Wenn wir ein Leerfeld betrachten, das für einen potentiellen Zug in Frage kommt - nennen wir es einmal Zielfeld - ist intuitiv klar, daß die Qualität des Zuges irgendetwas damit zu tun hat, wie sich bereits gesetzte Steine um dieses Zielfeld herumgruppieren. Sie bilden ein Muster mit bestimmten Merkmalen, und diese Merkmale geben uns einen Hinweis darauf, ob es sich lohnt, dort einen weiteren Stein hinzusetzen.

Für die Programmierung bietet sich deshalb folgendes Verfahren an: Der Rechner untersucht die Umgebung des Zielfeldes auf das Vorhandensein günstiger Merkmale und vergibt dafür - je nachdem, ob er sie vorfindet oder nicht - nach einem bestimmten System Punkte. Diese Punkte werden anschließend addiert, und der beste Zug ist letztendlich der, dessen Zielfeld die höchste Bewertung erhält. Die knifflige Aufgabe ist dabei weniger die Programmierung der Merkmalserkennung, sondern vielmehr die Aufstellung einer effektiven Bewertungsfunktion, die bestimmt, für welche Merkmale es wieviel Punkte gibt. Hier kann der Programmierer nur sein eigenes Spielverständnis in die Waagschale werfen und durch viele Versuche herausfinden, welches System zu einer akzeptablen Spielstärke führt.

Das Vergnügen, an einer Bewertungsfunktion herumzubasteln, können Sie gleich selbst genießen: CPC-Gobang erlaubt es nämlich, alle relevanten Faktoren beliebig zu ändern. Doch zunächst soll erläutert werden, welche Merkmale überhaupt in Rechnung gezogen werden.

Betrachten wir zu diesem Zweck eine beliebige unvollständige Fünferreihe auf dem Spielfeld, in der unser leeres Zielfeld enthalten ist. Sollten sich in dieser Reihe bereits gegnerische Steine befinden, so ist sie für uns nicht weiter von Belang, da sich mit ihr das Endziel, nämlich die Bildung einer Fünferreihe aus eigenen Steinen, nicht mehr erreichen läßt: Dafür vergeben wir kategorisch 0 Punkte. Anderenfalls wird uns jedoch interessieren, wieviele eigene Steine bereits in diesem Abschnitt liegen - je mehr, desto besser. Doch wieviele Punkte geben wir dafür? Bewährt hat sich folgende Formel:

P = Anzahl2

Für vier bereits vorhandene eigene Steine gibt es also 16 Punkte (und der Zug gewinnt die Partie!), für drei Steine 9 Punkte usw. Das ist schon ein guter Ansatz, doch er genügt noch lange nicht. Zum Beispiel spielt es auch eine Rolle, wie die eigenen Steine in dem betrachteten Fünferabschnitt verteilt sind. Schauen Sie sich einmal die folgenden Situationen an, in denen das Zielfeld durch X, eigene Steine durch 0 und Leerfelder durch ein Minuszeichen markiert sind:

a) 0 0 - 0 X
b) 0 0 0 - X
c) - 0 0 0 X

In allen Fünferreihen sind bereits drei eigene Steine vorhanden, doch in der Reihe a liegen sie getrennt, während sie in Reihe b und c im Zusammenhang auftreten. Offensichtlich ist die Reihe c am wertvollsten, da der Zug einen beidseitig offenen Vierer erzeugt und damit zum Gewinn der Partie führt - es sei denn, die Reihe stößt rechts an den Rand oder einen gegnerischen Stein. Die Reihen a und b können dagegen durch einen Zug des Gegners sofort wieder entwertet werden. Dieses Beispiel verdeutlicht, daß neben der Anzahl der Steine drei zusätzliche Merkmale beachtet werden müssen:

1) Liegen die Steine getrennt oder im Zusammenhang? Um diesen Sachverhalt zu erfassen, wird die Variable ZS definiert:

ZS = 1 bei Zusammenhang   ZS = 0 sonst

wobei das Zielfeld bereits vorausschauend als besetzt gilt. Auch in der folgenden Situation ist also ZS = 1:

- 0 X 0 -

2) Liegt das Zielfeld in der Nähe eines eigenen Steines? Entsprechend wird die Variable NH besetzt:

NH = 1 bei Nähe,   NH = 0 sonst

3) Ist die betrachtete Fünferreihe an beiden Enden offen oder an einer Seite blockiert? Hier kommt die Variable OF ins Spiel:

OF = 1 wenn offen,   OF = 0 sonst

Insgesamt sieht die Bewertungsfunktion damit so aus:

P = Anzah1 * Anzahl + ZS + NH + OF

Als Test können Sie die Punktzahl für die folgende Fünferreihe ermitteln (+ steht für einen gegnerischen Stein, X ist das Zielfeld). Sie sollten dabei auf fünf Punkte kommen (Anzahl=2, ZS=0, NH=1, OP=0):

+ 0 - - 0 X

Beachtet werden muß allerdings noch, daß ein Zielfeld an insgesamt fünf sich überlappenden Fünferreihen beteiligt ist. Betrachten Sie den folgenden Ausschnitt (+ ist wieder ein gegnerischer Stein oder ein Feld außerhalb des Spielbretts):

+ + - - 0 X 0 - 0 - -

Wenn wir alle Fünferreihen bewerten, in denen das Zielfeld enthalten ist, erhalten wir von links nach rechts die Punktzahlen 0, 6, 7, 11 und 6. Es ist naheliegend, als resultierenden Wert die maximale Punktzahl zu verwenden, also die 11 Punkte für die Fünferreihe, die mit dem fünften Feld von links beginnt:

Wert = MAX(P1, P2, P3, P4, P5)

Damit sollte das Programm schon in der Lage sein, zielbewußt zusammenhängende Reihen mit möglichst vielen eigenen Steinen aufzubauen. Doch das allein genügt leider nicht; es gilt ja auch, gewinnträchtige Aktionen des Gegners im Keim zu ersticken! Zu diesem Zweck brauchen wir jedoch nur die gesamte Bewertung zu wiederholen, aber mit vertauschten Rollen: Jetzt gelten die eigenen Steine als feindlich und die Steine des Gegners als Freunde. Nachdem wir auf diese Weise die Situation durch die Augen des Gegenspielers betrachtet haben, können wir der Punktwertung entnehmen, wie gerne er im nächsten Zug einen Stein auf das Zielfeld setzen möchte. Falls sich herausstellt, daß er sehr gerne tun würde, ist es natürlich ratsam, in weiser Voraussicht dort einen eigenen Stein zu plazieren, um diese Aktion zu verhindern.

Damit erhalten wir also für jedes Zielfeld zwei Bewertungen, einen Wert für den Spieler, der gerade am Zug ist (Wert1), und einen Wert für den Gegner (Wert2). Wie setzen wir jetzt diese Ergebnisse zueinander in Beziehung? Mit Sicherheit ist es besser, eine eigene Fünferreihe zu vervollständigen und damit zu gewinnen, als eine Fünferreihe des Gegners zu verhindern - Angriff ist die beste Verteidigung! Deshalb addieren wir zu Wert1 noch einen oder zwei Punkte als Offensivbonus OB und wählen danach das größere Ergebnis als Bewertung:

BW = MAX( Wert1 + OB, Wert2 )

Doch damit sind wir noch nicht am Ende angelangt: Der aufmerksame Leser wird an dieser Stelle mit Recht bemängeln, daß ein sehr wichtiger Aspekt des Gobang-Spieles bisher noch nicht berücksichtigt wurde. Der Reiz des Spieles entsteht ja gerade dadurch, daß jeder Zug gleich in mehrere Richtungen Auswirkungen hat. Die Bewertungsfunktion in der vorliegenden Form analysiert jedoch nur jeweils eine Richtung, also z.B. eine horizontale Reihe.

Also wenden wir das eben beschriebene System nacheinander auf Reihen in allen Richtungen an - horizontal, vertikal und zweimal diagonal - und untersuchen damit praktisch ein sternförmiges Muster, in dessen Zentrum sich das Zielfeld befindet. Insgesamt erhalten wir auf diese Weise vier Bewertungen BW1...BW4, und wieder taucht die Frage auf, wie diese Ergebnisse miteinander verknüpft werden sollen. Doch um es kurz zu machen, hier ein System, daß sich recht gut bewährt hat: Die Resultate für die verschiedenen Richtungen werden zunächst in absteigender Folge sortiert, so daß gilt:

BW1 >= BW2 >= BW3 >= BW4

Danach werden die Werte gewichtet, indem jeder mit einem bestimmten Faktor multipliziert wird, und anschließend addiert:

Gesamtwert = Fl * BW1 + F2 * BW2 + F3 * BW3 + F4 * BW4

Die Wahl geeigneter Faktoren Fl...F4 erfordert einiges Fingerspitzengefühl; unser CPC-Programm spielt jedenfalls mit folgenden Werten schon recht ordentlich:

Fl = 64,  F2 = 16,  F3 = 4,  F4 = 1

Nach diesem Verfahren braucht der Rechner also nur jedem leeren Feld einen Gesamtwert zuzuordnen, und das Feld mit dem höchsten Wert erhält dann den Zuschlag - unser Programm zieht!

Das Parameter-Tuning

Der letzte Abschnitt hat deutlich gezeigt, wie komplex eine effektive Stellungsanalyse schon bei diesem relativ einfachen Spiel werden kann. Immerhin ist es erstaunlich, wie gut das Programm spielt, ohne die möglichen Folgen der Züge vorauszuberechnen. Leider gibt es noch keine Theorie, die Anhaltspunkte für den Aufbau von Bewertungsfunktionen liefert; auch die in unserem Fall benutzten Punktwertungen beruhen letzendlich auf experimentell erprobten Annahmen. Es ist also sehr wahrscheinlich, daß sich die Spielstärke durch ein Parametertuning weiter steigern läßt - doch damit sind Sie jetzt an der Reihe!

CPC GOBANG stellt für die Einstellung der Bewertungs-Parameter einige Hilfsmittel zur Verfügung: Wenn Sie am Zug sind, können Sie durch <COPY> die Anzeige der Zugbewertung ein- oder ausschalten. Rechts auf dem Bildschirm erscheint dann für jedes Zielfeld, auf dem sich der Cursor gerade befindet, die entsprechende Bewertung und verrät Ihnen, was der Rechner von Ihren Plänen hält. Weiterhin zeigt das Programm in der Zeile darunter die Bewertung der eigenen Züge an.

Nach Drücken von <TAB> werden dagegen sämtliche im letzten Abschnitt besprochenen Parameter auf der linken Seite ausgegeben. Um nun einen oder mehrere Werte probeweise zu ändern, begeben Sie sich einfach mit dem Cursor in die entsprechende Zeile, geben den neuen Wert ein und schließen mit <ENTER> ab. Diese Manipulation können Sie jederzeit auch während einer Partie vornehmen, mit <ENTER> kehren Sie dann ins Spielgeschehen zurück.

In der Parametertabelle finden Sie zuoberst die Werte AO...A4, die die Punktzahl für eine entsprechende Anzahl eigener Steine in einer unvollständigen Fünferreihe bestimmen. ZS, NH und OF geben an, wieviele Punkte die dazugehörigen Strukturmerkmale erhalten, falls Sie in einer Reihe auftauchen, und OB steht für den Offensivbonus. Den Abschluß bilden die Faktoren Fl..F4, mit denen die Ergebnisse für die vier Richtungen gewichtet werden.

Insgesamt stehen also 13 Werte zur Verfügung, an denen Sie drehen können, wodurch eine Reihe interessanter Experimente möglich wird. So ist es zum Beispiel sehr instruktiv, bei ZS, NH und/oder OF eine Null einzutragen, worauf der Rechner diese Merkmale nicht mehr beachtet und ziemlich chaotisch spielt. Auf diese Weise können Sie die Bedeutung der verschiedenen Werte für das Spielverhalten des Programmes erforschen und versuchen, es zu verbessern. Besonders interessant ist es natürlich, nach einer Niederlage des Computers die Ursachen zu analysieren und durch geeignete Änderungen dafür zu sorgen, daß der Fehler in Zukunft vermieden wird.

Zum Abschluß noch ein paar Anregungen und Informationen für eigene Aktivitäten: Nicht nur die Spielstärke, sondern auch der Bedienungskomfort des Programms läßt sich noch verbessern. So könnte man z.B. ein Array einbauen, in dem sich der Rechner alle Züge merkt, um eine Zugzurücknahme oder ein Nachspielen der Partie zu ermöglichen. Auch Zugvorschläge lassen sich mit den vorhandenen Unterprogrammen realisieren. Deshalb hier für alle Bastler die Bedeutung der drei Assemblerroutinen:

CALL &A000 löscht das gesamte Spielfeld, das zeilenweise im Speicher ab Adresse &A300 abgelegt wird. In der internen Darstellung bedeutet eine 0 ein leeres Feld, eine 1 einen Stein des Rechners und eine 2 einen Stein des (menschlichen) Gegners.

CALL &A00D berechnet die Bewertung für ein Feld der Spielfläche. Dazu muß vor dem Aufruf in der Speicherstelle &A1D4 die Spalte und in &A1D5 die Reihe übergeben werden (beide Werte im Bereich 0...15); weiterhin wird der Routine über die Adresse &A1CF mitgeteilt, für welchen Spieler (1 oder 2) die Bewertung durchgeführt werden soll. Nach dem Aufruf befindet sich in &AID2 das Lowbyte und in &A1D3 das Highbyte des errechneten Wertes. Weiterhin kann der Speicherstelle &A1D0 entnommen werden, ob ein Gewinnzug des Rechners (Bit 1 gesetzt) oder des Gegners (Bit 2 gesetzt) vorliegt. Die Routine überprüft nicht, ob ein Feld bereits besetzt ist!

CALL &A022 ermittelt den Zug mit der maximalen Wertung; auch hier muß vor dem Aufruf über die Speicherstelle &A1CF festgelegt werden, wer gerade am Zug ist. Nach dem Aufruf findet man in &A1D4 die Spalte und in &A1D5 die Reihe des entsprechenden Feldes; die Bewertung und die Gewinnflags werden wie in der vorigen Routine übergeben.

Literaturhinweis: Der Algorithmus für die Bewertungsfunkticn wurde dem Buch Pascal at Work and Play von Richard S. Forsyth entnommen (Chapman and Hall, London / New York), das noch weitere Leckerbissen dieser Art bietet.