E
EDonky
Guest
Ich habe ma was kleines geschrieben:
Nur mit den Rote spalten stimmt was net
Code:
(*$B-*)
PROGRAM TicTacToe;
(* Auf Eingabe einer Spielsituation von Kringel-und-Kreuze *)
(* (Tic Tac Toe) wird fuer die freien Felder brechnet, *)
(* ob sie zu einem Gewinn, Unentschieden oder Verlust fuehren. *)
CONST schwarz = -1;
weiss = 1;
frei = 0;
TYPE Status = -1..1;
Spielbrett = ARRAY[1..9] OF Status;
Wert = -1..1;
VAR B : Spielbrett;
w : Wert;
i : INTEGER;
FUNCTION Muehle(B: Spielbrett): BOOLEAN;
(* Ist genau dann TRUE, wenn das Spielbrett eine Muehle enthaelt. *)
VAR i: INTEGER;
BEGIN
Muehle := FALSE;
FOR i := 1 TO 3 DO
BEGIN
IF abs(B[i] + B[i+3] + B[i+6]) = 3 THEN Muehle := TRUE;
IF abs(B[3*i-2] + B[3*i-1] + B[3*i]) = 3 THEN Muehle := TRUE;
END;
IF abs(B[1] + B[5] + B[9]) = 3 THEN Muehle := TRUE;
IF abs(B[3] + B[5] + B[7]) = 3 THEN Muehle := TRUE;
END; (* Muehle *)
FUNCTION Voll(B: Spielbrett): BOOLEAN;
(* Liefert genau dann TRUE, wenn alle Felder belegt sind. *)
VAR i : INTEGER;
BEGIN
Voll := TRUE;
FOR i := 1 TO 9 DO
IF B[i] = frei THEN Voll := FALSE
END; (* Voll *)
FUNCTION Auswertung(B: Spielbrett; s: Status): Wert;
(* Ist Spieler s am Zug, so wird fuer jedes freie Feld von B berechnet ob, *)
(* wenn s es ankreuzt, schwarz gewinnt (-1), weiss gewinnt (1) *)
(* oder es ein Unentschieden gibt (0). *)
VAR w, max: Wert;
i : INTEGER;
BEGIN
IF Muehle(B) OR Voll(B) THEN
IF Muehle(B) THEN Auswertung := -s
ELSE Auswertung := 0
ELSE
BEGIN
max := -1;
FOR i := 1 TO 9 DO (* Schaue alle Felder von B an. *)
BEGIN
IF B[i] = frei THEN (* Falls Feld noch frei, *)
BEGIN
B[i] := s; (* kreuze Feld an. *)
w := Auswertung(B,-s); (* Berechne, wer dann gewinnt. *)
B[i] := frei; (* Gebe Feld wieder frei. *)
IF max < s*w THEN max := s*w (* Bilde Maximum (falls s=1), *)
END; (* IF *) (* bzw. Minimum (falls s=-1) *)
Auswertung := s*max (* ueber die Werte aller Felder.*)
END (* FOR *)
END (* IF *)
END; (* Auswertung *)
PROCEDURE Ausgabe(i: INTEGER; w: Wert);
BEGIN
Write(i,': ');
CASE w OF
-1: WriteLn('Verlustzug');
0: WriteLn('Unentschieden');
1: WriteLn('Gewinnzug')
END
END; (* Ausgabe *)
BEGIN (* Hauptprogramm *)
Write('Gebe zeilenweise die Belegung des Spielbretts ein, ');
WriteLn('so dass Weiss am Zug ist.');
WriteLn('Dabei ist 0 = Leer, 1 = Weiss, -1 = Schwarz: ');
For i := 1 TO 3 DO
BEGIN
Write('Felder ',3*i-2,', ',3*i-1,' und ',3*i,': ');
ReadLn(B[3*i-2],B[3*i-1],B[3*i]);
WriteLn
END;
IF Muehle(B) OR Voll(B) THEN WriteLn('Spiel bereits zu Ende')
ELSE
BEGIN
FOR i := 1 TO 9 DO (* Schaue alle Felder an. *)
BEGIN
IF B[i] = frei THEN (* Falls Feld noch frei, *)
BEGIN
B[i] := weiss; (* wird es von Weiss markiert.*)
w := Auswertung(B,schwarz); (* Berechne wer dann gewinnt. *)
B[i] := frei; (* Gebe Feld wieder frei. *)
Ausgabe(i,w)
END (* IF *)
END (* FOR *)
END (* IF *)
END.
Zuletzt bearbeitet von einem Moderator: