Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem beim überprüfen der Sudokuregeln im StringGrid (https://www.delphipraxis.net/96565-problem-beim-ueberpruefen-der-sudokuregeln-im-stringgrid.html)

Rickiwarhammer 26. Jul 2007 22:00


Problem beim überprüfen der Sudokuregeln im StringGrid
 
Also erstmal hallo an alle :hi:
Wie der Titel schon sagt schreibe ich ein Sudoku Spiel :D Bis jetzt klappt alles ... mein Plan ... Einen Editor für Customrätzel und die Rätzel des standart Spieles... Das Spielfeld habe ich mit einem String Grid gemacht... okkaaay man kann es speichern öffnen notizen titel ersteller und Co. machen klappt alles... jetzt soll der Editor natürlich auch nachprüfen ob dieses Rätzel auch den Regeln endspricht ... HIIEEEER IST DAS PROBLEM... ich finde einfach nicht herraus wie man die gerade angewählte Reihe und Spalte herrausfindet und gleichzeitig noch überprüft ob diese Zahl schon in der Zeil bzw. Spalte ist. und das gleiche ist auch für das 3x3 Feld ... WIE ... WIE NUR ... ich zerbreche mir schon seit Stunden den Kopf und nix kommt herraus... ich habe hier im Forum schon gefuden wie ich doppelte überprüfen kann aber iiirgendwie will das ganze nicht ... tja ich hoffe dass mir hier geholfen wird =( ich würde das Problem gerne beheben und das Spiel zuende bringen ... danke schonmal im vorraus ich bin über jede Antwort froh! :coder2:

dajuhsa 26. Jul 2007 22:03

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
hast du schon nen ansatz? was funktioniert nicht? gar keine idee?

Rickiwarhammer 26. Jul 2007 22:10

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
aaaah doch nen nasatz habe ich wie gesag das Programm geht ... nur kann es bis jetzt nicht das Rätzel überprüfen ob es richtig ist also kann man 9 x ne 4 in die Spalte machen ohne dass er sagt dass es falsch ist ;D ach ja danke für die schnelle antwort und ich hänge einfach mal die Datei an :D

dajuhsa 26. Jul 2007 23:16

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
ja ok ich seh mal was ich machen kann

Rickiwarhammer 26. Jul 2007 23:18

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
OH vielen dank :D danke danke danke :corky: :corky:

jim_raynor 27. Jul 2007 07:37

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
Nun, ich würde mir ein statisches Array zur Hilfe nehmen mit 9 Booleans:

Delphi-Quellcode:
var
  CheckArray: Array[1..9] of Boolean;
Hier kannst du nun für eine Zeile/Spalte/Block die Zahlen auf true setzen, die gefunden wurden. Und wenn bereits ein Element true ist, dann ist es falsch. Natürlich müssen dann vor jeder Zeile/Spalte/Block alle Elemente wieder auf false gesetzt werden.

dajuhsa 27. Jul 2007 10:22

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
vielleicht hilft dir die ja weiter... ungetestet und im editor erstellt

Rickiwarhammer 27. Jul 2007 15:52

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
Sooo :D ich habe mich wieder mal lange an meinen Builder gesetzt und habe dank der .pas von dajuhsa (DANKE :hello: ) endlich einen weg gefunden wie ich den wert ermitteln kann uuuuund in der Spalte suchen kann :D KLAR is es nicht gerade die schönste art aber naja immerhin :D nur irgentwie hat der mist einen bug ... er findet alle fehler in der Spalte und in der Reihe aber wenn z.B noch nichts eingetragen wurde und man irgendeine Zahl in die erste Reihe bzw. Spalte einträgt sagt er mir es gäbe einen Fehler! nur warum kA... (also keinen prozessfehler sondern die Fehlermeldung von mir ;D)
Delphi-Quellcode:
procedure TForm1.Sudokuregeln(Sudoku: TStringGrid);
VAR
selBottom, selRight, Check: integer;
Zahl, CheckZahl : string;
Row, Col: Array [0..3] of integer;
begin
// Row zurücksetzen
Row[0] := 0;
Row[1] := 0;
Row[2] := 0;
Row[3] := 0;
// Col zurücksetzen
Col[0] := 0;
Col[1] := 0;
Col[2] := 0;
Col[3] := 0;
// Zahl suchen
selBottom := Sudoku.Selection.Bottom;
selRight := Sudoku.Selection.Right;
Zahl := Sudoku.Cells[selRight, selBottom];
IF Zahl = '' then exit
else
begin
// Reihe eingrenzen
IF selRight = 0 then
begin
Row[0] := 1;
Row[1] := (Sudoku.RowCount - 1);
end
else
begin
Row[0] := 0;
Row[1] := (selRight - 1);
Row[2] := (selRight + 1);
Row[3] := (Sudoku.RowCount - 1);
end;
// Reihe überprüfen
for Check := Row[0] to Row[1] do
begin
CheckZahl := Sudoku.Cells[Check, selBottom];
IF CheckZahl = Zahl then MessageDlg('Es ist ein Fehler im Kasten {' + inttostr(Check + 1) + ',' + inttostr(selBottom + 1) + '} aufgetreten!', mtError, [mbOK], 0);
end;
for Check := Row[2] to Row[3] do
begin
CheckZahl := Sudoku.Cells[Check, selBottom];
IF CheckZahl = Zahl then MessageDlg('Es is ein Fehler im Kasten {' + inttostr(Check + 1) + ',' + inttostr(selBottom + 1) + '} aufgetreten!', mtError, [mbOK], 0);
end;
// Spalte eingrenzen
IF selBottom = 0 then
begin
Col[0] := 1;
Col[1] := (Sudoku.ColCount - 1);
end
else
begin
Col[0] := 0;
Col[1] := (selBottom - 1);
Col[2] := (selBottom + 1);
Col[3] := (Sudoku.ColCount - 1)
end;
// Spalte überprüfen
for Check := Col[0] to Col[1] do
begin
CheckZahl := Sudoku.Cells[selRight, Check];
IF CheckZahl = Zahl then MessageDlg('Es is ein Fehler im Kasten {' + inttostr(selRight + 1) + ',' + inttostr(Check + 1) + '} aufgetreten!', mtError, [mbOK], 0);
end;
for Check := Col[2] to Col[3] do
begin
CheckZahl := Sudoku.Cells[selRight, Check];
IF CheckZahl = Zahl then MessageDlg('Es is ein Fehler im Kasten {' + inttostr(selRight + 1) + ',' + inttostr(Check + 1) + '} aufgetreten!', mtError, [mbOK], 0);
end;
end;
end;
und wieder ma danke im Vorraus :D

dajuhsa 27. Jul 2007 16:38

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
meine pas hat ansatzweise was gebracht?! :firejump: :dancer: :hello: :party: freu, freu.

Rickiwarhammer 30. Jul 2007 14:47

Re: Problem beim überprüfen der Sudokuregeln im StringGrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
SOO ich habe ein schlaflose Nacht hinter mir :D ja wirklich XD und ich ahbs endlich geschafft!! die Regeln könnnen nun überprüft werden :D jedoch ;D wieder ein problem :freak: :freak: ich wollte die Spalte und die Reihe rot einfärben in der der Fehler ist ... ich ahbe es naja wie soll ich sagen ... geschafft und auch nicht :roll: :cry: also Er färbt sie nicht DIREKT ein sondern muss man die Kästchen nach und nach anklicken bevor sie rot werden ... hier sit der Code XD
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
with (Sender as TStringGrid) do
begin
If error = 10 then exit
else
if ARow = error then
Canvas.Brush.Color := $000000F0
else
Canvas.Brush.Color := $00FFFFFF;
Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
end;
end;
//und so wird er aktiviert
procedure TForm1.Blockmessage(Row, Col: integer);
begin
CASE Form3.ComboBox1.ItemIndex OF
0:
begin
Messagedlg('Es ist ein Fehler in der Reihe: ' + inttostr(Row + 1) + ' und in der Spalte: ' + inttostr(col + 1) + ' aufgetreten!', mtError, [mbOK], 0);
error := Row;
StringGrid1DrawCell(StringGrid1, Row, Col, Rect(Row, Col, Row, Col), [gdfixed]);
end;
1: Messagedlg('There is an error in the row: ' + inttostr(Row + 1) + ' and in the column: ' + inttostr(col + 1) + '!', mtError, [mbOK], 0);
2: Messagedlg('Il ya une erreur dans l' + #39 + 'aligne: ' + inttostr(Row + 1) + ' et dans la colonne: ' + inttostr(col + 1) + '!', mtError, [mbOK], 0);
end;
end;
tjo vllt hilft die jetzige .exe auch noch ... ;D
Und zu guter letzt BEVOR ich aufhöre (zumindestens für jetzt :D) euch das Ohr blutig zu reden wollte ich noch sagen dass ich am ende eine Komponente mit den Regeln und den msit schreibe für die die das gleiche problem haben ;D;D


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 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