Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi WordSteal/Wordox/Kreutzworträtselfeld realisieren (https://www.delphipraxis.net/186380-wordsteal-wordox-kreutzwortraetselfeld-realisieren.html)

rhodan 29. Aug 2015 23:19


WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Hallo!

Ich arbeite seit kurzem an einer art Scrabble-Löser. Defakto soll es für die App WORDOX sein, ist aber quasi das selbe.

Ich habe 6 zufällige buchstaben aus denen ich auf einem 9x9 Zellen-Feld ein wort legen muss. Pro Buchstabe ein punkt, wer zuerst 25 buchstaben hat gewinnt, wobei man worte "klauen" kann, d.h legt der Gegner "Hund" und ich erweitere mit einem "E" habe ich alle punkte gestohlen.

Nun zu meiner Frage:
Ich habe ne menge recherchiert, Hagens "DAWG" Code zum schnellen suchen in einem wörterbuch ist grossartig. ich kann in meinem wörterbuch suchen und auch schon den Buchstabensalat lösen.

Aber wie realisiere ich das Spielfeld?
ich arbeite zur zeit mit einem Stringgrid und lese zeile für zeile in einen string ein, allerdings funktioniert das nicht so wie gewünscht.

- die buchstaben müssen anhand der felder ausgelesen werden/mit dem wörterbuch verglichen werden und mögliche Prefixe/Suffixe sollen angezeigt werden anhand der mir zur verfügung stehenden buchstaben. Liegt also schon "Hund" und einer der 6 buchstaben die ich legen darf ist ein "E", soll "Hunde" vorgeschlagen werden. etc etc.

- es sollen also quasi ALLE wörter die auf dem brett liegen eingelesen werden und geprüft werden ob ich sie mit dem vorhandenen 6 buchstaben erweitern kann.

Hat jemand ne Idee wie ich das Spielbrett realisiere so das es am besten mit dem wörterbuch abgeglichen werden kann?
vielleicht bin ich mit dem Grid ja auch auf dem holzweg

bin für hilfe dankbar

robin

Perlsau 29. Aug 2015 23:31

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Zitat:

Zitat von rhodan (Beitrag 1313892)
Aber wie realisiere ich das Spielfeld?

Ich würde mir als allererstes eine Struktur überlegen, die es mir erlaubt, die Darstellung von der Datenhaltung zu trennen. Das bedeutet, daß du nicht dein StringGrid dazu mißbrauchst, herauszufinden, welcher Buchstabe in welchem Feld liegt. Zur Datenhaltung bietet sich ein zweidimensionales Array an:

Delphi-Quellcode:
Spielfeld : Array[0..8, 0..8] of Char;
Dann schreibst du dir eine Methode, die den Inhalt von Spielfeld in dein StringGrid überträgt:

Delphi-Quellcode:
Procedure TFormMain.SpielfeldAktualisieren;
Var
  Spalte,Zeile : Integer;
begin
  For Spalte := 0 To 8 Do
    For Zeile := 0 To 8 Do
      MyGrid.Cells[Spalte,Zeile] := Spielfeld[Spalte,Zeile];
end;
... ungetestet, da schnell hier reingetippt ...

Falls du dein StringGrid mit Titelzeilen und Zeilenindikator versehen willst, verschieben sich natürlich die entsprechenden Zell-Koordinaten. In diesem Fall würde ich das Array gleich als [1..9, 1..9] deklarieren.

Sir Rufo 29. Aug 2015 23:35

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Ein Buchstabe ist immer dann am Wortanfang, wenn das linke Feld frei ist (Wort steht rechts vom Buchstaben) oder wenn das Feld darüber frei ist (Wort steht darunter). Alle anderen Buchstaben sind einfach nur Teil eines Wortes.

Reicht das schon als Hinweis?

rhodan 29. Aug 2015 23:57

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
hmm.

ich hab mal nen bild angehängt.
ich hatte mir das so vorgestellt das ich die schon gelegten wörter in dem tool dann selbst eingebe (sowohl die des gegners als auch meine) und dann anhand der 6 spielbuchstaben mit dem wörterbuch verglichen wird welches ich erweitern kann.
das array klingt gut, muss mich da reinlesen. kann mir das aber in der praxis noch nicht wirklich vorstellen..

momentan wird die zeile eingelesen auf knopfdruck via CommaText, allerdings ohne die leerzeichen leider.

wenn ich also ein array benutze und das grid weglasse...womit arbeite ich dann als darstellung? Labels? irgendwie muss ich allerdings die worte die schon gelegt wurden realisieren.

blawen 30. Aug 2015 00:18

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Zitat:

Zitat von rhodan (Beitrag 1313897)
wenn ich also ein array benutze und das grid weglasse...womit arbeite ich dann als darstellung? Labels?

Die Datenmanipulation machst Du mit Hilfe des Arrays. Für die optische Ausgabe übergibst Du die Daten aus dem Array an Dein StringGrid.
So hast Du eine strikte Trennung zwischen der eigentlichen Logik und der GUI.

Perlsau 30. Aug 2015 00:33

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Zitat:

Zitat von rhodan (Beitrag 1313897)
wenn ich also ein array benutze und das grid weglasse...womit arbeite ich dann als darstellung? Labels? irgendwie muss ich allerdings die worte die schon gelegt wurden realisieren.

Davon, das Grid wegzulassen, war nicht die Rede, was du schnell erkennen kannst, wenn du dir meinen geposteten Quellcode nochmal genau anschaust. Dort habe ich dir auf die Schnelle eine Methode geschrieben, die den Inhalt des Arrays in ein Grid überträgt. Diese Methode rufst du immer dann auf, wenn sich in deinem Array was geändert hat.

Ein zweidimenstionales Array ist leichter zu handhaben als der Umgang mit dem Grid-Array (MyGrid.Cells[Spalte,Zeile]), das ja letztendlich auch nur ein zweidimensionales Array ist. Welche Probleme hast du denn damit, ein Array zu verwenden? Spätestens wenn du zum Buchstaben noch weitere Daten verwalten willst (z.B. von wem der Buchstabe gelegt wurde), kann das StringGrid-Array nicht mehr mithalten, ein Array eines entsprechenden Records dagegen schon:
Delphi-Quellcode:
Type
  TCharRek = Record
    Buchstabe : Char;
    Benutzer : String;
  end;

Var
  Spiel : Array[1..9,1..9] of TCharRek;

rhodan 30. Aug 2015 00:45

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
@Perlsau

mir fehlt die praxis diesbezüglich..
ich hab viel formelberechnungen mit delphi gemacht und in labels ausgegeben und vor einigen jahren mit INDY hantiert und sachen runtergeladen/sortiert..aber arrays selten benutzt.
ich lese mich da rein und komme wieder.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  worte: string;
  i : integer;
begin
  for i := 0 to 0 do
     worte := playgrid.Rows[i].CommaText;
  edit1.text := StringReplace(worte, ',', '', [rfReplaceAll]);
end;
das war mein kläglicher versuch das grid in der ersten row einzulesen um es dann (später) mit nem dictionary textfile zu vergleichen. ich frage mich wie ich den lesevorgang mit dem array verbinde.
ich schaue mir morgen mal ein paar tutorials zu dem thema an.

danke euch

Perlsau 30. Aug 2015 02:25

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren
 
Das Array ist doch nur ein Spiegel desselben Array, das im Grid existiert. Du kannst das Array genauso ansprechen wie das Grid:
Delphi-Quellcode:
// kopiert ein Wort in das Array
Procedure WortInArrayKopieren(Const Wort, Benutzer : String; Const Horizontal : Boolean; Const Zeile,Spalte : Integer);
Var
  i,
  L, // Wortlänge
  vL : Integer; // verfügbare Länge

begin
  L := Length(Wort);
  If Horizontal
   Then
     vL := 10 - Spalte
   Else
     vL := 10 - Zeile;

  If vL < L // wenn der verfügbare Platz kleiner ist als die Wortlänge
   Then
     ShowMessage('Der verfügbare Platz reicht nicht aus')
   Else
  Begin
    i := 0;
    If Horizontal Then
    Begin
      Inc(i);
      For L := Spalte To 0 Do
      Begin
        Spiel[L,Zeile].Buchstabe := Wort[i]
        Spiel[L,Zeile].Benutzer := Benutzer;
      End;
    End Else
    Begin
      Inc(i);
      For L := Spalte To 0 Do
      Begin
        Spiel[Spalte,L].Buchstabe := Wort[i]
        Spiel[Spalte,L].Benutzer := Benutzer;
      End;
    End;
  End;
end;
Wieder ungetestet, aber so ungefähr mußt du dir das vorstellen.

Ich würde mir an deiner Stelle erst einmal auf einem Blatt Papier notieren, wie das Spiel genau funktionieren soll. Es genügt meist nicht, sich das ungefähr im Kopf vorzustellen, weil man dabei gerne mal wichtige Einzelheiten vergißt. Spiel das Spiel auf einem Blatt Papier ein paarmal durch, du kannst dir ja am Computer ein Gitter zeichnen und dann mehrfach ausdrucken, so daß du ein paar Blätter sozusagen als Vorlagenformular hast. Und beim Herumprobieren auf dem Papier überlegst du nebenher, welche Variablen du da brauchst, um das rein datenmäßig darzustellen, noch ganz ohne Anzeige. Die Anzeige selber ist dann ein Pappenstiel :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf