Home » Tutorials » Grafik und Spiele » Vier gewinnt

Vier gewinnt

Der letzte Schliff

Nachdem wir nun auch das Spiel laden und speichern können, sind wir eigentlich fertig. Eine Kleinigkeit gibt es aber trotzdem noch, die eventuell stört. Wir geben dem Spieler zwar die Möglichkeit, Einstellungen vorzunehmen, allerdings bleiben diese beim Beenden des Spiels nicht erhalten. Das ist natürlich ärgerlich, wenn immer derselbe spielt und er jedes mal seinen Namen neu eingeben muss.

Beim Speichern der Einstellungen ist natürlich kein Dialog nötig, da es für den Benutzer absolut uninteressant ist, wo gespeichert wird, solange alles funktioniert. Wir realisieren das Speichern hier über eine TMemIniFile:

procedure TFormEinstellungen.FormClose(Sender: TObject;
var Action: TCloseAction);
var
  ini: TMemIniFile;
begin
  ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'VierGewinnt.ini');
  try
    ini.WriteInteger('Grundeinstellungen', 'Felderbreite', FFelderbreite);
    ini.WriteInteger('Grundeinstellungen', 'Spieler1R', GetRValue(FSpieler1Farbe));
    ini.WriteInteger('Grundeinstellungen', 'Spieler1G', GetGValue(FSpieler1Farbe));
    ini.WriteInteger('Grundeinstellungen', 'Spieler1B', GetBValue(FSpieler1Farbe));
    ...
    ini.UpdateFile;
  finally
    ini.Free;
  end;
end;

Die Prozedur wird beim Schließen des Einstellungsdialoges ausgeführt. Zunächst wird die Datei erzeugt. ExtractFilePath(ParamStr(0)) gibt das Verzeichnis zurück, indem die exe liegt, also das Programmverzeichnis. In diesem wird dadurch die Datei „VierGewinnt.ini“ angelegt. Hier reicht uns diese Methode. Allerdings kann es zu Problemen kommen, wenn das Programm in einem Ordner liegt, in dem die Windows-UAC Schreibzugriffe unterbindet. Um das zu vermeiden sollte, zumindest in Anwendungen die weitergegeben werden sollen, das %AppData% Verzeichnis verwendet werden.

Gespeichert wird letztlich eine Textdatei, deren Zeilen wir einzeln hinzufügen können. Die Farben, die gespeichert werden, müssen wir dabei in ihre Bestandteile zerlegen. Am Computer bestehen Farben oft aus den drei Bestandteilen Rot, Grün und Blau ? RGB. Jedes Pixel auf dem Bildschirm besteht aus roten grünen und blauen Subpixeln. Je nach dem wie hell diese jeweils leuchten, ergibt sich daraus durch additive Mischung eine Farbe. Wenn alle voll leuchten, weiß; leuchtet keins ergibt sich schwarz. Normalerweise ist jede Farbe in 256 Helligkeiten unterteilt (von 0 bis 255). Daraus ergeben sich 256³ verschiedene Farben (~16,8mio ? 24bit Farbtiefe), was im Normalfall völlig ausreichend ist.

Mit UpdateFile werden dann die Änderungen gespeichert.

Wer das Ganze jetzt kompiliert, wird von Delphi eine Menge Fehlermeldungen bekommen. Um die Ini File nutzen zu können, müssen wir noch eine Unit einbinden. Ganz oben, direkt unter „Interface“ gibt es den Bereich Uses, wo schon einige Units aufgeführt sind, die am Anfang eingebunden werden. Diesen fügen wir jetzt noch inifiles hinzu, dann verschwinden auch die Fehlermeldungen. Die letzte Aufgabe für dieses Tutorial:

Aufgabe: Lade die gespeicherten Daten beim Öffnen des Dialoges wieder.

procedure TFormEinstellungen.FormCreate(Sender: TObject);
var
  ini: TMemIniFile;
begin
  ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'VierGewinnt.ini');
  try
    FFelderbreite := ini.ReadInteger('Grundeinstellungen', 'Felderbreite', 25);
    FSpieler1Farbe := RGB(ini.ReadInteger('Grundeinstellungen', 'Spieler1R', 0),
    ini.ReadInteger('Grundeinstellungen', 'Spieler1G', 255),
    ini.ReadInteger('Grundeinstellungen', 'Spieler1B', 0));
    FSpieler2Farbe := [...]
    FSpieler1Name := ini.ReadString('Grundeinstellungen', 'Spieler1Name', 'Spieler 1');
    FSpieler2Name := ini.ReadString('Grundeinstellungen', 'Spieler1Name', 'Spieler 2');
  finally
    ini.Free;
  end;
end;

Auch hier wird wieder erst die Datei geöffnet und dann zeilenweise ausgelesen. Die Funktion „RGB“ erwartet drei Zahlen von 0 bis 255 als Parameter und macht daraus dann eine Farbe.

Dass die Einstellungen auch wirklich beim Programmstart verfügbar sind, müssen wir am Anfang im Hauptformular noch EinstellungenUebernehmen aufrufen. Achtung! Der Aufruf im FormCreate führt zum Fehler, da es zu diesem Zeitpunkt das andere Formular noch nicht gibt. Daher verwenden wir die FormShow Routine. Angezeigt wird erst, wenn alle Formulare erzeugt wurden, dadurch gibt es keine Fehler mehr. Nach dem Übernehmen der Einstellungen starten wir ein neues Spiel. Dazu „drücken“ wir den Button für ein neues Spiel:

btnNeuClick(Sender);

Download Beispiel-Code „Vier gewinnt“