Kurs:FreeBASIC/Projekte/FBT3/0012

Ziel dieser Seite: Wir zerlegen das Programm in kleinere Abschnitte. Die unklaren Abschnitte werden mit Kommentaren versehen und die neuen Befehle werden verlinkt. Dies geschieht jeweils unterhalb des Programmabschnitts.

Code (Struktur)

Bearbeiten

FUNCTION SpielerSymbol

Bearbeiten
FUNCTION SpielerSymbol (ByVal Spieler As Byte) AS STRING
    IF Spieler = 1 THEN
        RETURN "X"
    ELSE
        RETURN "O"
    END IF
END FUNCTION

Kommentar

Bearbeiten

Function neu, auch RETURN

Variablen definieren und Spielfläche einrichten

Bearbeiten
Dim As Byte Spieler, Feld(1 to 3, 1 to 3), k, x, y, i, j, frei, gewonnen
Dim As String JaNein

DO
    For i = 1 TO 3
        For j = 1 TO 3
            Feld(i,j)=0
        Next j
    Next i
    CLS
    PRINT "Setzspiel"
    PRINT "fuer 2 Spieler"
    PRINT
    PRINT "    1   2   3"
    PRINT 
    PRINT "1   . | . | ."
    PRINT "    - + - + -"
    PRINT "2   . | . | ."
    PRINT "    - + - + -"
    PRINT "3   . | . | ." 
    PRINT
    Spieler=1

Kommentar

Bearbeiten
Was wird hier gemacht?
  • Variablen werden definiert... (alles Byte)
Variable Verwendung
Spieler
Feld(1 to 3, 1 to 3)
k
x
y
i
j
frei
gewonnen
  • Feld(i,j) wird definiert (für mich neu)
  • Spielfläche wird eingerichtet
  • Spieler wird auf 1 gesetzt

Programm

Bearbeiten
    DO
        FOR i = 12 TO 14
            LOCATE i,1: PRINT STRING(79,32)
        NEXT i
        LOCATE 12,1: PRINT "Am Zug: Spieler " & Spieler & " (" & SpielerSymbol(Spieler) & ")"
        LOCATE 13,1: INPUT "An welche Koordinate (XY, z.B. 12 / 0 = Ende) setzen? ", k
        IF k = 0 THEN
            END
        ELSEIF (k < 0) OR ((k > 0 ) AND (k < 11)) OR (k > 33) THEN
            BEEP
        ELSE
            x = VAL(LEFT(STR(k),1))
            y = VAL(RIGHT(STR(k),1))
            IF feld(x,y) > 0 THEN
                LOCATE 14,1: PRINT "Feld ist schon besetzt. Beliebige Taste druecken, um noch mal zu setzen."
                SLEEP
            ELSE
                feld(x,y) = Spieler
                LOCATE 6+((y-1)*2),5+((x-1)*4): PRINT SpielerSymbol(Spieler)
                gewonnen = 0
                FOR i = 1 to 3
                    IF Feld(i,1) > 0 THEN
                        IF Feld(i,1)=Feld(i,2) AND Feld(i,2)=Feld(i,3) THEN gewonnen = (Feld(i,1))
                    END IF
                NEXT i
                FOR i = 1 to 3
                    IF Feld(1,i) > 0 THEN
                        IF Feld(1,i) = Feld(2,i) AND Feld(2,i) = Feld(3,i) THEN gewonnen = (Feld(1,i))
                    END IF
                NEXT i
                IF (Feld(1,1)=Feld(2,2) AND Feld(2,2)=Feld(3,3)) AND (Feld(1,1)>0) THEN gewonnen = Feld(1,1)
                IF (Feld(3,1)=Feld(2,2) AND Feld(2,2)=Feld(1,3)) AND (Feld(3,1)>0) THEN gewonnen = Feld(3,1)
                If gewonnen > 0 THEN
                    LOCATE 14,1: PRINT "Spieler " & Spieler & " hat gewonnen."
                    BEEP: SLEEP
                    EXIT DO
                END IF
                Spieler = 3-Spieler
            END IF
            frei = 0
            For i = 1 to 3
                For j = 1 to 3
                    If Feld(i,j) = 0 Then
                        frei = 1
                        Exit For
                    End If
                Next j
                If frei = 1 Then Exit For
            Next i
            If frei = 0 Then
                LOCATE 14,1: PRINT "Alle Felder sind besetzt, aber niemandem ist es gelungen, drei Steine in eine"
                LOCATE 15,1: PRINT "Reihe zu setzen. Die Partie ging unentschieden aus."
                BEEP: SLEEP
                EXIT DO
            End if
        END IF
    LOOP
    CLS
    WHILE INKEY <> "": SLEEP 1: WEND
    INPUT "Noch eine Runde spielen? (j/n) ", JaNein
    IF INSTR(UCASE(JaNein),"J") < 1 THEN EXIT DO
LOOP

Programm-Ende

Bearbeiten
END

Kommentar

Bearbeiten

Das Programm wird mit END beendet.