Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Damespiel (https://www.delphipraxis.net/194725-damespiel.html)

Dekra 28. Dez 2017 14:21

Damespiel
 
Schönen Guten Tag,
Meine Aufgabe ist es ein Damespiel zu entwickeln. Mein Problem bei der Programmierung bezieht sich auf den Restet im Falle eines ungültigen Zuges. Dieser wird bei meiner Anwendung trotz vorhandener Prozedur nicht ausgeführt. Wäre bitte jemand so freundlich und sieht einmal drüber?

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Grids, Menus, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
Type Feld = Array [1..8, 1..8] of Integer;
  var a : Feld;
  var zaehler: byte;
    var Hoehe, Breite, testerX, testerY: Integer;
var dran : boolean;

 procedure SpielFeld() ;
var i, j : Integer ;
  begin
   for i := 1 to 8 do begin
  for j := 1 to 8 do begin
    a[i,j] := 0 ;
    form1.stringgrid1.cells[i-1,j-1]:= IntToStr (a[i,j]);
end;
end; // 0 = leere Felder (egal welche Farbe)


for i := 1 to 8 do begin
  for j := 1 to 3 do begin
    if (i MOD 2 = 0) xor (j mod 2 = 0)  then begin
    a[i,j] := 1;
    form1.stringgrid1.cells[i-1,j-1]:= IntToStr (a[i,j]);
end;
end;
end; // 1 = weiße Spielsteine (2 ---> weiße Dame)

for i := 1 to 8 do begin
  for j := 6 to 8 do begin
    if (i MOD 2 = 0) xor (j mod 2 = 0)  then begin
    a[i,j] := 3;
    form1.stringgrid1.cells[i-1,j-1]:= IntToStr (a[i,j]);
end;
end;
end; // 3 = schwarze Spielsteine (4 ---> schwarze Dame)

Form1.Image1.Height:= Hoehe * 8;
Form1.Image1.Width:= Breite * 8; // 8*8 Felder

for i := 1 to 8 do begin
  for j := 1 to 8 do begin
    if (i mod 2 = 0) xor (j mod 2 = 0) then
    begin
      Form1.Image1.Canvas.Brush.Color:= clblack;

      case a[i,j] of
      1: begin
      Form1.Image1.Canvas.Brush.Color:= clBlue;
      Form1.Image1.Canvas.Ellipse((i-1)*Breite,(j-1)*Hoehe,(i)* Breite,(j)*Hoehe);
      end;
      3: begin
        Form1.Image1.Canvas.Brush.Color:= clRed;
        Form1.Image1.Canvas.Ellipse((i-1)*Breite,(j-1)*Hoehe,(i)* Breite,(j)*Hoehe);
end;
end;
end

      else
      begin
      Form1.Image1.Canvas.Brush.Color:= clwhite;
      Form1.Image1.Canvas.Rectangle((i-1)*Breite,(j-1)*Hoehe,(i)* Breite,(j)*Hoehe);
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  zaehler:= 0; // zählt wie oft Maus geklickt wurde
  dran := true;   // Wer ist dran? 0 = unten; 1 = oben
  Hoehe := 40;
  Breite := 40;
  SpielFeld();
end;

 procedure visual (i, j : Integer);
 begin
  form1.stringgrid1.cells[i-1,j-1]:= IntToStr (a[i,j]);
  form1.label1.caption:= inttostr (i) ;
    form1.label2.caption:= inttostr (j) ;

  case a[i,j] of
       0: begin
        Form1.Image1.Canvas.Brush.Color:= clBlack;
        Form1.Image1.Canvas.Rectangle((i-1)*Breite,(j-1)*Hoehe,(i)* Breite,(j)*Hoehe);
       end;
      1: begin
      Form1.Image1.Canvas.Brush.Color:= clBlue;
      Form1.Image1.Canvas.Ellipse((i-1)*Breite,(j-1)*Hoehe,(i)* Breite,(j)*Hoehe);
      end;
      3: begin
        Form1.Image1.Canvas.Brush.Color:= clRed;
        Form1.Image1.Canvas.Ellipse((i-1)*Breite,(j-1)*Hoehe,(i)* Breite,(j)*Hoehe);

    end;
  end;
 end;

 procedure reset (i,j,testerX,testerY :Integer);
 begin
a[testerx,testery]:= 3;
a[i,j]:= 0;


 end;


 procedure test (i,j,testerX,testerY :Integer);
begin
if (a[i,j]= 1) then showmessage('Ungültiger Zug');

if (j=testery-1) and (i=1+testerx) or (i=testerx-1) then begin

end

else begin
reset(i,j,testerX,testerY);
showmessage('Ungültiger Zug');



end;



 end;


 procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i, j: Integer;
begin

i:= X DIV 40 + 1;
j:= Y DIV 40 + 1;

if dran=true then begin // wer dran ist

             if (zaehler=0) and (a[i,j]=3) then begin

                                a[i,j]:= 0;
                                inc(zaehler);
                                 testerX:=i; //Hilfsvariablen um über Gültigkeit in Procedure Test zu prüfen
                                 testerY:=j;
end

            else if (zaehler=1) and (a[i,j]=0) then begin

                                a[i,j]:= 3;
                                 dec(zaehler);
                                 //dran:=false;

                                 test(i,j,testerx,testery);

 end ;
            end

            else if (a[i,j]= 1) or (a[i,j]= 2) then begin
            showmessage('Nimm deinen eigenen Stein du Schummler!');
end ;

form1.stringgrid1.cells[i-1,j-1]:= IntToStr (a[i,j]);
 visual(i,j);
 refresh;
end;





end.
Wäre es möglich das jemand drüber schaut und mir ein paar Tipps zur Realisierung gibt? Und wo liegt mein Denkfehler? BITTE BEACHTEN: Es ist noch in der Entwicklung und ich programmiere erst seit 2 Jahren. Es gibt bestimmt einige Verbesserungsvorschläge, für die ich übrigens auch sehr sehr dankbar wäre.

Ich bedanke mich schon einmal im Vorfeld für die Arbeit, die sich einige mit meinem Programmierversuch machen. :-D

Mit freundlichen Grüßen
Dekra

Luckie 28. Dez 2017 15:09

AW: Damespiel
 
Drüber schauen schon, aber nicht bei einer so grausamen Formatierung.

Delphi-Quellcode:
end;
end;
end;
end;
Zu was gehört denn welches end;? Formatier das bitte mal ortdentlich mit entsprechenden Einrückungen. Dann siehst du deinen Fehler vielleicht schon selbst.

Dekra 28. Dez 2017 15:16

AW: Damespiel
 
Zitat:

Zitat von Luckie (Beitrag 1389783)
Drüber schauen schon, aber nicht bei einer so grausamen Formatierung.

Delphi-Quellcode:
end;
end;
end;
end;
Zu was gehört denn welches end;? Formatier das bitte mal ortdentlich mit entsprechenden Einrückungen. Dann siehst du deinen Fehler vielleicht schon selbst.

Ich werde auf jeden Fall probieren es anders zu formatieren. Mir ging es ja auch nur um den Reset. Trotzdem danke , dass du mal es angesehen und geantwortet hast, hätte ehrlich gesagt nicht damit gerechnet, dass es sich überhaupt jmd anschaut. Aber etwas mehr Freundlichkeit wäre trotzdem nett. Du hast ja schließlich auch mal klein angefangen...

LTE5 28. Dez 2017 15:20

AW: Damespiel
 
Zitat:

Drüber schauen schon, aber nicht bei einer so grausamen Formatierung.
Warum nutzen Schulen eigentlich nicht die Starterversionen und noch immer dieses grausame Lazarus?

Delphi Starter, Codeansicht, STRG+D und das Grauen hat ein Ende.

Dekra 28. Dez 2017 15:25

AW: Damespiel
 
Zitat:

Zitat von LTE5 (Beitrag 1389787)
Zitat:

Drüber schauen schon, aber nicht bei einer so grausamen Formatierung.
Warum nutzen Schulen eigentlich nicht die Starterversionen und noch immer dieses grausame Lazarus?

Delphi Starter, Codeansicht, STRG+D und das Grauen hat ein Ende.

Das kann ich leider nicht beantworten. Ich glaube aber es liegt daran, dass unser Gymnasium nicht das Geld hat. Wir haben nicht mal ein Gebäude das schimmelfrei ist. Im Chemieraum kommen sogar die Platten von der Decke, weswegen der abgesperrt wurde. Da bleibt echt kein Geld für kostenpflichtige Software (falls sie nicht opensource ist?) . Und danke für den Tipp :-)

LTE5 28. Dez 2017 15:27

AW: Damespiel
 
Zitat:

Ich glaube aber es liegt daran, dass unser Gymnasium nicht das Geld hat. Wir haben nicht mal ein Gebäude das schimmelfrei ist.
Zitat:

(falls sie nicht opensource ist?)
Delphi Starter ist kostenlos und nicht Open Source. Open Source bedeutet nicht kostenlos.

Na dann melde das mal fix der Aufsichtsbehörde. Dann ist eure Schule schneller zu als du gucken kannst, was zu begrüßen ist.
Schimmel ist ein Feind und damit ist nicht zu spaßen. Schule hin oder her. Für die Zeit werdet ihr dann woanders untergebracht!

haentschman 28. Dez 2017 15:28

AW: Damespiel
 
Moin...8-)

Weniger als nix muß du schon ausgeben. :P
https://www.embarcadero.com/de/produ.../free-download

Schau dir mal den Styleguide an. Das läßt sich deutlich besser lesen. 8-) https://www.delphi-treff.de/object-pascal/styleguide/

Weil Weihnachten ist mal formatiert:
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Grids, Menus, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
type
  Feld = array[1..8, 1..8] of Integer;

var
  a: Feld;
  zaehler: byte;
  Hoehe, Breite, testerX, testerY: Integer;
  dran: boolean;

procedure SpielFeld();
var
  i, j: Integer;
begin
  for i := 1 to 8 do
  begin
    for j := 1 to 8 do
    begin
      a[i, j] := 0;
      form1.stringgrid1.cells[i - 1, j - 1] := IntToStr(a[i, j]);
    end;
  end; // 0 = leere Felder (egal welche Farbe)


  for i := 1 to 8 do
  begin
    for j := 1 to 3 do
    begin
      if (i mod 2 = 0) xor (j mod 2 = 0) then
      begin
        a[i, j] := 1;
        form1.stringgrid1.cells[i - 1, j - 1] := IntToStr(a[i, j]);
      end;
    end;
  end; // 1 = weiße Spielsteine (2 ---> weiße Dame)

  for i := 1 to 8 do
  begin
    for j := 6 to 8 do
    begin
      if (i mod 2 = 0) xor (j mod 2 = 0) then
      begin
        a[i, j] := 3;
        form1.stringgrid1.cells[i - 1, j - 1] := IntToStr(a[i, j]);
      end;
    end;
  end; // 3 = schwarze Spielsteine (4 ---> schwarze Dame)

  Form1.Image1.Height := Hoehe * 8;
  Form1.Image1.Width := Breite * 8; // 8*8 Felder

  for i := 1 to 8 do
  begin
    for j := 1 to 8 do
    begin
      if (i mod 2 = 0) xor (j mod 2 = 0) then
      begin
        Form1.Image1.Canvas.Brush.Color := clblack;

        case a[i, j] of
          1:
            begin
              Form1.Image1.Canvas.Brush.Color := clBlue;
              Form1.Image1.Canvas.Ellipse((i - 1) * Breite, (j - 1) * Hoehe, (i) * Breite, (j) * Hoehe);
            end;
          3:
            begin
              Form1.Image1.Canvas.Brush.Color := clRed;
              Form1.Image1.Canvas.Ellipse((i - 1) * Breite, (j - 1) * Hoehe, (i) * Breite, (j) * Hoehe);
            end;
        end;
      end
      else
      begin
        Form1.Image1.Canvas.Brush.Color := clwhite;
        Form1.Image1.Canvas.Rectangle((i - 1) * Breite, (j - 1) * Hoehe, (i) * Breite, (j) * Hoehe);
      end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  zaehler := 0; // zählt wie oft Maus geklickt wurde
  dran := true; // Wer ist dran? 0 = unten; 1 = oben
  Hoehe := 40;
  Breite := 40;
  SpielFeld();
end;

procedure visual(i, j: Integer);
begin
  form1.stringgrid1.cells[i - 1, j - 1] := IntToStr(a[i, j]);
  form1.label1.caption := inttostr(i);
  form1.label2.caption := inttostr(j);

  case a[i, j] of
    0:
      begin
        Form1.Image1.Canvas.Brush.Color := clBlack;
        Form1.Image1.Canvas.Rectangle((i - 1) * Breite, (j - 1) * Hoehe, (i) * Breite, (j) * Hoehe);
      end;
    1:
      begin
        Form1.Image1.Canvas.Brush.Color := clBlue;
        Form1.Image1.Canvas.Ellipse((i - 1) * Breite, (j - 1) * Hoehe, (i) * Breite, (j) * Hoehe);
      end;
    3:
      begin
        Form1.Image1.Canvas.Brush.Color := clRed;
        Form1.Image1.Canvas.Ellipse((i - 1) * Breite, (j - 1) * Hoehe, (i) * Breite, (j) * Hoehe);

      end;
  end;
end;

procedure reset(i, j, testerX, testerY: Integer);
begin
  a[testerX, testerY] := 3;
  a[i, j] := 0;
end;

procedure test(i, j, testerX, testerY: Integer);
begin
  if (a[i, j] = 1) then
    showmessage('Ungültiger Zug');

  if (j = testerY - 1) and (i = 1 + testerX) or (i = testerX - 1) then
  begin
    // fehlt hier was?
  end
  else
  begin
    reset(i, j, testerX, testerY);
    showmessage('Ungültiger Zug');
  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i, j: Integer;
begin

  i := X div 40 + 1;
  j := Y div 40 + 1;

  if dran = true then
  begin // wer dran ist
    if (zaehler = 0) and (a[i, j] = 3) then
    begin
      a[i, j] := 0;
      inc(zaehler);
      testerX := i; //Hilfsvariablen um über Gültigkeit in Procedure Test zu prüfen
      testerY := j;
    end
    else
      if (zaehler = 1) and (a[i, j] = 0) then
      begin
        a[i, j] := 3;
        dec(zaehler);
        //dran:=false;
        test(i, j, testerX, testerY);
      end;
  end
  else
    if (a[i, j] = 1) or (a[i, j] = 2) then
    begin
      showmessage('Nimm deinen eigenen Stein du Schummler!');
    end;

  form1.stringgrid1.cells[i - 1, j - 1] := IntToStr(a[i, j]);
  visual(i, j);
  refresh;
end;

end.

Dekra 28. Dez 2017 15:34

AW: Damespiel
 
Zitat:

Zitat von LTE5 (Beitrag 1389791)
Zitat:

Ich glaube aber es liegt daran, dass unser Gymnasium nicht das Geld hat. Wir haben nicht mal ein Gebäude das schimmelfrei ist.
Zitat:

(falls sie nicht opensource ist?)
Delphi Starter ist kostenlos und nicht Open Source. Open Source bedeutet nicht kostenlos.

Na dann melde das mal fix der Aufsichtsbehörde. Dann ist eure Schule schneller zu als du gucken kannst, was zu begrüßen ist.
Schimmel ist ein Feind und damit ist nicht zu spaßen. Schule hin oder her. Für die Zeit werdet ihr dann woanders untergebracht!

Dann werde ich die Info mal durchgeben. Danke für die Erklärung und das formatieren. :-D

Da hat erstmal nix gefehlt. Ich wollte nur eine Bedingung am eine flasche Eingabe ausfindig zu machen.

Und mit der Schule. Ich bin da nur noch 10 Wochen. Dann bin ich fertig. Aber melden werde ich das auch auf jeden Fall

hoika 28. Dez 2017 15:51

AW: Damespiel
 
Hallo,
ich verstehe den Code nicht.

Aber 2 Ansätze:
1. Warum testet du nicht vorher, ob der Zug korrekt ist.
2. Erzeuge ein zweites Feld-Array b, kopiere das a in das b vor dem Zug,
und wenn der Zug falsch ist, schreibst du b wieder auf a zurück.

das mit dem Formatieren war nicht böse gemeint,
nur ist es schon schwer genug, fremden Code zu lesen und wenn dann die Strukturen (if, for) nicht sofort
bei der Anzeige erkennbar sind, wird es schwer.

geht auch mit Lazarus:
https://forum.lazarus.freepascal.org...?topic=16432.0

Dekra 28. Dez 2017 15:59

AW: Damespiel
 
Zitat:

Zitat von hoika (Beitrag 1389798)
Hallo,
ich verstehe den Code nicht.

Aber 2 Ansätze:
1. Warum testet du nicht vorher, ob der Zug korrekt ist.
2. Erzeuge ein zweites Feld-Array b, kopiere das a in das b vor dem Zug,
und wenn der Zug falsch ist, schreibst du b wieder auf a zurück.

das mit dem Formatieren war nicht böse gemeint,
nur ist es schon schwer genug, fremden Code zu lesen und wenn dann die Strukturen (if, for) nicht sofort
bei der Anzeige erkennbar sind, wird es schwer.

geht auch mit Lazarus:
https://forum.lazarus.freepascal.org...?topic=16432.0

Das ist eine richtig gute Idee. Dankeschön!!!!!:-D Das probier ich direkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 Uhr.

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