Thema: 4gewinnt

Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
734 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: 4gewinnt

  Alt 20. Mai 2017, 19:00
Hallo Wega

du solltest dir überlegen, die Shapes dynamisch zu erzeugen (eventuell auch, ob du effektiv Shapes verwenden willst oder nicht besser selbst etwas zeichnen willst).

Mit Shapes könntest du es so tun:

Delphi-Quellcode:
unit Unit95;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm4Gewinnt = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure ShapeMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
    FWerIstDran : integer;
    SColor : array[0..2] of TColor;
    FShapes : array[1..7,1..6] of TShape;
    FWerte : array[1..7, 1..6] of integer;
  public
    { Public-Deklarationen }
    procedure NeuesSpiel;
    procedure ZeigeSpielFeld;
  end;

var
  Form4Gewinnt: TForm4Gewinnt;

implementation

{$R *.dfm}


procedure TForm4Gewinnt.ZeigeSpielFeld;
var feldgroesse, dx, size, br, ho, x, y: Integer;
begin
    br := clientwidth div 7;
    ho := clientheight div 6;
    if br < ho then feldgroesse := br else feldgroesse := ho;
    size := round(0.8*feldgroesse);
    dx := (feldgroesse-size) div 2;

    for x := 1 to 7 do
     for y := 1 to 6 do
     begin
      FShapes[x,y].Width := size;
      FShapes[x,y].Height := size;
      FShapes[x,y].Left := (x-1)*feldgroesse+dx;
      FShapes[x,y].Top := (y-1)*feldgroesse+dx;
      FShapes[x,y].Brush.Color := SColor[FWerte[x,y]];
     end;
end;


procedure TForm4Gewinnt.FormCreate(Sender: TObject);
var x, y : integer;
begin
  SColor[0] := clwhite;
  SColor[1] := clred;
  SColor[2] := clblue;

  for x := 1 to 7 do
    for y := 1 to 6 do
    begin
      FShapes[x,y] := TShape.Create(Self);
      FShapes[x,y].Parent := Self;
      FShapes[x,y].Shape := stCircle;
      FShapes[x,y].Tag := x*10+y; // Wir weisen jedem Shape eine Nummer zu
      FShapes[x,y].OnMouseDown := ShapeMouseDown;
    end;

  NeuesSpiel;
end;

procedure TForm4Gewinnt.FormPaint(Sender: TObject);
begin
    ZeigeSpielFeld;
end;

procedure TForm4Gewinnt.FormResize(Sender: TObject);
begin
  ZeigeSpielFeld;
end;

procedure TForm4Gewinnt.NeuesSpiel;
var x, y : integer;
begin
  for x := 1 to 7 do
    for y := 1 to 6 do
      FWerte[x,y] := 0;

  FWeristDran := 1;
  ZeigeSpielFeld;
end;


procedure TForm4Gewinnt.ShapeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var zeile, spalte, nr : integer;
begin
  if Sender is TShape then
  begin
    nr := ( Sender as TShape ).Tag;
    spalte := nr div 10;

    for zeile := 6 downto 1 do
      if ( FWerte[spalte,zeile] = 0 ) then
      begin
        FWerte[spalte,zeile] := FWerIstDran;
        if FWerIstDran = 1 then FWerIstDran := 2 else FWerIstDran := 1;
        ZeigeSpielFeld;
        break;
      end;
  end;
end;

end.

ZeigeSpielFeld;
Zeigt das Spielfeld neu an

FormCreate
Die Farben der Spielsteine werden gesetzt,
die Shapes werden erzeugt; wir weisen dabei jedem Shape eine Nummer (Tag) zu. Tag nutzen wir weiter unten im ShapeMouseDown. NeuesSpiel wird aufgerufen

FormPaint
Wenn das Formular neu gezeichnet werden soll...

FormResize
Wenn der User die Formulargrösse ändert...

NeuesSpiel
Zurücksetzen des Spielfelds auf 0.
Wählen, wer beginnt.
Spielfeld anzeigen.

ShapeMouseDown
User klickt auf ein Shape. Wir bestimmen anhand der Tagnummer des angeklickten Shapes die Spalte, in welche geklickt wurde. Wir prüfen von unten nach oben, ob noch ein Feld frei ist. Wenn Ja, dann setzen wir den Spielstein, der andere Spieler ist dran, wir zeigen das Spielfeld an.


Du kannst den Code 1:1 verwenden - Neues Projekt öffnen - Formname anpassen, unit Name anpassen - und weiter programmieren .

Du könntest zum Beispiel ein weiteres Shape W definieren. Wenn ein Spieler einen neuen Spielstein in Spalte S setzt, dann lässt du W in Spalte S von oben nach unten fallen.

Wie erwähnt: Du könntest die ganze Sache ohne Shapes wesentlich schöner bauen. Aber eine gute Taktik ist sicher spannender. (Du weisst ja sicher, dass 4gewinnt schwach gelöst ist.)
Michael Gasser

Geändert von Michael II (21. Mai 2017 um 00:33 Uhr) Grund: DeddyH hat natürlich Recht ;-)
  Mit Zitat antworten Zitat