Entwickler-Ecke

Sonstiges (Delphi) - Schachbrett Programmieren Hilfe...


Larissa17 - Mo 24.04.06 20:23
Titel: Schachbrett Programmieren Hilfe...
Hallo Leute...
Wir ham Delphi 2005 in der Schule als Thema
und nun sollen wir sowas wie ein Schachbrett programmieren... bei dem man wählen kann wie lang die Kästchen sind wie viele es sind und welche Farbe die einzelnen Kästchen haben (also z.b. blau und rot oder weiß und schwarz)
Ich hab leida nicht ma den Funken einer Idee wie man des machen könnte und grüble schon die ganzen Ferien... nun weiß ich mir keinen Rat mehr...
Also falls irgendwer Lust hat bissi zu knobeln oder sich schlichtweg gut auskennt wäre echt saunett mir zu erklären wie man des am Besten macht...
mfG Larissa

Moderiert von user profile iconmatze: Titel geändert.


GTA-Place - Mo 24.04.06 20:31

Habt ihr schonmal mit Canvas gearbeitet?


Fabian W. - Mo 24.04.06 20:38

Kommt darauf an wie weit ihr in Delphi seit. Wenn das ganze anspruchsvolls ein soll dann könnte man images generieren und aneinanderreihen, wenn ihr erst anfangt is canvas gut...
Könntest du auch dein Problem etwas spezifizieren? Hast du einfach kA odre bereiten dir die Komponenten Probleme?

mfg


Larissa17 - Di 25.04.06 00:56

Also wir haben canvas und ein wenig images aber mit zweiterem ham wir noch net soooo oft gearbeitet ;)
also mit den einzelnen Komponenten hab ich eher nich so viele Schwierigkeiten.
Ich hab halt keine Ahnung wie ich die sachen mit diversen schleifen und canvas so zusammsetze das ich am ende der aufgabe gerecht werde...


Logikmensch - Di 25.04.06 06:14

Hallo Larissa17,

zum Eingewöhnen, auch wenn das Zeitverhalten nicht das beste wird, empfehle ich hier eine Image-Komponente auf dein Formular zu platzieren und mit dessen Canvas-Eigenschaften (Brush, Pen) und -Methoden (FillRect, Rectangle) zu experimentieren. Image deswegen, weil Du hier vom System verwöhnt wirst und das Canwas wie eine stabil bleibende Leinwand bemalen kannst (im Gegensatz zur Paintbox, die ihr Gemale immer wieder vergisst). Du kannst ja die Größe des Image (Image.width und .height) als Maximalkoordinaten verwenden und "einfach" ein rechteckiges Gitter reinmalen (mit zweifach geschachtelter Schleife). Schachbrettmuster lassen sich mit Hilfe des Abfragens der Schleifenzähler auf gerade oder ungerade (funktion Odd) abtesten. Da kannst Du z.B. den ungeradzahligen Rechtecken ein gelbes und den geradzahligen ein schwarzes Füllmuster zuweisen.

Liebe Grüße,

Claus.


Blackheart666 - Di 25.04.06 08:41

Hier mal ein Fertiger Code, ist nicht von Mir vieleicht kannst du damit was anfangen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
var
i,x,y,modtemp: integer;

begin
  form1.Canvas.Pen.Color := clBlack;
  //Zeichnet das Spielfeld
  for i:=0 to 8 do
  begin
    canvas.MoveTo(60+i*50,60);
    canvas.LineTo(60+i*50,460);
    canvas.MoveTo(60,60+i*50); 
    canvas.LineTo(460,60+i*50);
  end

  x := 0;
  while x <> 8 do
  begin 
    x := x + 1;
    for y := 1 to 8 do 
    begin
      modtemp := y mod 2;
      if modtemp = 0 then
      begin 
        Form1.Canvas.Brush.Color := clWhite;
        Form1.Canvas.FillRect(Rect({left}50*(y)+11,{top}50*(x)+11
{right}50*(y)+60,{bottom}50*(x)+60));
      end
      else
      begin 
        Form1.Canvas.Brush.Color := clGray;
        Form1.Canvas.FillRect(Rect({left}50*(y)+11,{top}50*(x)+11
{right}50*(y)+60,{bottom}50*(x)+60));
      end;
    end;
  end

    x := 0
  while x <> 8 do
  begin
    x := x + 2;
    for y := 1 to 8 do 
    begin
      modtemp := y mod 2;
      if modtemp = 0 then
      begin
        Form1.Canvas.Brush.Color := clGray;
        Form1.Canvas.FillRect(Rect({left}50*(y)+11,{top}50*(x)+11,
{right}50*(y)+60,{bottom}50*(x)+60));
      end
      else
      begin
        Form1.Canvas.Brush.Color := clWhite;
        Form1.Canvas.FillRect(Rect({left}50*(y)+11,{top}50*(x)+11,
{right}50*(y)+60,{bottom}50*(x)+60));
      end;
    end;
  end;

  //Farbe wieder auf Hintergrundfarbe zurück setzen.
  form1.Canvas.Brush.Color := clBtnFace;

  //Schriftformatierung
  font.Name:='Arial';
  font.Size:=20;

  for i:=1 to 8 do
  begin
    canvas.TextOut(i*50+25,20,chr(96+i));    //schreibt Buchstaben über Spielfeld
    canvas.TextOut(25,i*50+20,inttostr(i));  //schreibt Zahlen über Spielfeld
  end;

end;

end.


bms - Di 25.04.06 09:30

Eigentlich wollte ich den Quellcode davon abhängig machen ob du es schafst den Beitragstext oben so zu formulieren, daß es jeder vernünftige Mensch versteht. Aber lassen wir das. Das nächste Mal.

Hier ein kurzes Beispiel wie das geht. Wenn du keine schwarzen Trennlinien haben willst, dann muß du neben Brush auch Pen eine Farbe geben.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure PaintX(Ax, Ay, AWidth: Word; ACan: TCanvas; ACol1, ACol2: TColor);
var
  x, y, x1, x2, y1, y2: Word;
  Col: array[Boolean] of TColor;
begin
  ACan.Brush.Style := bsSolid;
  Col[False] := ACol1; Col[True] := ACol2;

  for y := 0 to Ay - 1 do
  begin
    for x := 0 to Ax - 1 do
    begin
      ACan.Brush.Color := Col[Odd(x) xor Odd(y)];
      //ACan.Pen.Color := ACan.Brush.Color;

      x1 := x * AWidth; x2 := x1 + AWidth;
      y1 := y * AWidth; y2 := y1 + AWidth;

      ACan.Rectangle(x1, y1, x2, y2);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PaintX(8820, Canvas, clYellow, clGreen);
end;


Wenn du noch weiter zeichnen möchtest, dann würde ich mir vorher die Canvas Eigenschaften wie z.B. Farbe und Style sichern und nach getanner Arbeit wieder zuweisen.


dh - Di 25.04.06 09:41

Habe noch nie damit gearbeitet, aber Delphi bietet DrawGrid an. Damit lassen unter anderem auch Spielbretter, Heuristiken usw. erstellen. ( Sokoban, 5-Gewinnt usw )