![]() |
Schachfeld mit 2 Figuren (Läufer, Turm)
So, ich muss/soll ein Schachfeld programnmieren, auf dem 2 Figuren (Turm & Läufer) beliebig stehen. Per Tastendruck wird das Spielfeld mit 2 Figuren erzeugt. Sie sollen Kreise in 2 verschiedenen Farben sein. Per Mausklick soll man sie auswählen können und dann auf ein andres Feld klicken und das Programm erkennt, ob der Zug gültig für diese Figur ist (dann dorthin verschieben), wenn nicht showmessage ('Flascher Zug')
Bin nicht weit gekommen, hänge gerade...
Delphi-Quellcode:
var xx, yy, dx, dy : integer;
var farbe: array [1..8,1..8] of TColor; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var i,j, x1, y1, x2, y2, x3, x4, y3, y4, n :integer; begin xx:=10; yy:=10; dx:=(Form1.ClientHeight-20) div 8; //Breite der Kästchen dy:=dx; //Höhe der Kästchen canvas.Pen.color := clblack; for i:=0 to 8 do begin //Schachfeld 8x8 zeichnen canvas.MoveTo(xx+(dx*i),yy); canvas.lineto(xx+(dx*i),(dy*8)+10); canvas.MoveTo(xx,yy+(dy*i)); canvas.lineto((dx*8)+10,yy+(dy*i)); end; x1 := random(8); y1 := random(8); x2 := x1+1; y2 := y1+1; x3 := random(8); y3 := random(8); x4 := x3+1; y4 := y3+1; farbe[x1,y1]:=clblue; farbe[x3,y3]:=clred; for i:= 0 to 8 do begin for j:= 0 to 8 do begin if farbe[i,j] <> clblack then begin canvas.brush.color:=farbe[x1,y1]; canvas.Ellipse(xx+(dx*x1),yy+(dy*y1),xx+(dx*x2),yy+(dy*y2)); canvas.brush.color:=farbe[x3,y3]; canvas.Ellipse(xx+(dx*x3),yy+(dy*y3),xx+(dx*x4),yy+(dy*y4)); end; end; end; end; procedure TForm1.FormResize(Sender: TObject); begin Form1.Refresh; //Bild löschen wenn Größenänderung end; procedure TForm1.FormActivate(Sender: TObject); begin Showmessage('Bitte eine beliebige Taste zum Starten drücken!'); end; end. |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
Hallo,
der Code ist ja ganz nett - er zeichnet das Feld. Hast du dir auch schon zu dem eigentlichen Problem Gedanken gemacht? Wie würdest du sowas sonst lösen? Zu dem Code: Man könnte das noch etwas auftrennen, und zwar sollte die Platzierung da raus. Dann hast du eine Repaint-Methode und brauchst nur noch das array ändern und die Methode aufrufen ;) |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
wie meinste mit platzierung da raus bzw wie würde dass dann aussehen?
zum Problem: ich müsste mit Hilfe eines Array (denke ich) die Punkte/Felder speichern, in denen eine Figur ist und welche Figur das ist (bzw welche Farbe sie hat) und dann eine abfrage reinbringen die beim klick auf diese figur und dann auf ein andres Feld nachprüft ob dieser Zug erlaubt ist... ich weiß aber ehrlich gesagt nicht wie ich das realisieren soll...das is leider mein prob |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
Mit dem Trennen meine ich sowas:
Delphi-Quellcode:
So ungefähr. Dass das nicht auf Anhieb compiliert ist mir klar.
TFigur = enum (fgLaeufer, fgTurm, fgNone); // keine Syntaxgarantie
var Form1: TForm1; Spielfeld: array [0..7, 0..7] of TFigur; implementation {$R *.dfm} procedure TForm1.RepaintBoard() const topmargin = 20; leftmargin = 30; var width, height, i, j: Integer; begin fieldwidth := (ClientWidth - 2 * leftmargin) div 8; fieldheight := (ClientHeight - 2 * topmargin) div 8; for i := 0 to 7 do for j := 0 to 7 do begin if (i+j) mod 2 = 0 then Canvas.brush.Color := clWhite; else Canvas.brush.Color := clBlack; Canvas.rectangle(leftmargin+i*fieldwidth, topmargin+j*fieldheight, fieldwidth, fieldheight); // wenn du das schon kennst, kannst du folgendes durch ein case ersetzen if Spielfeld[i,j] = fgLaeufer then // Läufer malen else if Spielfeld[i,j] = fgTurm then // Turm malen end; end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin // Sollte ins OnCreate, und randomize nicht vergessen !! // Spielfeld mit fgNone initialisieren! Spielfeld[random(8),random(8)]:=fgNone; Spielfeld[random(8),random(8)]:=fgNone; end; procedure TForm1.FormResize(Sender: TObject); begin // Nonsense end; procedure TForm1.FormActivate(Sender: TObject); begin Showmessage('Bitte eine beliebige Taste zum Starten drücken!'); end; // Noch ein OnFormPaint Ereignis, und darin dann RepaintBoard() aufrufen end. |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
ok ich probiers mal aus, danke vielmals, case hatte ich noch nicht =) und das mit dem
"Noch ein OnFormPaint Ereignis, und darin dann RepaintBoard() aufrufen" hatte ich auch noch nicht und TFigur = enum (fgLaeufer, fgTurm, fgNone); // keine Syntaxgarantie geht nicht und ich hab keine AHnung wie ich das andersch schreiben soll damits compilierbar iwird...der verlangt immer nach einem = anstatt den , die da stehen und er erkennt den identifier enum nicht |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
Delphi-Quellcode:
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TFeldInfo=record Farbe:TColor; Figur:Integer; end; TFeldArray=Array[0..7,0..7] of TFeldInfo; TForm5 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FFeldArray:TFeldArray; FLaufer:Tpoint; FTurm:Tpoint; FSelectedFigure:Integer; procedure MoveFromTo(vx, vy, tx, ty:Integer); { Private-Deklarationen } public { Public-Deklarationen } end; const C_FeldGroesse=50; C_Laufer=1; C_Turm=2; var Form5: TForm5; implementation {$R *.dfm} procedure TForm5.FormCreate(Sender: TObject); var x,y:Integer; begin ClientWidth := 8 * C_FeldGroesse ; Clientheight := 8 * C_FeldGroesse; For y := 0 to 7 do for x := 0 to 7 do if (((y and 1)= 1 ) and ((X AND 1)=0)) or (((y and 1)= 0 ) and ((X AND 1)=1)) then FFeldArray[x,y].Farbe := clBlack else FFeldArray[x,y].Farbe := clWhite; FLaufer.x := Random(7); FLaufer.y := Random(7); FFeldArray[FLaufer.x,FLaufer.y].Figur := C_Laufer; FTurm.x := Random(7); FTurm.y := Random(7); while (FTurm.x = Flaufer.x) and (FTurm.y = Flaufer.y) do begin FTurm.x := Random(7); FTurm.y := Random(7); end; FFeldArray[FTurm.x,FTurm.y].Figur := C_Turm; end; procedure TForm5.MoveFromTo(vx,vy,tx,ty:Integer); begin if FFeldArray[vx,vy].Figur = C_Laufer then begin Flaufer.X := tx; Flaufer.Y := ty; end else if FFeldArray[vx,vy].Figur = C_Turm then begin FTurm.X := tx; FTurm.Y := ty; end; FFeldArray[tx,ty].Figur := FFeldArray[vx,vy].Figur; FFeldArray[vx,vy].Figur := 0; Invalidate; end; procedure TForm5.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var NowSelectedFigure:Integer; cx,cy:Integer; begin cx := x DIV C_FeldGroesse; cy := y DIV C_FeldGroesse; NowSelectedFigure := FFeldArray[cx,cy].Figur; if NowSelectedFigure <> 0 then FSelectedFigure := NowSelectedFigure else begin if FSelectedFigure=C_Turm then begin if (cx= FTurm.X) or (cy= FTurm.y) then MoveFromTo(FTurm.X,FTurm.y,cx,cy); end else if FSelectedFigure=C_Laufer then if ABS(cx - Flaufer.X) = ABS(cy - Flaufer.y) then MoveFromTo(Flaufer.X,Flaufer.y,cx,cy); end; end; procedure TForm5.FormPaint(Sender: TObject); var x,y:Integer; R:TRect; begin For y := 0 to 7 do for x := 0 to 7 do begin r.Left := x * C_FeldGroesse; r.Top := y * C_FeldGroesse; r.Right := x * C_FeldGroesse + C_FeldGroesse; r.Bottom := y * C_FeldGroesse + C_FeldGroesse; canvas.Brush.Color := FFeldArray[x,y].Farbe ; Canvas.FillRect (R); if FFeldArray[x,y].Figur=C_turm then begin Canvas.Brush.Color := clBlue; Canvas.Ellipse(r.Left,r.Top,r.Right,r.Bottom); end; if FFeldArray[x,y].Figur=C_laufer then begin Canvas.Brush.Color := clred; Canvas.Ellipse(r.Left,r.Top,r.Right,r.Bottom); end; end; end; end. |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
Nur mal so gefragt: Ist das ne Schulaufgabe?
|
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
Zitat:
"Ich muss/soll ein Schachfeld ..." "... case hatte ich noch nicht ..." Nö, bestimmt nicht :mrgreen: |
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
ja ist es
|
AW: Schachfeld mit 2 Figuren (Läufer, Turm)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz