| Autor |
Beitrag |
Tetsuya1
      
Beiträge: 21
|
Verfasst: Sa 14.03.09 19:45
Ich bastle gerade ein Sudoku für unseren Info Unterricht.
Ich habe mir überlegt, dass die Prozedur zum erstellen des Sudoku folgendermaßen aufgebaut ist:
Er beginnt mit 1, rasselt diese 9 mal durch, sodass in jedem Unterquadrat eine 1 steht. Sobald eine 1 positioniert wurde, habe ich vor, die Spalte/Zeile zu sperren, sodass es bereits eindeutig wird. Danach werden die Spalten/Zeilen wieder freigestellt und der rattert die 2 9x durch. Bei bereits belegtem Feld wird ein anderes Feld gesucht.
Soviel zur Idee. Umsetzung sieht wieder ganz anders aus.
Ich habe ein Array
Delphi-Quelltext 1:
| var tZelle : array[0..8, 0..8] of Integer; |
In jenem habe ich vor, die Spalte/Zeile zu sperren, indem ich einfach die Zahl rauslösche. Wär dies überhaupt möglich, da ich das Array direkt vorgegeben habe?
Ist es ebenfalls möglich. Angenommen es würde funktionieren mit dem rausstreichen, dass man ein Random Befehl so schreibt, dass er eine ZUufallszahl aus den restlichen Spalten/Zeilen zieht oder muss dies dann über eine case of bzw if-Schleife erledigt werden?
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: Sa 14.03.09 19:58
Es wäre von Vorteil ein Array mit eigenem Datentyp zu basteln. Sei es mit einer Klasse oder einem Record.
Ein Feld könnte dann mehrere Daten enthalten, wie zB Zahl, Editierbar, ... ODer auch das Komplette Feld als Klasse.
Denk mal drüber nach. 
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Tetsuya1 
      
Beiträge: 21
|
Verfasst: Sa 14.03.09 20:14
Ich erstelle das Sudoku innerhalb eine Stringgrids und bei jeder Zahl, die übrig bleiben soll, entfern ich einfach die Editierungsmöglichkeit.
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: So 15.03.09 14:19
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Tetsuya1 
      
Beiträge: 21
|
Verfasst: So 15.03.09 20:33
Hab gerade einen Exception Fehler. Weiß aber nicht wieso...
Als Grund wird gesagt, dass es kein möglicher Integerwert ist. Habe die Stelle, welcher er mir anzeigt mit <<<<<<<<<<<<<<<<<<<<< vorher und nachher markiert
Weiß dazu evtl. einer Rat?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| procedure Tform1.sudoku_createClick(Sender: TObject); var col,row,zahl,dlauf:integer; begin Leer(col,row); for zahl:=1 to 9 do begin for dlauf:=1 to 9 do begin unterquadrat(zahl,dlauf); end;
end; end;
procedure TForm1.unterquadrat(zahl,dlauf:Integer); var x,y:integer; begin case dlauf of
1: begin x:=0; y:=0; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< berechnen(x,y,zahl,dlauf); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< end;
end;
procedure TForm1.berechnen(x,y,zahl,dlauf:integer); var col,row,hilfe:longint; begin col:=10; row:=10; while not col in Xcol do col:=random(3)+ x; while not row in Xrow do row:=random(3)+ y; hilfe:=strtoint(form1.Feld.Cells[col,row]); if hilfe in zahlen then begin unterquadrat(zahl,dlauf); end else begin form1.Feld.Cells[col,row]:=inttostr(zahl); zelle[col,row]:=zahl; Xrow:= Xrow - [row]; Xcol:= Xcol - [col]; end; end; |
Habe den Code etwas gekürzt. Jedoch haben die rausgelöschten Sachen nichts mit dem Problem zu tun
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: So 15.03.09 21:40
Versuche mal selbst zu debuggen. BreakPoint auf die Berechnen-Prozedur und dann mal mit F7 in die Methode bzw. mit F8 dann weiter durch gehen.  Dann dazu noch die Werte überwachen. SChau mal ob du so den fehler findest.
Edit:
Delphi-Quelltext 1:
| hilfe:=strtoint(form1.Feld.Cells[col,row]); |
Wenn das Feld keine Zahl enthält, sprich leer ist, gibt es auch einen Fehler.
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Tetsuya1 
      
Beiträge: 21
|
Verfasst: So 15.03.09 21:53
Habe es verändert, dass davor jedes Feld mit einer 0 versehen wird. Dennoch gleiche Fehler...
|
|
freak4fun
      
Beiträge: 604
Erhaltene Danke: 4
Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
|
Verfasst: So 15.03.09 23:48
_________________ "Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
|
|
Tetsuya1 
      
Beiträge: 21
|
Verfasst: Mo 16.03.09 18:13
Habe nun 2 Stunden versucht das Problem zu lösen indem ich unter anderem versuchte die Prozedure einfach wegzulassen oder globale Variablen zu erstellen. Alles kein Erfolg. Cols/Rows gehen von 0 bis 8. Also ein 9x9 Feld wie eben ein normales Sudoku aussieht. Fixiert wurden keine Werte. Dies mach ich später mit Zugriffsverweigerung.
Weiß nicht mehr was ich für einen Fehler ich da rein geschrieben habe. Deswegen stelle ich den ganzen Quelltext mal hier rein. Auch wenn es viel Verlangt ist, würde sich einer den mal anschauen und evtl. sogar den Fehler finden?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ExtCtrls;
type Tform1 = class(TForm) exit: TButton; Feld: TStringGrid; SGrad: TGroupBox; dif_easy: TRadioButton; dif_hard: TRadioButton; dif_middle: TRadioButton; save: TButton; load: TButton; print: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; PrintDialog1: TPrintDialog; Timer: TTimer; uhr: TLabel; paused: TButton; vergangene_Zeit: TGroupBox; Help: TButton; sudoku_create: TButton; loesen: TButton; GroupBox1: TGroupBox; procedure exitClick(Sender: TObject); procedure sudoku_createClick(Sender: TObject); procedure FeldDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); procedure FeldKeyPress(Sender: TObject; var Key: Char); procedure berechnen(x,y,zahl,dlauf:integer); procedure unterquadrat(zahl,dlauf:Integer); procedure pausedClick(Sender: TObject); procedure TimerTimer(Sender: TObject); private public end;
var StartZeit: TDateTime; StopZeit: TDateTime; Zeitsumme: TDateTime; zelle: array[0..8,0..8] of integer; Xrow: set of 0..8; Xcol: set of 0..8; zahlen: set of 1..9; form1: Tform1;
implementation
{$R *.dfm}
procedure Tform1.exitClick(Sender: TObject); begin close end;
procedure Tform1.sudoku_createClick(Sender: TObject); var col,row,zahl,dlauf:integer; begin paused.Tag:=9; pausedClick(Sender); vergangene_zeit.Visible:=true; for col:=0 to 8 do begin for row:=0 to 8 do begin form1.feld.Cells[col,row]:=inttostr(0); form1.feld.Color:=clwhite; end; end;
for zahl:=1 to 9 do begin for dlauf:=1 to 9 do unterquadrat(zahl,dlauf); Xcol:=Xcol + [1..9]; Xrow:=Xrow + [1..9]; end; end;
procedure TForm1.unterquadrat(zahl,dlauf:Integer); var x,y:integer; begin case dlauf of
1: begin x:=0; y:=0; berechnen(x,y,zahl,dlauf); end; 2: begin x:=3; y:=0; berechnen(x,y,zahl,dlauf); end;
3: begin x:=6; y:=0; berechnen(x,y,zahl,dlauf); end;
4: begin x:=0; y:=3; berechnen(x,y,zahl,dlauf); end;
5: begin x:=3; y:=3; berechnen(x,y,zahl,dlauf); end;
6: begin x:=6; y:=3; berechnen(x,y,zahl,dlauf); end;
7: begin x:=0; y:=6; berechnen(x,y,zahl,dlauf); end;
8: begin x:=3; y:=6; berechnen(x,y,zahl,dlauf); end;
9: begin x:=6; y:=6; berechnen(x,y,zahl,dlauf); end; end; end;
procedure TForm1.berechnen(x,y,zahl,dlauf:integer); var col,row,hilfe:integer; begin col:=10; row:=10; while not col in Xcol do col:=random(3)+ x; while not row in Xrow do row:=random(3)+ y; hilfe:=strtoint(form1.Feld.Cells[col,row]);
if hilfe in zahlen then begin unterquadrat(zahl,dlauf); end else begin form1.Feld.Cells[col,row]:=inttostr(zahl); zelle[col,row]:=zahl; Xrow:= Xrow - [row]; Xcol:= Xcol - [col]; end; end;
procedure Tform1.FeldDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var s:string; begin
with sender as TStringGrid do begin canvas.Brush.Color:= clwhite; canvas.font.color:= clblack; feld.canvas.FillRect(rect); s:=cells[acol,arow]; DrawText(canvas.Handle,PChar(s), StrLen(PChar(s)),Rect,DT_CENTER or DT_VCENTER or DT_SINGLELINE); canvas.Pen.Color:= clblack; Canvas.Pen.Width:=3;
if ((acol+1) mod 3)=0 then begin canvas.moveto(Rect.Right,rect.top); canvas.LineTo(Rect.Right,rect.bottom); end; if ((arow+1) mod 3)=0 then begin canvas.moveto(Rect.left,rect.Bottom); canvas.LineTo(Rect.Right,rect.bottom); end; end; end;
procedure Tform1.FeldKeyPress(Sender: TObject; var Key: Char); begin with sender as TStringGrid do begin if (cells[col,row]='') and (key in ['1'..'9']) then cells[col,row]:=key; end; end;
procedure Tform1.pausedClick(Sender: TObject); begin case paused.Tag of 0: begin StartZeit:=now-ZeitSumme; Timer.Enabled:=true; paused.Caption:='Pause'; end;
1: begin StopZeit:=now; Timer.Enabled:=false; paused.Caption:='Weiter'; ZeitSumme:=StopZeit-StartZeit; Uhr.Caption:=TimeToStr(ZeitSumme); end;
9: begin StartZeit:=now; Timer.Enabled:=true; paused.Caption:='Pause'; paused.Tag:=0; end; end;
paused.Tag:=paused.Tag + 1; if paused.Tag > 1 then paused.Tag := 0; end;
procedure Tform1.TimerTimer(Sender: TObject); begin Uhr.Caption:= TimeToStr(now - StartZeit); end;
end. |
Ich hoffe, dass einer den Fehler findet. Habe ihn nochmal hervorgehoben
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 16.03.09 18:29
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Tetsuya1 
      
Beiträge: 21
|
Verfasst: Mo 16.03.09 18:56
Habe es nun verändert. Danke für den Hinweis. Wusste nicht, dass der dann ein Vorzeichenwechsel macht, jedoch ist es nun so, wenn ich das Programm starte, dass zwar kein Fehler mehr erscheint, jedoch hängt sich das Programm auf beim Starten des Projektes, was natürlich nicht sein dürfte.
|
|
|