TicTacToe

TicTacToe

bildschirmleer()

Die quadrat-Funktion benutzen wir, um das Spielfeld zu zeichnen

quadrat = (größe) ->
  stiftrunter()
  wiederhole 4, ->
    vor größe
    rechts 90
  stifthoch()

Mit der gehezu-Funktion schicken wir den Igel auf das Feld in Zeile i und Spalte j (um dann dort ein Kreuz oder einen Kreis zu zeichnen).

gehezu = (i,j) ->
  vor -130*(j-2)
  rechts 90
  vor 130*(i-2)
  links 90

Zeichne einen Kreis im Feld in Zeile i und Spalte j

kreis = (i, j) ->
  gehezu i, j
  vor 45
  links 90
  zurück 12
  stiftrunter()
  wiederhole 12, ->
    vor 25
    links 30
  stifthoch()
  nachhause()

Zeichne eine Kreuz im Feld in Zeile i und Spalte j

kreuz = (i,j) ->
  gehezu i, j
  stiftrunter()
  links 45
  vor 50
  zurück 100
  vor 50
  rechts 90
  vor 50
  zurück 100
  stifthoch()
  nachhause()

Nun zeichne den Spielplan

stifthoch()
vor 195
links 90
vor 195
links 180

für i in [1..3]
  für j in [1..3]
    quadrat 130
    vor 130
  zurück 390
  rechts 90
  vor 130
  links 90

nachhause()

In der folgenden "Tabelle", einer Liste aus drei Listen, speichern wir den aktuellen Zustand des Spielfelds. Dabei bedeutet .: das Feld ist leer, X: auf dem Feld ist ein Kreuz, O: auf dem Feld ist ein Kreis

spielfeld = [['.', '.', '.'], ['.', '.', '.'], ['.','.','.']]

Hier wird definiert, was passiert, wenn der Spieler (symbol='X') oder der Igel (symbol='O') an der Stelle (i,j) spielt: Wenn die entsprechende Stelle auf dem Spielfeld überhaupt frei ist, wird dort das entsprechende Symbol in unsere Tabelle eingetragen, und der Igel wird "losgeschickt", um das Symbol zu zeichnen. Zum Schluss wird überprüft, ob der Spieler, der gerade gespielt hat, gewonnen hat, ober ob das Spielfeld voll ist, und das Spiel unentschieden ausgegangen ist.

spiele = (i, j, symbol) ->
  wenn spielfeld[i-1][j-1] == '.'
    wenn symbol ist 'X'
      kreuz i, j
    sonst
      kreis i, j
    spielfeld[i-1][j-1] = symbol
    wenn teste_gewonnen symbol
      nachricht "#{symbol} hat gewonnen!"
      gibzurück
    wenn spielfeld_voll()
      nachricht "Unentschieden!"

Die folgende Funktion definiert, wie der Igel seinen Zug macht. In diesem Programm ist das sehr simpel: Der Igel wählt so lange zufällig eine Zeile und Spalte aus, bis er ein freies Feld gefunden hat, und macht dann dort seinen Kreis.

igelzug = ->
  wenn (teste_gewonnen('X') oder spielfeld_voll()) dann gibzurück
  während an
    i = würfel [1..3]
    j = würfel [1..3]
    wenn spielfeld[i-1][j-1] == '.'
      spiele i, j, 'O'
      gibzurück

Mit dieser Funktion überprüfen wir, ob der Spieler mit symbol (also 'X' oder 'O', je nachdem, wie die Funktion aufgerufen wird), gewonnen hat. Die Liste, über die die für-Schleife läuft, enthält alle 8 möglichen "Gewinnpositionen" (die drei Reihen, die drei Spalten und die beiden Diagonalen).

teste_gewonnen = (symbol) ->
  für seq in [[[0,0], [1,0], [2,0]],
              [[0,1], [1,1], [2,1]],
              [[0,2], [1,2], [2,2]],
              [[0,0], [0,1], [0,2]],
              [[1,0], [1,1], [1,2]],
              [[2,0], [2,1], [2,2]],
              [[0,0], [1,1], [2,2]],
              [[2,0], [1,1], [0,2]]
             ]
    wenn spielfeld[seq[0][0]][seq[0][1]] == spielfeld[seq[1][0]][seq[1][1]] == spielfeld[seq[2][0]][seq[2][1]] == symbol
      gibzurück wahr
  gibzurück falsch

Nun noch eine Funktion, um zu überprüfen, ob alle Felder belegt sind (hat niemand gewonnen, dann ist das Spiel also unentschieden beendet)

spielfeld_voll = ->
  für i in [0..2]
    für j in [0..2]
      wenn spielfeld[i][j] == '.' dann gibzurück falsch
  gibzurück wahr

Nun "binden" wir noch die Tasten 1 bis 9: Beim Drücken der jeweiligen Taste wird die spiele-Funktion für das entsprechende Feld aufgerufen, und danach die igelzug-Funktion.

taste '1', ->
  spiele 1, 1, 'X'
  igelzug()

taste '2', ->
  spiele 2, 1, 'X'
  igelzug()

taste '3', ->
  spiele 3, 1, 'X'
  igelzug()

taste '4', ->
  spiele 1, 2, 'X'
  igelzug()

taste '5', ->
  spiele 2, 2, 'X'
  igelzug()

taste '6', ->
  spiele 3, 2, 'X'
  igelzug()

taste '7', ->
  spiele 1, 3, 'X'
  igelzug()

taste '8', ->
  spiele 2, 3, 'X'
  igelzug()

taste '9', ->
  spiele 3, 3, 'X'
  igelzug()