BPS #15 TicTacToe, Teil II - Auswertung

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #15 TicTacToe, Teil II - Auswertung

BeitragSo, Dez 11, 2011 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer hat das TicTacToe spielbar bekommen?

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzMax: [AUSKLAPPEN]
rem
====================================================================
Project: Tic Tac Toe - Part II
====================================================================
endrem


AppTitle = "TicTacToe" ' Dem Fenster einen Namen geben
Graphics 200, 200 ' Grafikmodus initialisieren

Global grid:Int[3, 3] ' Speicher für ein 3 x 3 Feld reservieren, Integervariable

Local timer:TTimer ' Die Variable in welche den Handlewert der Framebremse beinhalten wird
Local x:Int, y:Int, player:Int, mx:Int, my:Int, pos_x:Int, pos_y:Int, win:Int, mh1:Int ' Allgemeine Variablen im Programm
Local message:String


' Ressourcen laden


' Globale Einstellungen
SetClsColor(128, 0, 0) ' Die Löschfarbe setzen
timer = TTimer.Create(60) ' Einen Timer erstellen
SeedRnd MilliSecs() ' Damit der Zufall zufällig ist
' Lies dazu auch in der Hilfe nach
player=Rand(1,2) ' Der Zufall entscheidet wer beginnt

Repeat ' Hauptschleife

mx=MouseX() ' Die Mauspositionen zwischenspeichern
my=MouseY() ' Dies wirkt sich positiv auf die Performance aus
' wenn die Werte mehrmals im Programm benötigt werden
mh1=MouseHit(1) ' Mausklick zwischenspeichern, mehr dazu auch im Forum.


Cls ' Der Backbuffer wird "gereinigt", siehe dazu auch "Globale Einstellungen"
SetColor(0, 0, 255) ' Blau als Zeichenfarbe festlegen

' Das Spielfeld malen
DrawLine 25, 75, 175, 75
DrawLine 25, 125, 175, 125
DrawLine 75, 25, 75, 175
DrawLine 125, 25, 125, 175

' Mittels 2 verschachtelten Schleifen werden die bereits gesetzten
' Steine ins Spielfeld gemalt
For y=0 To 2
For x=0 To 2
If grid[x, y] > 0 Then ' Ist der Wert im Feld größer 0 dann...

Select grid[x, y] ' ...entscheide welche Farbe wir brauchen...
Case 1; SetColor 255, 0, 0
Case 2; SetColor 0, 128, 0
End Select ' Select-Konstrukt Ende

DrawOval(30 + (x * 50), 30 + (y * 50), 40, 40) ' ... und male den Stein
EndIf ' Das EndIf zeigt das Ende des Konstrukts
Next ' Beendet die Schleife
Next ' Man sieht auch schön wie wichtig die Einrückung für die
' Lesbarkeit des Codes ist
' TIPP: IDEal unterstützt das automatische einrücken von Code
' Unter Settings -> Editor Settings -> Tab "Coding Help" findet sich
' ganz unten ein Radiobutton. Wählt dort "Advanced" aus um alle Features
' zu nutzen

' Je nach aktuell zugberechtigtem Spieler Farbe setzen
Select player ' Wieder ein Select-Case-Konstrukt für die Entscheidung
Case 1 ' Spieler 1
SetColor 255, 0, 0 ' Rot
Case 2 ' Spieler 2
SetColor 0, 128, 0 ' Grün
End Select ' Beendet das Konstrukt

' Hier wird ein Kreis gezeichnet an der Position des Mauszeigers
' Der Kreis ist 40 Pixel breit, 40 Pixel hoch und gefüllt
DrawOval(mx - 20, my - 20, 40, 40)

' Auswerten der Usereingabe
If mh1 And win=False ' Die linke Maustaste wurde gedrückt und
' es gibt noch keinen Gewinner der Partie

If mx>=25 And mx<=175 ' Ist der Mauszeiger vertikal im Spielfeld?
If my>=25 And my<=175 ' Ist der Mauszeiger horizontal im Spielfeld?
pos_x=(mx-25)/50
pos_y=(my-25)/50
' In den oberen 2 Zeilen machen wir uns eine Eigenheit von BB zunutze.
' Rechnen wir zunächst anhand von Beispielwerten den Wert von Hand aus:
' Wir nehmen an mx sei 100
' Das ergibt: pos_x=(100-25)/50
' pos_x=75/50
' pos_x=1.5
' Da pos_x aber ein Integerwert ist rundet BB den Wert auf 2
' Selbiges gilt sinngemäß auch für pos_y

If grid[pos_x, pos_y] = 0 ' Das Feld ist noch leer
grid[pos_x, pos_y] = player
' Das Feld an eben berechneter Position wird nun mit dem Wert
' für den aktuellen Spieler gefüttert

' Jetzt muß geprüft werden ob 3 Steine in einer Reihe sind
' Diese Prüfung wird nur ausgeführt wenn ein neuer Stein gesetzt wurde
' Das schont die Performance
win=CheckLine(player)

If player=1 Then player=2 Else player=1 ' Den anderen Spieler wählen
EndIf
EndIf
EndIf
EndIf

If win>0 Then ' Es gab einen Gewinner bzw Unentschieden und wir bieten an
' ein neues Spiel zu beginnen
If win=3 Then ' Das Spiel war unentschieden
message="Unentschieden!"
Else ' Andernfalls bauen wir den Spieler in den String ein
message="Player "+win+" hat gewonnen!"
EndIf
SetColor 255, 255, 255 ' Die Zeichenfarbe einstellen (weiß)
DrawText(message, 10, 25) ' Den Text ausgeben
' Der Text wird in der Mitte des Fensters (100,100) ausgegeben
' und vertikal wie horizontal zentriert (True,True)
DrawText("Leertaste für neues Spiel", 10, 100)

If KeyHit(57) Then ' Die Leertaste wird abgefragt (Scancodes siehe Hilfe)
NewGame() ' Das Spielfeld vorbereiten
win=False ' Den letzten Gewinner löschen
player=Rand(1,2) ' Den beginnenden Spieler neu auswählen
EndIf
EndIf


Flip 0 ' Die Buffer werden getauscht
WaitTimer(timer) ' Der Rechner "wartet" bis er den nächsten Frame malen darf
' Dies gibt dem Prozessor Zeit noch all die anderen Dinge zu tun die er
' zu erledigen hat
Until KeyHit(KEY_ESCAPE) Or AppTerminate() ' Solange die ESC-Taste nicht gedrückt wurde springen wir zurück
' zum Schleifenanfang

End ' Das Programm beenden



Function CheckLine(player)
Local x:Int, y:Int ' Die Variablen werden lokal in der Funktion angelegt
' Das Array wurde global deklariert und ist damit überall verfügbar !


For y=0 To 2 ' Waagrecht prüfen
If grid[0, y] = player And grid[1, y] = player And grid[2, y] = player Then
Return player ' Ist die Reihe voll mit gleichen Steinen geben wir
' den Spieler zurück und beenden somit die Funktion
EndIf
Next

For x=0 To 2 ' Senkrecht prüfen
If grid[x, 0] = player And grid[x, 1] = player And grid[x, 2] = player Then
Return player ' Dasselbe wie oben
EndIf
Next

' Nun prüfen wir noch die Diagonalen
If grid[0, 0] = player And grid[1, 1] = player And grid[2, 2] = player Then
Return player
EndIf
If grid[2,0]=player And grid[1,1]=player And grid[0,2]=player Then
Return player
EndIf

' Zu guter letzt wird noch geprüft ob das Spiel unentschieden ist
For y=0 To 2
For x=0 To 2
If grid[x,y]=0 Then Return False
' Es gibt noch ein freies Feld, das Spiel geht weiter
Next
Next

' Alle Prüfungen sind abgeschlossen. Es gibt keinen Gewinner, aber auch
' kein freies Feld mehr. Darum geben wir eine 3 für unentschieden zurück
Return 3
End Function

Function NewGame()
Local x:Int, y:Int
For y=0 To 2
For x=0 To 2
grid[x, y] = 0 ' Das Spielfeld wird leergeräumt
Next
Next
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group