Mittwoch, 20. März 2013

Schach Spiel komplette mit Visual Basic 2012 programmieren von Selzer-McKenzie SelMcKenzie


Schach Spiel komplette mit Visual Basic 2012  programmieren von Selzer-McKenzie SelMcKenzie


 

 

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.