Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Schachbrett (https://www.delphipraxis.net/174919-schachbrett.html)

fox67 17. Mai 2013 23:40

Schachbrett
 
Hallo
ich wollte eigentlich das 8 Damen problem programmieren und hab mal mit dem Schachbrett angefangen eigentlich dürfte das nicht schwer sein aber ein fehler hatt sich bei mir eingeschlichen den ich leider trotz 1/2 suchen und rumprobieren nicht finden kann. In jeder reihe werden am anfang zwei felder in der gleichen farbe gezeichnet keine Ahnung warum.
Delphi-Quellcode:
unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TFeld = class(Tobject)
  position :  Tpoint;
 private

 public

 end;
  TForm8 = class(TForm)
    Label1: TLabel;
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
    Felder : array[0..64] of TFeld;

    procedure position();
    procedure Zeichnen();
  end;


var
  Form8: TForm8;

implementation

{$R *.dfm}
procedure TForm8.Button1Click(Sender: TObject);
begin
zeichnen();
end;

procedure TForm8.FormCreate(Sender: TObject);
begin
position();
end;

procedure Tform8.position;
var
i,b,c : integer;
begin
for I := 0 to length(Felder) do
  begin
    felder[i] := Tfeld.create;
    felder[i].position.Y := I div 8;
    b := I div 8;
    c := b*8;
    felder[i].position.X := i -  c;
  end;
end;


procedure TForm8.Zeichnen;
var
i : integer;
schwarz : boolean;
begin
 schwarz := false;
for I := 0 to length(Felder) do
  begin
     if schwarz then
     begin
     image1.Canvas.Brush.Color := clblack;
     image1.Canvas.Rectangle(felder[i].position.X*50,felder[i].position.Y*50,felder[i].position.X*50+50, felder[i].position.Y*50+50);
       if not (I mod 8 = 0) then
         begin

         schwarz := false;
         end
         else
         begin

           showmessage(inttostr(i));
         end;
     end
     else
     begin
     image1.Canvas.Brush.Color := clwhite;
     image1.Canvas.Rectangle(felder[i].position.X*50,felder[i].position.Y*50,felder[i].position.X*50+50, felder[i].position.Y*50+50);
     if not (I mod 8 = 0) then
         begin

         schwarz := true;
         end
         else
         begin

           showmessage(inttostr(i));
         end;
     end;
    end;
end;

end.

nahpets 18. Mai 2013 00:08

AW: Schachbrett
 
Brauchst Du wirklich 65 Felder?

Bummi 18. Mai 2013 00:26

AW: Schachbrett
 
versuchs mal so ...

Delphi-Quellcode:
procedure Tform8.position;
var
i,b,c : integer;
begin
for I := 0 to length(Felder) do
  begin
    felder[i] := Tfeld.create;
    felder[i].position.y := I div 8;
    felder[i].position.x := I MOD 8;
  end;
end;


procedure TForm8.Zeichnen;
Const
 ColorArray:Array [boolean] of TColor=(clBlack,clWhite);
var
i : integer;
white:Boolean;
begin
white := true;
for I := 0 to length(Felder) do
  begin
     image1.Canvas.Brush.Color := ColorArray[white];
     if (i+1) mod 8 <> 0 then white := not White;
     image1.Canvas.Rectangle(felder[i].position.X*50,felder[i].position.Y*50,felder[i].position.X*50+50, felder[i].position.Y*50+50);
    end;
end;

nahpets 18. Mai 2013 09:55

AW: Schachbrett
 
aber bitte dabei bedenken:

Ein Schachbrett hat 64 Felder. Deine Definition
Delphi-Quellcode:
Felder : array[0..64] of TFeld;
enthält aber 65 Felder. Also entweder
Delphi-Quellcode:
Felder : array[0..63] of TFeld;
oder
Delphi-Quellcode:
Felder : array[1..64] of TFeld;
Ansonsten bleibt ein Fehler vorhanden, egal wie Du die Zeichenlogik änderst.

wendelin 29. Jan 2015 09:43

AW: Schachbrett
 
Hallo,
hier ist ein Fehler

Delphi-Quellcode:
procedure Tform8.position;
var
i,b,c : integer;
begin
for I := 0 to length(Felder) do      // muß lauten to (length(Felder) -1) sonst 'Range Check Error !
  begin
    felder[i] := Tfeld.create;
    felder[i].position.y := I div 8;
    felder[i].position.x := I MOD 8;
  end;
end;


procedure TForm8.Zeichnen;
Const
 ColorArray:Array [boolean] of TColor=(clBlack,clWhite);
var
i : integer;
white:Boolean;
begin
white := true;
for I := 0 to length(Felder) do   // muß lauten to (length(Felder) -1) sonst 'Range Check Error !
  begin
     image1.Canvas.Brush.Color := ColorArray[white];
     if (i+1) mod 8 <> 0 then white := not White;
     image1.Canvas.Rectangle(felder[i].position.X*50,felder[i].position.Y*50,felder[i].position.X*50+50, felder[i].position.Y*50+50);
    end;
end;
grüße Wendelin

himitsu 29. Jan 2015 09:46

AW: Schachbrett
 
Oder bis
Delphi-Quellcode:
High(Felder)
und das "Range Check Error" kommt leider nur, wenn man die Index-Prüfung aktiviert (Standard: aus) :wall:

baumina 29. Jan 2015 09:48

AW: Schachbrett
 
Fraglich ob 65 Felder wirklich Sinn machen.

mkinzler 29. Jan 2015 09:49

AW: Schachbrett
 
Zitat:

Zitat von himitsu (Beitrag 1288151)
Oder bis
Delphi-Quellcode:
High(Felder)
und das "Range Check Error" kommt leider nur, wenn man die Index-Prüfung aktiviert (Standard: aus) :wall:

Dann aber besser auch von Low(Felder)

Delphi-Quellcode:
for I := Low( Felder) to High(Felder) do

Der schöne Günther 29. Jan 2015 09:54

AW: Schachbrett
 
Ist nicht grade ein Schachbrett einer der vielleicht drei Fälle im Universum wo ein mehrdimensionales Array mal Sinn macht? :stupid:

Mikkey 29. Jan 2015 10:34

AW: Schachbrett
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1288154)
Ist nicht grade ein Schachbrett einer der vielleicht drei Fälle im Universum wo ein mehrdimensionales Array mal Sinn macht? :stupid:

Für das Ausgangsproblem wäre ein Array[1..8] of integer/TDame wahrscheinlich sinnvoller. es gibt wohl im Universum doch nur zwei Fälle :-P


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz