AW: Schachdiagramme darstellen
06.09.2006 09:16:19
ingUR
Danke, Lothar,
für Deine Erläuterung Deines Vorhabens.
Ich ahnte es schon, dass es eher in Richtung Protokoll/Literatur geht, sodass der Weg über die Zellen eines Excel-Tabellenblatts mir weniger geeignet scheint, da hier jeweils das Brett als Teil der Tabelle erstellt wird, Du hingegen das Brett mit seiner Figurenstellung als Bild benötigst.
Als Alternative zum Schriftfont bietet sich nun m.E., da Du erwähnst, dass Du das Schachprogramm Fritz im Einsatz hast, das Arbeiten mit den "Figuren-Feldern", also jede Figur führt ihr gerade besetztes Feld mit sich.
Du hattest natürlich Recht, dass hier nur 26 unterschiedliche Elemente existieren und genau diese sind im Verzeichnis C:\Programme\ChessBase\ChessProgram8\gif (Fritz8) bei einer Standardinstallation als Gif-Bild abrufbar, jedoch zur Darstellung der denkbaren Anordnung sind eben doch eine höhere Anzahl von Objekte auf dem Schirm erforderlich, wobei einzig der Läufer "sparsam" sich einsetzen läßt, da ja jeder Läufer für sich allein nur eine Feldfarbe beherrscht.
Es ist also nun die Farbe des Feldes, auf der sich die schwarze oder weiße Figur befindet mit zu berücksichtigen, so dass die Funktion zur Aufstellung der Figuren verändert werden muß.
Fig. w s Feld Kürzel
Fritz-Gif: "Figurfarbe(Figurkürzel)Feldfarbe" & ".gif"
D 1 1 w+s 4 q wqw, wqb, bqw, bqb
K 1 1 w+s 4 k wqk, wkb, bkw, bkb
Lw 1 1 w 2 b wbw, wbb
Ls 1 1 s 2 b bqw, bqb
S 2 2 w+s 8 n wnw, wnb, bnw, bnb (x2)
T 2 2 w+s 8 r wrw, wrb, brw, brb (x2)
B 8 8 w+s 32 p wpw, wpb, bpw, bpb (x8)
------------------ w b (zwei Leerfelder) = 2x2x6+2=26
60
Mit diesen Gif-Bildern läßt sich die Grundstellung der Figurenanorndung relativ leicht zum Gesamtbild im Gif-Format zusammenfügen, das in Maßen vergrößer und verkleinert werden kann:
Das Rechte Bild ist die Standardgröße aus den Einzelfiguren/-Felder (W x H = 24 x 24). die Vergleinerung sind durch Randverschiebung auf den Griff-Eckpunkten des Standardbildes aus diesem entstanden. Eine Vergrößerung ist ebenfalls in gut brauchbarer Qualität möglich.
Das Programm arbeit in diesem Teil vorerst so, dass es im ersten Schritt den Rand, die Randbeschriftung und die Feldgrößen in dem Zellnbereich "A1:J10" anlegt und formatiert. Achließend werden die Spilefelder plaziert (w.gif und b.gif). Danach werden für jede Farbe (mit weiß beginnend) die Firguren in Grundstellung aufgebaut: (w(f)w, w(f).b,.... b(f).w, b(f).b mit f für dei Figurenkürzel gem. Fritz-Gif-Datei.
Dieses Gebilde besteht aus ist Einzelbautsteine, wie man leicht erfährt, wenn man ein Objekt anwäklt und verschiebt. Gebunden wird das Ganze als "Photographie" des Bereiches "A1:J10", die vorerst auf dem Tabellenblatt Tabelle2 abgelegt wird.
Mit diesem "Binden" ist der Bildschirmausschnitt Notationsrand und Figuren/Felder zu einem Grafikobjekt geworden, welches in der Objekliste Schapes des betreffenden Blattes verwaltet wird. Das Grafikojekt kann nun als ein solches auch bearbeitet werden (Vergrößern, Verkleinern, Speichern, Laden ....).
Der Bearbeitungsstand des Vorentwurfes besteht aus den nacxhfolgenden Prozeduren, die in den Standardmodul-Ordner einzufügen sind:
Option Explicit
'C:\Programme\ChessBase\ChessProgram8\gif
Const b = -1: Const w = 1
Const bbb = -2: Const wbb = 2
Const bbw = -3: Const wbw = 3
Const bkb = -4: Const wkb = 4
Const bkw = -5: Const wkw = 5
Const bnb = -6: Const wnb = 6
Const bnw = -7: Const wnw = 7
Const bpb = -8: Const wpb = 8
Const bpw = -9: Const wpw = 9
Const bqb = -10: Const wqb = 10
Const bqw = -11: Const wqw = 11
Const brb = -12: Const wrb = 12
Const brw = -13: Const wrw = 13
Dim figPic(30, 2) As Object
Dim board(8, 8) As Object
Sub ZeichneSchachbrett()
Dim i As Integer, j As Integer, farbe As Integer
Dim strPath As String, strGifName(2) As String
Dim oldSU As Boolean
oldSU = Application.ScreenUpdating
Application.ScreenUpdating = False
strPath = "C:\Programme\ChessBase\ChessProgram8\gif\"
Sheets("Tabelle1").Select
EntferneAlleSchachObjekte
Brettrandbeschriftung
strGifName(0) = strPath & "w.gif" 'weißes Leerfeld
strGifName(1) = strPath & "b.gif" 'schwarzes Leerfeld
farbe = 0
For j = 1 To 8
farbe = IIf(farbe = 1, 0, 1)
For i = 1 To 8
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName(farbe))
Call Ausrichten(i, j)
farbe = IIf(farbe = 1, 0, 1)
Next i
Next j
LoadFigures
ActiveSheet.Range("A1:J10").CopyPicture Appearance:=xlScreen, Format:=xlPicture
Worksheets("Tabelle2").Paste Destination:=Range("A1")
Application.ScreenUpdating = True
Application.ScreenUpdating = oldSU
End Sub
Private Sub Brettrandbeschriftung()
Dim i As Integer
' Columns(1).ColumnWidth = 35.86
' Rows(1).RowHeight = 192
With Range("A1:j10")
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
Rows("1,10").RowHeight = 12.75
Rows("2:9").RowHeight = 24
Columns(1).ColumnWidth = 2.25
Columns("B:H").ColumnWidth = 30.3 / 8
Columns(10).ColumnWidth = 2.25
For i = 1 To 8
Cells(10 - i, 1) = i
Cells(10 - i, 10) = i
Cells(1, 1 + i) = Chr(64 + i)
Cells(10, 1 + i) = Chr(64 + i)
Next i
End Sub
Private Sub LoadFigures()
Dim strPath As String, strGifName As String
Dim i As Integer, j As Integer
Dim x0 As Integer, y0 As Integer
Dim figCode, picW As Integer, picH As Integer, FF As String
strPath = "C:\Programme\ChessBase\ChessProgram8\gif\"
picW = 24
picH = 24
figCode = Array("", "r", "n", "b", "k", "q", "b", "n", "r")
j = 8: FF = "w" 'baue Reihe 1 auf
For i = 1 To 8
strGifName = strPath & "w" & figCode(i) & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
j = 7: FF = "b" 'baue Brettreihe 2 auf (weiße Beuernlinie)
For i = 1 To 8
strGifName = strPath & "wp" & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
j = 2: FF = "w" 'baue Reihe 7 auf (schwarze Bauernreihe)
For i = 1 To 8
strGifName = strPath & "bp" & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
j = 1: FF = "b"
For i = 1 To 8
strGifName = strPath & "b" & figCode(i) & FF & ".gif"
Set board(i, j) = ActiveSheet.Pictures.Insert(strGifName)
Call Ausrichten(i, j)
FF = IIf(FF = "w", "b", "w")
Next
End Sub
Private Sub Ausrichten(i, j)
Dim picW As Integer, picH As Integer
Dim x0 As Integer, y0 As Integer
x0 = Range("B2").Left
y0 = Range("B2").Top
picW = 24 'i-Richtung
picH = 24 'j-Richtung
With board(i, j)
.Left = x0 + (i - 1) * picW
.Top = y0 + (j - 1) * picH
End With
End Sub
Sub EntferneAlleSchachObjekte()
Dim objShp As Shape
For Each objShp In ActiveSheet.Shapes
objShp.Delete
Next
End Sub
Sub Einzelfigursetzen(Notation As String)
'bColumn = Left(Bez, 1) - Asc("A") '0....7
'bRow = Val(rigth(Bez, 1)) - 1 '0....7
End Sub
Das Einzelfigursetzen ist als Entwicklungsarbeit noch offen.
Ideall wäre, wenn es optional die Wahlmöglichkeit geben würde, dass die Zugfolge zur Darstellung des Spielstands führt oder man aber einen bestimmten Spielstand als Eingangstellung vorgibt. Hierzu erscheint es mit sinnvoll aus den Figuren Datentypen werden zu lassen, der all ihre Eigenschaften (Farben, Position, ...) als eigene Variable mit sich führt:
Type Schachfigur
objPic as Object
iKennNr as Integer
strCode as String
strName as String
strNotation as String
ipos as Integer
iPotenziellPos(8) as Integer
End Type
Dim Schachfiguren(60) as Schachfigur
Als Vorüberlegung sollte man auch untersuchen, ob eine eigene Funktionsklasse empfehlenswert ist, den das versetzen eines Steines wird gleichartige Abläufe nach sich ziehen (Ausgangsfeld, Endfeld, Regelkontrolle).
Doch das sind alles Ideen, die in diesem Beitragsfaden nicht weiterentwickelt werden können, denn der verschwindet anscheinend morgen oder übermorgen im Archiv und wie man oder ob man da Anworten kann, weis ich nicht.
Ich werde also nach zeitlicher Gelegenheit dieses Projekt bestimmt ein Stück weiterentwickeln. Über UweRat>markt-datenat>de können wir gerne uns über den Stand und das Schachthema austauschen, denn der Entwicklungsstand gestattet es meinem Empfinden nach nicht, dieses Forum als Projektinformationplattform zwischen uns zu nutzen, denn ein allgemeines Interesse findet diese Anwendung nicht.
Gruß,
Uwe