[python-users] Pydoku
Rex Turnbull
RexTurnbull at web.de
Mi Okt 17 13:58:55 CEST 2007
* Ich wurde als erstes am Ende folgendes einfügen, dann den Code, das
sonst direkt ausgeführt wird in ein main-Funktion
bringen
----
def main():
p = PydokuCreator()
p.createPydoku()
p.printPydoku()
tmp = p.getPydoku(22)
print 'Pydoku of grade:', grade
for row in tmp:
print row
if __name__ == '__main__':
main()
----
* Dann auf Funktionsfähigkeit vor der Veröffentlichung prüfen
print 'Pydoku of grade:', grade <-- ist nicht deklariert
* Documentation in Docstrings wie hier:
----
def question(frage):
"""--> the answer
This function does something really great and then returns 42."""
print frage
return 42
----
* Vielleicht auch noch auf grundsätzlicher Format achten (google for
pep8.py).
Das nur zum Aussehen.
Viel Erfolg und Spaß weiterhin mit Python!
Rex
Benjamin Wolters schrieb/wrote:
> Hallo zusammen,
>
> Anfang des Jahres benötigte ich einen Sudoku erzeugendes Programm.
> Damals habe ich mich das erste Mal mit Python auseinander gesetzt und
> somit auch Pydoku geschrieben. Jetzt möchte ich ihm mal gegen lesen
> lassen, ob dieser auch Python konform ist oder ob ihr ihn anders
> geschrieben hättet. Wahrscheinlich bekomme ich es demnächst öfters mit
> Python zu tun, deshalb die späte Mail.
>
> Hier mein Pydoku (auch im Anhang als py):
> _____________________
> import random
> import operator
>
> ##########################################
> #Basic Pydoku Class
> class Pydoku(object):
> pydoku = [[ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ],
> [ 0,0,0,0,0,0,0,0,0 ]]
>
> def checkPydokuRules(self, r, c, val):
> rb = abs(r / 3) * 3
> cb = abs(c / 3) * 3
> for row in range(rb, rb+3):
> for col in range(cb, cb+3):
> if self.pydoku[row][col] == val:
> return False
> return self.checkRow(r, val) & self.checkLine(c, val)
>
> def checkRow(self,rowNumber,checkNumber):
> for cell in self.pydoku[rowNumber]:
> if cell == checkNumber:
> return False
> return True
>
>
> def checkLine(self,lineNumber,checkNumber):
> for row in self.pydoku:
> if row[lineNumber] == checkNumber:
> return False
> return True
>
> def printPydoku(self):
> i = 0
> print 'Pydoku:'
> for row in self.pydoku:
> print row
>
> def getPydoku(self):
> return self.pydoku
>
> ##########################################
> # PydokuCreator Class
> class PydokuCreator(Pydoku):
>
> def createPydoku(self):
> for row in range(9):
> while operator.contains(self.pydoku[row],0):
> self.pydoku[row] = [ 0,0,0,0,0,0,0,0,0 ]
> for val in range(1,10):
> self.addNumber(row,range(9),val)
>
> def addNumber(self,row,cols,val):
> ok = True
> col = random.choice( cols )
> if self.pydoku[row][col] == 0 and
> self.checkPydokuRules(row,col,val):
> self.pydoku[row][col] = val
> else:
> cols.remove(col)
> if len(cols) == 0:
> return
> self.addNumber(row,cols,val)
>
> def getPydoku(self,grade):
> tmpPydoku = self.pydoku
> removed = False
> for i in range(81-grade):
> removed = False
> while not removed:
> row = random.randint(0,8)
> col = random.randint(0,8)
> if tmpPydoku[row][col] != 0:
> tmpPydoku[row][col] = 0
> removed = True
> return tmpPydoku
>
> ##########################################
> # PydokuSolver
> #class PydokuSolver(Pydoku):
> #
> # def solvePydoku(self):
> # self
>
> p = PydokuCreator()
> p.createPydoku()
> p.printPydoku()
>
> tmp = p.getPydoku(22)
> print 'Pydoku of grade:', grade
> for row in tmp:
> print row
>
> ______________________
>
>
> Die 22 steht für den Schwierigkeitsgrad und der Solver ist in Prolog
> geschrieben, deshalb auch nicht implementiert.
>
> Viele Grüße
> Ben
>
Mehr Informationen über die Mailingliste python-users