Fertig.
Mein Konzept: Es gibt zwei Klassen. Eine verwaltet einen Spieler und die zweite verwaltet die Spielerliste:
Spieler:
Delphi-Quellcode:
TPlayer = class(TObject)
private
FName: String;
FPunkte: Integer;
FHasWon: Boolean;
procedure SetName(Name: String);
function GetName: String;
procedure SetPunkte(Punkte: Integer);
function GetPunkte: Integer;
function GetHasWon: Boolean;
public
property Name: String read GetName write SetName;
property Punkte: Integer read GetPunkte write SetPunkte;
property HasWon: Boolean read GetHasWon;
end;
Spielerliste:
Delphi-Quellcode:
TPlayerCollection = class(TList)
private
function Get(Index: Integer): TPlayer;
public
procedure Add(Item: TPlayer);
function Next(CurrentPlayer: Integer): TPlayer;
function IndexOf(Item: TPlayer): Integer;
procedure Free;
property Items[Index: Integer]: TPlayer read Get;
end;
Hat man das erstmal, ist die Programmierung kein Problem mehr und reduziert sich auf diese paar Zeilen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
SpielerListe := TPlayerCollection.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SpielerListe.Free;
end;
procedure TForm1.btnNamenClick(Sender: TObject);
var
i: Integer;
Spieler: TPlayer;
NewItem: TListItem;
begin
for i := 0 to SpinEdit1.Value - 1 do
begin
Spieler := TPlayer.Create;
Spieler.Name := InputBox('Spielername ' + IntToStr(i+1), 'Name des Spilers', IntToStr(i+1));
Spieler.Punkte := 201;
SpielerListe.Add(Spieler);
end;
for i := 0 to SpielerListe.Count - 1 do
begin
NewItem := ListView1.Items.Add;
NewItem.Caption := Spielerliste.Items[i].Name;
NewItem.SubItems.Add(IntToStr(Spielerliste.Items[i].Punkte));
end;
end;
procedure TForm1.btnStartClick(Sender: TObject);
begin
CurrentPlayerIdx := 0;
CurrentPlayer := SpielerListe.Items[CurrentPlayerIdx];
lblCurrentPlayer.Caption := Format('Spieler: %s', [CurrentPlayer.Name]);
end;
procedure TForm1.btnOKClick(Sender: TObject);
begin
CurrentPlayer.Punkte := CurrentPlayer.Punkte - sedtFirst.Value - sedtSecond.Value - sedtThird.Value;
if CurrentPlayer.HasWon then
ShowMessage(Format('Spieler %s hat gewonnen.', [CurrentPlayer.Name]));
Listview1.Items[CurrentPlayerIdx].SubItems[0] := IntToStr(CurrentPlayer.Punkte);
CurrentPlayer := SpielerListe.Next(CurrentPlayerIdx);
CurrentPlayerIdx := SpielerListe.IndexOf(CurrentPlayer);
lblCurrentPlayer.Caption := Format('Spieler: %s', [CurrentPlayer.Name]);
end;
Projekt im Anhang.
Nachtrag:
Jetzt könnte man sich noch eine Klasse TGame ausdenken von der man sich weitere Klassen für die verschiedenen Spiele ableitet, die sich dann um die Spielregeln kümmern.