home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------------------ *)
- (* TICTAC.PAS *)
- PROGRAM TicTacToe_3D;
-
- CONST bell = 7;
-
- VAR spieler, computer, (* Spieler-, Computerwertung *)
- start, (* wer faengt an ? *)
- ebene, spalte, reihe, feld, (* bestimmen Feld im Brett *)
- zug: INTEGER; (* Zugzaehler *)
- f: ARRAY [0..63] OF INTEGER; (* Brettdarstellung *)
- b: ARRAY [0..75] OF INTEGER; (* Bewertungsfeld *)
- ch: CHAR;
- (* ------------------------------------------------------------------ *)
- PROCEDURE neues_Spiel;
- VAR i: INTEGER;
- BEGIN
- ClrScr; (* Bildschirm loeschen und Cursor in linke, obere Ecke *)
- FOR i := 0 TO 63 DO f[i] := 0;
- FOR i := 0 TO 75 DO b[i] := 0;
- zug := 1; start := -1;
- FOR i := 1 TO 4 DO BEGIN
- WriteLn(' -----------------------');
- WriteLn(' / . . . . /');
- WriteLn(' / . . . . /');
- WriteLn(' / . . . . /');
- WriteLn(' / . . . . /');
- WriteLn('-----------------------');
- END;
- GotoXY(50,1); Write(' 3D Tic Tac Toe ');
- GotoXY(37,2); Write('Ziel des Spieles ist, vier eigene Steine in');
- GotoXY(37,3); Write('eine horizontale, diagonale, vertikale oder');
- GotoXY(37,4); Write('raumdiagonale Reihe zu legen.');
- GotoXY(37,5); Write('Die Ebenen sind von unten nach oben, die');
- GotoXY(37,6); Write('Spalten von links nach rechts, die Reihen');
- GotoXY(37,7); Write('von vorne nach hinten durchnummeriert (1-4).');
- GotoXY(47,15); Write('Wer soll beginnen ?');
- GotoXY(47,16); Write('[M]ensch oder [C]omputer');
- GotoXY(48,16);
- REPEAT
- Read(Kbd,ch); (* von Tastatur ohne Echo lesen *)
- IF ch IN ['M','m'] THEN start := 0
- ELSE IF ch IN ['C','c'] THEN start := 1;
- UNTIL start <> -1;
- GotoXY(47,15); Write(' ');
- GotoXY(47,16); Write(' ');
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE Pause (x: INTEGER);
- VAR i: INTEGER; j: REAL;
- BEGIN j := 100.0; FOR i := 0 TO x DO j := j * j / j; END;
-
- PROCEDURE Setzen (stein: CHAR);
- VAR i: INTEGER;
- BEGIN
- FOR i := 1 TO 10 DO
- BEGIN
- GotoXY(spalte*6+4+reihe,23-ebene*6-reihe); Write(' '); Pause(70);
- GotoXY(spalte*6+4+reihe,23-ebene*6-reihe); Write(stein); Pause(70);
- END;
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE SpielerZug;
-
- FUNCTION Eingabe: INTEGER;
- VAR ch: CHAR; i: INTEGER;
- BEGIN
- REPEAT
- Write(Chr(bell)); Read(Kbd,ch); i := Ord(ch)-Ord('1');
- UNTIL i IN [0..3];
- Eingabe := i; Write(ch);
- END;
-
- BEGIN
- REPEAT
- GotoXY(43,15); Write('Bitte geben Sie ihren Zug ein.');
- GotoXY(52,18); Write(' Ebene ? '); ebene := Eingabe;
- GotoXY(52,19); Write('Spalte ? '); spalte := Eingabe;
- GotoXY(52,20); Write(' Reihe ? '); reihe := Eingabe;
- feld := ebene * 16 + spalte + reihe * 4;
- UNTIL f[feld] = 0;
- f[feld] := 5; Setzen('O');
- GotoXY(52,18); Write(' ');
- GotoXY(52,19); Write(' ');
- GotoXY(52,20); Write(' ');
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE Bewertung;
- VAR i, c, m: INTEGER;
- BEGIN
- FOR i := 0 TO 15 DO b[i] := f[i] + f[i+16] + f[i+32] + f[i+48];
- m := 16; c := 0;
- FOR i := 0 TO 3 DO
- BEGIN
- b[m] := f[c] + f[c+1] + f[c+2] + f[c+3];
- b[m+1] := f[c+4] + f[c+5] + f[c+6] + f[c+7];
- b[m+2] := f[c+8] + f[c+9] + f[c+10] + f[c+11];
- b[m+3] := f[c+12] + f[c+13] + f[c+14] + f[c+15];
- m := m+4; c := c+16;
- END;
- c := 0;
- FOR i := 0 TO 3 DO
- BEGIN
- b[m] := f[c] + f[c+4] + f[c+8] + f[c+12];
- b[m+1] := f[c+1] + f[c+5] + f[c+9] + f[c+13];
- b[m+2] := f[c+2] + f[c+6] + f[c+10] + f[c+14];
- b[m+3] := f[c+3] + f[c+7] + f[c+11] + f[c+15];
- m := m+4; c := c+16;
- END;
- c := 0;
- FOR i := 0 TO 3 DO
- BEGIN
- b[m] := f[c] + f[c+5] + f[c+10] + f[c+15];
- b[m+1] := f[c+3] + f[c+6] + f[c+9] + f[c+12];
- m := m+2; c := c+16;
- END;
- c := 0;
- FOR i := 0 TO 3 DO
- BEGIN
- b[m] := f[c] + f[c+17] + f[c+34] + f[c+51];
- b[m+1] := f[c+3] + f[c+18] + f[c+33] + f[c+48];
- m := m+2; c := c+4;
- END;
- FOR i := 0 TO 3 DO
- BEGIN
- b[m] := f[i] + f[i+20] + f[i+40] + f[i+60];
- b[m+1] := f[i+12] + f[i+24] + f[i+36] + f[i+48];
- m := m+2;
- END;
- b[m] := f[0] + f[21] + f[42] + f[63]; m := m+1;
- b[m] := f[3] + f[22] + f[41] + f[60]; m := m+1;
- b[m] := f[48] + f[37] + f[26] + f[15]; m := m+1;
- b[m] := f[51] + f[38] + f[25] + f[12];
- spieler := 0; computer := 0;
- FOR i := 0 TO 75 DO
- BEGIN
- IF b[i]=0 THEN BEGIN
- spieler := spieler+1; computer := computer+2;
- END;
- IF b[i]=1 THEN computer := computer+2;
- IF b[i]=5 THEN spieler := spieler+7;
- IF b[i]=2 THEN computer := computer+7;
- IF b[i]=10 THEN spieler := spieler+22;
- IF b[i]=3 THEN computer := computer+22;
- IF b[i]=15 THEN spieler := spieler+222;
- IF b[i]=4 THEN computer := computer+10000;
- IF b[i]=20 THEN spieler := spieler+10000;
- END;
- END;
- (* ------------------------------------------------------------------ *)
- PROCEDURE Computerzug;
- VAR i, best, bestzug: INTEGER;
- BEGIN
- GotoXY(43,15); Write(' Der Computer rechnet. ');
- best := -15000;
- FOR i := 0 TO 63 DO BEGIN
- IF f[i] = 0 THEN BEGIN
- f[i] := 1; Bewertung;
- IF (computer-spieler) > best THEN BEGIN
- best := computer-spieler; bestzug := i;
- END;
- f[i] := 0;
- END;
- END;
- ebene := bestzug DIV 16; spalte := bestzug MOD 4;
- f[bestzug] := 1; reihe := (bestzug-ebene*16) DIV 4;
- Setzen('X');
- END;
- (* ------------------------------------------------------------------ *)
- FUNCTION Spielende: BOOLEAN;
- BEGIN
- Bewertung; Spielende := FALSE;
- IF computer > 9999 THEN BEGIN
- GotoXY(46,22); Write('Der Computer hat gewonnen.'); Spielende := TRUE;
- END;
- IF spieler > 9999 THEN BEGIN
- GotoXY(48,22); Write('Sie haben gewonnen.'); Spielende := TRUE;
- END;
- END;
- (* ------------------------------------------------------------------ *)
- BEGIN
- REPEAT
- neues_Spiel;
- REPEAT
- IF start = 1 THEN start := 0 ELSE SpielerZug;
- IF NOT Spielende THEN Computerzug;
- zug := zug+1;
- UNTIL Spielende OR (zug > 32);
- Pause(3000); GotoXY(46,23); Write(' Ein neues Spiel (J/N) ? ');
- Read(Kbd,ch);
- UNTIL ch IN ['N','n'];
- END.
-