AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Damespiel

Ein Thema von Dekra · begonnen am 28. Dez 2017 · letzter Beitrag vom 28. Dez 2017
Antwort Antwort
Dekra

Registriert seit: 28. Dez 2017
5 Beiträge
 
#1

Damespiel

  Alt 28. Dez 2017, 15:21
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.

Mit freundlichen Grüßen
Dekra

Geändert von Luckie (28. Dez 2017 um 16:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Damespiel

  Alt 28. Dez 2017, 16:09
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dekra

Registriert seit: 28. Dez 2017
5 Beiträge
 
#3

AW: Damespiel

  Alt 28. Dez 2017, 16:16
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...
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Damespiel

  Alt 28. Dez 2017, 16:20
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.
  Mit Zitat antworten Zitat
Dekra

Registriert seit: 28. Dez 2017
5 Beiträge
 
#5

AW: Damespiel

  Alt 28. Dez 2017, 16:25
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

Geändert von Dekra (28. Dez 2017 um 16:27 Uhr)
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Damespiel

  Alt 28. Dez 2017, 16:27
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!
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.672 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Damespiel

  Alt 28. Dez 2017, 16:28
Moin...

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

Schau dir mal den Styleguide an. Das läßt sich deutlich besser lesen. 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.

Geändert von haentschman (28. Dez 2017 um 17:21 Uhr)
  Mit Zitat antworten Zitat
Dekra

Registriert seit: 28. Dez 2017
5 Beiträge
 
#8

AW: Damespiel

  Alt 28. Dez 2017, 16:34
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.

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

Geändert von Dekra (28. Dez 2017 um 16:42 Uhr)
  Mit Zitat antworten Zitat
hoika
Online

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.878 Beiträge
 
Delphi XE4 Professional
 
#9

AW: Damespiel

  Alt 28. Dez 2017, 16:51
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
Heiko

Geändert von hoika (28. Dez 2017 um 16:53 Uhr)
  Mit Zitat antworten Zitat
Dekra

Registriert seit: 28. Dez 2017
5 Beiträge
 
#10

AW: Damespiel

  Alt 28. Dez 2017, 16:59
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!!!!! Das probier ich direkt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf