Zitat Zitat von P-Games Beitrag anzeigen
Ja also das Projekt besteht aus mehreren Forms (und Units dementsprechend). Speichern kann man es überhaupt nicht. Es ist eben ein ausführendes Programm, dessen "Spielaufgabe" in einem gelöst werden muss. Danach beedet man alles.
Versuchs mal mit OOP, damit dürftest du dein Projekt übersichtlicher halten können. Dafür legst du einfach neue Units an (ohne Formular!) und definierst dort Klassen für alle möglichen Objekte. Hier beispielsweise ein Auszug aus der Unit "Football.pas" eines meiner Projekte (Football = American Football).

Code:
unit Football;

interface

uses
  SysUtils, Classes;

type
  TFieldSide = (fsTeam1,   fsTeam2,   fs50Yard);
  TWeather   = (weSunny,   weRain,    weHot);
  TBallOwner = (boTeam1,   boTeam2);
  TGameState = (gsPlaying, gsKickOff, gsPunt);

  TFootballGame = Class
    private
      fgLogStrings: TStrings;
      fgTeam1Name : String;
      fgTeam2Name : String;
      // --------------------
      fgBallOnYard: Integer;
      fgBallOnSide: TFieldSide;
      fgBallOwner : TBallOwner;
      fgPlay      : Integer;
      fgGameState : TGameState;
      // --------------------
      fgWeather: TWeather;
      // ####################
      procedure AddToLog(S: String);
      procedure PrintStatus;
    public
      constructor Create(Log: TStrings);
      destructor Free;
      procedure Toss;
      [...]
      // ####################
      property Team1: String read fgTeam1Name write fgTeam1Name;
      property Team2: String read fgTeam2Name write fgTeam2Name;
  end;

implementation

constructor TFootballGame.Create(Log: TStrings);
begin
  fgLogStrings := Log;
  fgBallOnSide := fs50Yard;
  fgBallOnYard := 50;

  // Calculate Weather
  case (Random(11)) of
    0..6  : fgWeather := weSunny; // 60% Sunny
    7..8  : fgWeather := weHot;   // 20% Hot
    9..10 : fgWeather := weRain;  // 20% Rain
  end;
  [...]
end;

destructor TFootballGame.Free;
begin
  AddToLog('And off we go...');
end;

procedure TFootballGame.Toss;
begin
  AddToLog('Well I guess it''s time for a toss.');
  case Random(2) of
    0: begin
         fgBallOwner  := boTeam1;
         fgBallOnSide := fsTeam1;
         fgBallOnYard := 20;      // Just always place it on 20
         AddToLog('The ' + fgTeam1Name + ' are kicking.');
       end;
    1: begin
         fgBallOwner  := boTeam2;
         fgBallOnSide := fsTeam2;
         fgBallOnYard := 20;      // Just always place it on 20
         AddToLog('The ' + fgTeam2Name + ' are kicking.');
       end;
  end;
  fgPlay := 1;
  fgGameState := gsKickOff;
  PrintStatus();
end;

procedure TFootballGame.PrintStatus;
var
  BallSide: String;
begin
  case fgBallOnSide of
    fsTeam1 : BallSide := fgTeam1Name + ' ' + IntToStr(fgBallOnYard);
    fsTeam2 : BallSide := fgTeam2Name + ' ' + IntToStr(fgBallOnYard);
    fs50Yard: BallSide := 'the 50 Yard Line'
  end;
  AddToLog('');
  AddToLog('----------------------------------------');
  AddToLog('Ball''s on ' + BallSide);
  AddToLog('----------------------------------------');
  if fgGameState = gsPlaying then
    case fgBallOwner of
      boTeam1: AddToLog(fgTeam1Name + ' ' + IntToStr(fgPlay));
      boTeam2: AddToLog(fgTeam2Name + ' ' + IntToStr(fgPlay));
    end;
end;

procedure TFootballGame.AddToLog(S: String);
begin
  fgLogStrings.Add(S);
end;

[...]

end.
Dann bindest du das ganze in deinem Formular per uses ein und kannst dann bequem die Klasse wie jede andere nutzen. Also bei mir z.B.

Code:
var
  Football: TFootballGame;
begin
  Frame1.Visible := False;
  Frame2.Visible := True;
  try
    Football := TFootballGame.Create(Log.Lines);
    Football.Team1 := Team1.Text;
    Football.Team2 := Team2.Text;
    Football.Toss;
  finally
    Football.Free;
  end;
Wenn du das für Spieler, Teams und das Spiel an sich jeweils einzeln regelst und die Daten für Teams etc. aus ini/xml ausliest (nicht im Code festlegst) ist das Spiel schonmal viel dynamischer zu meistern.