AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi WordSteal/Wordox/Kreutzworträtselfeld realisieren
Thema durchsuchen
Ansicht
Themen-Optionen

WordSteal/Wordox/Kreutzworträtselfeld realisieren

Ein Thema von rhodan · begonnen am 29. Aug 2015 · letzter Beitrag vom 30. Aug 2015
Antwort Antwort
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#1

WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 22:19
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

Geändert von rhodan (29. Aug 2015 um 22:37 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 22:31
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:

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 22:35
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?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#4

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 22:57
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.
Miniaturansicht angehängter Grafiken
wordox1.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
654 Beiträge
 
Delphi 12 Athens
 
#5

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 23:18
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.
Roland
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#6

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 23:33
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;

Geändert von Perlsau (30. Aug 2015 um 01:04 Uhr) Grund: Fehler im Code korrigiert
  Mit Zitat antworten Zitat
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#7

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 29. Aug 2015, 23:45
@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
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: WordSteal/Wordox/Kreutzworträtselfeld realisieren

  Alt 30. Aug 2015, 01:25
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
  Mit Zitat antworten Zitat
Antwort Antwort


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:12 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