Autor Beitrag
battledevil
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 09.08.06 12:49 
Hallo Leute,

ich hab ein kleines Sudoku-"Frontend" geschrieben, mit dem man Sudoku auf dem Rechner spielen kann. Es kann nix generieren oder lösen, es muss erst ein Sudoku per mitgelieferter Textdatei geladen werden, dann kann man loslegen. Das Hauptaugenmerk lag auf der einfachen Bedienung mittels überblendetem Zahlenmenü. Außerdem kann man sich statt der klassischen Ziffern auch Farbkugeln anzeigen lassen, das sieht dann mal etwas anders aus.
Wenn noch irgendjemand geniale Ideen dazu hat, dann immer her damit.

Update:
- Fehlermeldung beim Laden eliminiert
- Ziffern können über Tastatur eingegeben werden
- neues Grafikset (Snooker)
- Option zum Merken und Wiederherstellen der Feldbelegung hinzugefügt
- Option zur Anzeige aller gültigen Einträge in die Felder hinzugefügt
- funktionsfähiger Sudoku-Generator (noch verbesserbar)

Moderiert von user profile iconTino: Titel den Regeln entsprechend angepasst.
Moderiert von user profile iconUGrohne: Topic aus Freeware Projekte verschoben am Do 10.08.2006 um 13:22
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von battledevil am Sa 26.08.06 13:40, insgesamt 6-mal bearbeitet
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Mi 09.08.06 20:20 
Da kann Ich nur sagen vom Feinsten gefällt mir wirklich gut.
Eigenständiges generieren wäre praktischer glaub Ich, aber vieleicht haste das ja noch vor.
Ich habe bei Mir ne Auflösung von 800 x 600 dann ist beim Klicken in die letze Zeile die Fünf nicht mehr zu erreichen.
Wie gesagt Top !!!
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 09.08.06 20:33 
Titel: Re: und noch so ein Sudoku Programm ;-)
Danke für das großzügige Lob.
Ja, das mit dem Generator überleg ich mir noch.
Die minimale Auflösung hab ich bei 1024x768 festgemacht, damit die Zahlen bei großen Auflösungen (ich benutze 1400x1050) noch gut zu erkennen und anzuklicken sind.
Wenn Bedarf besteht, kann ich noch eine Variante für 800x600 basteln, aber da muß ich die Bitmaps erstmal überarbeiten.
Born-to-Frag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Mi 09.08.06 21:12 
Bekomm ne AV wenn ich den OpenDialog mit abbrechen Schließe..

Ich denke mal du solltest
ausblenden Delphi-Quelltext
1:
2:
OpenDialog1.Execute;
... //lade
in
ausblenden Delphi-Quelltext
1:
2:
if OpenDieloag1.Execute then
  ... //lade
ändern ;)

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 09.08.06 22:47 
Titel: Re: und noch so ein Sudoku Programm ;-)
ich hab das if schon drin, aber werd noch ein try-except drumherum basteln, dann gehts bestimmt auch ohne fehlermeldung. die verbesserte version kommt morgen.
Born-to-Frag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Mi 09.08.06 23:23 
also ein try.. except block verbessert das doch nich :shock: Es ist einfach nicht normal das da eine AV kommt.. guck doch einfach wo der Fehler steckt!!

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Mi 09.08.06 23:31 
würdest du den source auch noch rausrücken?

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Do 10.08.06 11:23 
Da bin ich wieder :-)

@ Born-To-Frag: Du wirst es nicht glauben, aber ich habs mit try - except gelöst.
Das Problem liegt beim CloseFile-Befehl.

@ klezmor: kein Problem, die Quellcodes sind online, ich habs ein wenig dokumentiert, aber der code ist nicht an allen stellen optimal geschweige denn besonders schön und effizient

@ admin: wäre wohl ein guter zeitpunkt, das ganze nach open source projekte zu verschieben.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 12.08.06 10:04 
user profile iconbattledevil hat folgendes geschrieben:
@ Born-To-Frag: Du wirst es nicht glauben, aber ich habs mit try - except gelöst.
Das Problem liegt beim CloseFile-Befehl.

Doch, er wird es dir glauben. Aber es geht darum, dass man Fehler nicht mit try und except unterdrücken sollte, sondern die Ursache beheben. Stell dir vor, du hast die Handbremse bei deinem Auto gezogen und dir wird eine Warnung angezeigt. Anstatt nun die Handbremse zu lösen, klebst du ein Stück Papier über die Warn-LED, damit du sie nicht mehr siehst. Das ist etwa vergleichbar ;-).

Zum Spiel: Getestet habe ich es noch nicht, aber vom Screenshot her sieht es schonmal sehr gut aus.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Sa 12.08.06 11:29 
Schöne Metapher. Ich versteh schon, dass das was ich da tue eher eine Fehlervermeidung als eine Lösung darstellt.
Ok, dann will ich mal erklären, warum ich hier try except benutze.

Beim Laden verwende ich folgendes Konstrukt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if OpenTextFileDialog1.Execute then            
  begin
    AssignFile(Datei, OpenTextFileDialog1.FileName); 
    Reset(Datei);
    Readln(Datei, Daten);                        

    try Closefile(Datei) except end;  
  end;


Ist ganz einfach: Ich versuche ganz normal, eine Textdatei zu öffnen, die erste
Zeile einzulesen und sie dann wieder zu schließen. Wenn jedoch abgebrochen wird, dann hat Closefile keine Datei, die geschlossen werden kann und es wird ein Fehler ausgeworfen.

Falls jemand einen anderen Weg kennt, das Problem zu lösen, dann wäre ich für Vorschäge dankbar.
mmmichael
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 12.08.06 12:05 
Und wenn die Datei gar nicht geladen werden kann oder es einen Lesefehler gibt? Dann bringt doch schon das auslesen nen Fehler... Ich perönlich hätte das so gemacht (wahrscheinlich gehts auch einfacher):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if OpenTextFileDialog1.Execute then            
  begin
  try
    AssignFile(Datei, OpenTextFileDialog1.FileName); 
    Reset(Datei);
    Readln(Datei, Daten);                        
  finally 
    try 
      Closefile(Datei) 
    except end
  end;
  end;

Ich bin mir nicht sicher ob man dann das try um das CloseFile noch benötigt.

Das Programm find ich übrigens echt klasse! Die Bedienung ist spitze.
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Sa 12.08.06 14:54 
Danke. So ähnlich hatte ich es erst auch gemacht, aber bei der Problemsuche stellte sich heraus, dass (zumindest bei mir) nur das CloseFile Probleme bereitet, AssignFile und Reset scheint es nichts auszumachen, wenn keine Datei ausgewählt wird.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 12.08.06 15:48 
Aber Moment mal, wenn gar keine Datei ausgewählt wurde, dann dürfte doch execute gar nicht true zurückliefern, oder?
Ansonsten kannst du doch mit FileExists überprüfen ob die Datei existiert!
ausblenden Delphi-Quelltext
1:
if OpenTextFileDialog1.Execute and FileExists(OpenTextFileDialog1.FileName) then					
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 12.08.06 21:39 
Ich bekomme beim Abbrechen kein True geliefert. Warum CloseFile trotzdem aufgerufen wird ist daher unerklärlich. Allerdings sollte die Methode von jaenicke Abhilfe schaffen.

user profile iconbattledevil hat folgendes geschrieben:
Schöne Metapher

Danke ;-)

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 12.08.06 22:23 
So ein Blödsinn!!!
ich hab mir den Code mal angesehen! Du darfst natürlich auch das Laden aus dem String nicht durchführen, wenn der User abbricht!!!
Hier der ganze Code an der Stelle.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
  if OpenTextFileDialog1.Execute then            // Öffnen-Dialogfeld anzeigen }
  begin
    AssignFile(Datei, OpenTextFileDialog1.FileName); // Datei in Dialogfeld ausgewählt }
    Reset(Datei);
    Readln(Datei, Daten);                        // Erste Zeile der Datei lesen }

    try Closefile(Datei) except end;  // gibt Probleme
  end;

  // Eingelesenen String in die Arrays für die Anzeige und die Aufgabe übernehmen
  try
    for i:=1 to 81 do Vorgabe[(i-1mod 9 + 1, (i-1div 9 + 1]:=StrToInt(Daten[i]);
    for i:=1 to 81 do Zahlen[(i-1mod 9 + 1, (i-1div 9 + 1]:=Vorgabe[(i-1mod 9 + 1, (i-1div 9 + 1];
  except
    //showmessage('Fehler beim Einlesen des Sudoku-Textfiles');
    for i:=1 to 81 do
    begin
      Vorgabe[(i-1mod 9 + 1, (i-1div 9 + 1]:=0;
      Zahlen[(i-1mod 9 + 1, (i-1div 9 + 1]:=0;
    end;
  end;


So ist es korrekt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TFormSudoku.SudokuLaden();
var Datei:TextFile;
    Daten : String;
    i : integer;
begin

  if OpenTextFileDialog1.Execute then            // Öffnen-Dialogfeld anzeigen }
  begin
    AssignFile(Datei, OpenTextFileDialog1.FileName); // Datei in Dialogfeld ausgewählt }
    Reset(Datei);
    Readln(Datei, Daten);                        // Erste Zeile der Datei lesen }

    Closefile(Datei);

    for i:=1 to 81 do
      Vorgabe[(i-1mod 9 + 1, (i-1div 9 + 1] := StrToInt(Daten[i]);
    for i:=1 to 81 do
      Zahlen[(i-1mod 9 + 1, (i-1div 9 + 1] := Vorgabe[(i-1mod 9 + 1, (i-1div 9 + 1];
  end;

  Paintbox1.Refresh;
  FormEinstellungen.Hide;
end;
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: So 13.08.06 10:48 
Kleines Update, Version 0.3 ist online.
Hab den Code wie jaenicke vorgeschlagen hat abgeändert und es läuft. Zusätzlich öffnet sich der OpenTextfileDialog jetzt direkt im Ordner mit den Sudoku-Textfiles.
Es gibt ein zusätzliches Grafikset mit Billardkugeln.
Außerdem hab ich mal angefangen, den Generator zu schreiben. Aber das wird noch dauern, bis der fertig ist.
Jack Falworth
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222

Win XP Pro, Slackware 10.0
D5 Enterprise, C++, ABAP
BeitragVerfasst: Sa 19.08.06 20:38 
ganz nett gemacht das Frontend.
Was ich noch verbessern würde, wäre dass das Programm die Zeilen, Spalten und 3x3 Subquadrate prüft und die Ziffern die da schon vorkommen bei der Auswahl in einem betreffenden Feld wegstreicht.

Vielleicht ein erklärendes Bsp ;)

Sudoku (Ausschnitt)

1-X-5--76
45-------
---------
----...

Die - sind leere Felder.
Wenn ich jetzt das Feld X setzen möchte, sollten die Ziffern 1 4 5 6 7 schon weggestrichen (also praktisch) disabled sein, sodass man gar keine Möglichkeit hat in das Feld eines der 5 Ziffern zu setzen und somit die Regeln zu verletzen.


Praktisch fände ich auch, wenn man ein bestimmtes Sudoku eingibt und dann in die Felder, die noch nicht besetzt sind alle Ziffern die noch möglich sind reingeschrieben werden.
Normalerweise geht man beim Lösen ja folgendermaßen vor. Man setzt die Felder soweit man kommt und dann legt man eine Kandidatenliste für jedes Feld an und versucht Schritt für Schritt diese zu verkleinern.
Bei dir müsste man bei jedem Feld erst mal alle Ziffern von Hand reinklicken.


Was auch ganz nett wäre, wäre die Option das aktuelle Spielfeld inklusive der Kandidatenliste zwischenspeichern zu können. Wenn man nämlich an einen Punkt kommt, an dem man Felder nicht mehr eindeutig besetzen kann und dann praktisch eine Ziffer raten muss, ist es praktisch, dass wenn man dann nicht mehr weiterkommt den Punkt an dem man zwischengespeichert hat, wieder zurücksetzen kann, um dort weiterzumachen.


Mfg

JackF

_________________
Andere zu kritisieren ist mitunter eine Möglichkeit, sich selbst ins bessere Licht zu setzen.
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mo 21.08.06 15:51 
Gute Idee, ich werd das als einstellbare Optionen mit reinnehmen. Es gibt aber bestimmt noch mehr Sudoku-"Puristen" wie mich, die sich die Lösung nicht vom Computer vereinfachen lassen wollen, deswegen einstellbar :-)
Das mit dem Speichern dürfte auch machbar sein, auch wenn ich dann statt den einfachen Textfiles wohl besser ein eigenes Dateiformat definiere.
Jack Falworth
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222

Win XP Pro, Slackware 10.0
D5 Enterprise, C++, ABAP
BeitragVerfasst: Mo 21.08.06 19:04 
hmm okay das kann dann jeder selbst entscheiden, wobei ich das eher nervig finde, wenn ich bei einem 4 oder 5 Sterne Sudoku noch für etwa 60 Felder eine Kandidatenliste machen muss.

Das mit dem Zwischenspeichern meinte ich etwas anders. Der aktuelle Stand soll nicht in eine Datei geschrieben werden, sondern das Programm soll ihn sich lediglich merken. Bei 4 und 5 Sterne Sudokus kommt man oft an eine Stelle an der man so nicht mehr weiter kommt und eine Ziffer raten muss. Und genau an dem Punkt soll man sich dann den aktuellen Stand "merken" können. Falls man in eine Sackgasse gerät kann man dann ganz einfach den "Zwischenstand" wiederherstellen und weitermachen.

Normalerweise, wenn man das auf nem Blatt löst, macht man sich dann auch eine "Sicherungskopie", als man malt das Ganze nochmals ab ;)

_________________
Andere zu kritisieren ist mitunter eine Möglichkeit, sich selbst ins bessere Licht zu setzen.
battledevil Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 96

WinXP, Win7
C#, C++, VBNET
BeitragVerfasst: Mi 23.08.06 07:58 
Version 0.4 ist online.
Hab die Optionen, die Jack vorgeschlagen hat, umgesetzt.
Es ist jetzt möglich, einen Zwischenstand der Feldbelegungen zu merken und wiederherzustellen.
Desweiteren kann man sich alle für die Felder gültigen Zahlen anzeigen lassen.
Ich habe darauf verzichtet, daß die Zahlen automatisch groß eingetragen werden, wenn nur noch eine möglich ist. Da muss man schon noch selber die große Zahl hinklicken. Wer das lieber automatisiert haben will, der möge sich die Quellen runterladen und die zwei Zeilen, die ich auskommentiert habe (unitSudoku, procedure BelegungAnzeigen) dem Programm hinzufügen, dann geht das vollautomatisch. Einfache Sudokus wie z.B. die mitgelieferte 01.txt werden so schon komplett automatisch gelöst.