AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

4gewinnt

Ein Thema von Wega2104 · begonnen am 20. Mai 2017 · letzter Beitrag vom 21. Mai 2017
 
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
744 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
 


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 23:06 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