Schach Spiel komplette mit Visual Basic 2012 programmieren von Selzer-McKenzie SelMcKenzie
Video: http://youtu.be/YBuJ-BVeOzA
Ich zeige Ihnen heute,wie Sie ein komplettes Schachspiel mit
allen Finessen programmieren können. Dazu füge ich nachstehend den kompletten
Code bei. Auf der Kommentarseite dieses Videos können Sie den Code auch direkt
abkopieren.
Auf dem Video sehen Sie,wie das Schachspielfunktioniert.
Der komplette Code Schachspiel:
Public Class frmSchach
Private Board(7, 7) As Label ' Schachbrett aus 64 Label-Komponenten
Private Const x0 As Integer = 60 'x-Koordinate der linken oberen Ecke
Private Const y0 As Integer = 20 'y- " " "
" "
Private Const a As Integer = 64 ' Kantenlänge eines Felds (64, muss mit Icon-Größe übereinstimmen!)
Private ZugNummer As Integer = 0 ' Zugnummer
' Die
folgende Methode erzeugt das Schachbrett:
Public Sub createChessTable(x0 As Integer, y0 As Integer, a As Integer)
' Das
Schachbrett wird als zweidimensionale Matrix aus 64 Label-Controls generiert:
Dim lb As Label = Nothing
' alle
Zeilen durchlaufen:
For z As Integer = 0 To 7
' alle
Spalten durchlaufen:
For s As Integer = 0 To 7
lb = New Label()
lb.Bounds = New Rectangle(x0 + s * a, y0 + z
* a, a, a)
lb.ImageList =
SchachFigurenBildListe ' Icon-Sammlung (Index 0..25, siehe
Bildauflistungs-Editor)
lb.AllowDrop = True ' jedes
Label kann DragDrop-Ziel sein
'
Den Schachfeldbezeichner (z.B. "E4") ermitteln und als Name des
Labels verwenden:
lb.Name = getFeldName(z, s)
'
DragDrop-Eventhandler anmelden:
AddHandler lb.MouseDown, AddressOf lb_MouseDown
AddHandler lb.DragEnter, AddressOf lb_DragEnter
AddHandler lb.DragDrop, AddressOf lb_DragDrop
Me.Controls.Add(lb)
' Label zum Formular hinzufügen
Board(s, z) = lb ' Label
dem Schachbrett zuweisen
Next s
Next z
initBoard() '
Grundaufstellung erzeugen
End Sub
Private Function getFeldName(z As Integer, s As Integer) As String ' Übergabe Zeilen- und
Spaltenindex (0..7, 0..7)
Dim c As Char = Convert.ToChar(s + 65) ' 65 ... 72 sind die Codes für "A" ...
"H"
Return c + (8 - z).ToString ' Rückgabe
Feldbezeichner, z.B. "A1"
End Function
'
Schachbrett mit Grundaufstellung besetzen:
Private Sub initBoard()
Dim startB(,) As Integer = {{16, 9, 12, 21, 24, 13, 8, 17},
{5, 4, 5,
4, 5, 4, 5, 4},
{0, 1, 0,
1, 0, 1, 0, 1},
{1, 0, 1,
0, 1, 0, 1, 0},
{0, 1, 0,
1, 0, 1, 0, 1},
{1, 0, 1,
0, 1, 0, 1, 0},
{2, 3, 2,
3, 2, 3, 2, 3},
{15, 6, 11, 18, 23,
10, 7, 14}}
For z As Integer = 0 To 7
For s As Integer = 0 To 7
Board(s, z).ImageIndex =
startB(z, s)
Next
Next
End Sub
' Beginn
des DragDrop:
Private Sub lb_MouseDown(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim lb As Label = CType(sender, Label) ' das Startfeld
Dim startF As String = lb.Name.ToString()
lb.AllowDrop = False ' damit
man nicht auf dasselbe Feld ablegen kann (führt zum Löschen der Figur)
Dim dat As String = startF & lb.ImageIndex.ToString() ' z.B. "C27"
Dim dropEffect As DragDropEffects = lb.DoDragDrop(dat, DragDropEffects.Move)
Dim stFarbe As Boolean = istWeiss(startF)
If dropEffect = DragDropEffects.Move Then ' nach dem Absetzen auf dem Zielfeeld das Startfeld leer räumen
If stFarbe Then
lb.ImageIndex = 0 '
Startfeld wird weiss
Else
lb.ImageIndex = 1 ' "
" schwarz
End If
End If
lb.AllowDrop = True '
ablegen auf dem Startfeld ist wieder erlaubt
End If
End Sub
' wird
beim Eintritt in ein DragDrop-fähiges Label (AllowDrop=True) ausgelöst
Private Sub lb_DragEnter(sender As Object, e As DragEventArgs)
If e.Data.GetDataPresent(DataFormats.Text) Then
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
End Sub
Private zugListe As CListBox_3
'
gezogenes Objekt wird losgelassen:
Private Sub lb_DragDrop(sender As Object, e As DragEventArgs)
' vom
Startfeld wird kein Objekt, sonder lediglich ein Datenstring (Feldbezeichner
und Icon-Index) übergeben:
Dim dat As String = CType(e.Data.GetData(DataFormats.Text), String) ' z.B. "C215"
' Daten
des Startfelds ermitteln:
Dim startF As String = dat.Substring(0,
2) ' Name des Startfelds herauskopieren, z.B. "C2"
Dim index As Integer = Convert.ToInt32(dat.Substring(2))
' Icon-Index des Startfelds
herauskopieren, z.B. 15
If index < 2 Then Exit Sub ' nicht für leere Felder (0 = weißes Feld, 1 = schw. Feld)
Dim lb As Label = CType(sender, Label) ' das Zielfeld, z.B. "C4"
Dim zielF As String = lb.Name.ToString
'
Icon-Index für Zielfeld korrigieren wenn die Farbe des Zielfelds von der des
Startfelds abweicht,
' denn
Grafik muss geändert werden, wenn z.B. Springer von weißem auf schw. Feld
zieht.
'
Voraussetzung ist entsprechende Index-Reihenfolge im Bildauflistungs-Editor:
If istWeiss(startF) And Not istWeiss(zielF) Then index = index + 1 ' neues
Icon wird Zielfeld zugewiesen, wenn Figur von weißem auf schwarzes Feld zieht
If Not istWeiss(startF) And istWeiss(zielF) Then index = index - 1 ' " " " schwarzen auf weißes "
"
Dim trennZ As String = " - " ' Trennzeichen zwischen zwei Zugpositionen
If lb.ImageIndex > 1 Then trennZ = " x " ' Zielfeld ist mit anderer
Figur besetzt
lb.ImageIndex = index '
Zielfeld erhält die, evtl. für einen anderen Hintergrund korrigierte, Grafik
des Startfelds zugewiesen
Dim ZugTxt As String = getFigur(index) & startF.ToLower & trennZ &
zielF.ToLower ' Text für Dokumentation des Halbzugs
' -----------------
Rochade -----------------------
If (index = 23) And (startF = "E1") Then ' weißer König auf E1 wurde gezogen
If zielF = "G1" Then ' kurze Rochade
setF("F1",
14) '
Turm wird von H1 nach F1 umgesetzt
setF("H1", 0)
ZugTxt = "0-0"
End If
If zielF = "C1" Then ' lange Rochade
setF("D1",
14) '
Turm wird von A1 nach D1 umgesetzt
setF("A1", 1)
ZugTxt = "0-0-0"
End If
End If
If (index = 24) And (startF = "E8") Then ' schwarzer König auf E8 wurde gezogen
If zielF = "G8" Then ' kurze Rochade
setF("F8",
17) '
Turm wird von H1 nach F1 umgesetzt
setF("H8", 1)
ZugTxt = "0-0"
End If
If zielF = "C8" Then ' lange Rochade
setF("D8",
17) '
Turm wird von A8 nach D8 umgesetzt
setF("A8", 0)
ZugTxt = "0-0-0"
End If
End If
'
-------------------------------------------------
' Zug
dokumentieren:
ZugNummer += 1
If ZugNummer Mod 2 <> 0 Then
zugListe.Add0(((ZugNummer + 1) /
2).ToString & ".") ' Anzeige Zugnummer
zugListe.Add1(ZugTxt) '
Anzeige des weißen Zugs, z.B. "Sb1 - c3"
Else
zugListe.Add2(ZugTxt) ' dto.
schwarzer Zug
End If
End Sub
Private Sub setF(fName As String, imIndex As Integer) ' einem Feld, z.B. "C2", eine bestimmte Grafik
aus ImageList zuweisen
Dim c As Char = Convert.ToChar(fName.Substring(0, 1)) '
z.B. "C"
Dim code As Integer = Convert.ToInt32(c) ' Ascci-Code, z.B. 67
Dim z As Integer = Convert.ToInt32(fName.Substring(1, 1)) ' z.B. 2
z = Math.Abs(z - 8)
' Zeilennummer (0 .. 7)
Dim s As Integer = code - 65 ' Spaltennummer (0 .. 7)
Board(s, z).ImageIndex = imIndex ' Grafik
zuweisen
End Sub
Private Function getFigur(index As Integer) As String ' Figurentyp aus Index der ImageList ermitteln
If index < 6 Then Return "" ' Bauer
If index > 5 And index < 10 Then Return "S" ' Springer
If index > 9 And index < 14 Then Return "L" ' Läufer
If index > 13 And index < 18 Then Return "T" ' Turm
If index > 17 And index < 22 Then Return "D" ' Dame
If index > 21 Then Return "K" ' König
End Function
Private Function istWeiss(fName As String) As Boolean ' Übergabe: ein Schach-Feldbezeichner, z.B. "C2"
Dim c As Char = Convert.ToChar(fName.Substring(0, 1)) '
"C"
Dim code As Integer = Convert.ToInt32(c) ' Ascii-Code, z.B. 67
Dim z As Integer = Convert.ToInt32(fName.Substring(1, 1)) ' 2
Dim n As Integer = code + z ' 69
Return Convert.ToBoolean(n Mod 2)
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SEL = "SelMcKenzie®" & Space$(3) & "SelWave®" & Space$(3) & "WaveTrader®" & Space$(3) & "Selzer-McKenzie®"
Me.Text = SEL
createChessTable(x0, y0, a) ' Übergabe:
linke obere Ecke und Kantenlänge der Felder
zugListe = New CListBox_3(ListViewAusgabe, "Nr", 20, "Weiss", 40, "Schwarz", 40)
End Sub
' Zurücksetzen:
Private Sub KnopfZurücksetzen_Click(sender As Object, e As EventArgs) Handles KnopfZurücksetzen.Click
initBoard()
ListViewAusgabe.Items.Clear()
ZugNummer = 0
End Sub
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
'
Beschriftung der Zeilen und Spalten:
Dim Zeichnen As Graphics = CreateGraphics()
Zeichnen.TranslateTransform(x0,
y0) '
Koordinatenursprung verschieben
Dim FüllungBlau As Brush = New SolidBrush(Color.Blue)
Dim FüllungRot As Brush = New SolidBrush(Color.Red)
MusterFüllung1 = New Drawing2D.HatchBrush(Drawing2D.HatchStyle.DiagonalCross, Color.Yellow, Color.Blue)
Zeichnen.FillRectangle(MusterFüllung1,
600, -15, 465, 575)
MusterFüllung2 = New Drawing2D.HatchBrush(Drawing2D.HatchStyle.DiagonalCross, Color.White, Color.Green)
Zeichnen.FillRectangle(MusterFüllung2,
-40, -15, 600, 575)
' alle
Zeilen durchlaufen:
For z As Integer = 0 To 7
'
Beschriftung der Zeilen:
Zeichnen.DrawString((8 -
z).ToString(), New Font("Arial", 24), FüllungBlau, -30, a * z + 10) '
"1", "2", ... "8"
' alle
Spalten durchlaufen:
For s As Integer = 0 To 7
Dim c As Char = Convert.ToChar(s + 65)
Zeichnen.DrawString(c, New Font("Arial", 24), FüllungRot,
s * a + 10, y0 + 8 * a) ' "A", "B", ..."H"
Next
Next
End Sub
End Class
Keine Kommentare:
Kommentar veröffentlichen
Hinweis: Nur ein Mitglied dieses Blogs kann Kommentare posten.