作为练习python的一种方式我正在尝试编写一个创建数独游戏的小程序。我发现了与我的问题类似的多个问题,但似乎没有一个问题完全相关。
#!usr/bin/python3
from random import randint
class Puzzle :
def __init__(self, **puzzle):
puzzle = [[0 for x in range(9)]for y in range(9)]
def createEasy(self):
count = 0
while(count < 32):
i = randint(0,8)
j = randint(8,9)
k = randint(1,9)
if (self.puzzle[i][j] != 0):
self.puzzle[i][j] = k
count += 1
def createMedium(self):
count = 0
while(count < 30):
i = randint(0,8)
j = randint(8,9)
k = randint(1,9)
if (self.puzzle[i][j] != 0):
self.puzzle[i][j] = k
count += 1
def createHard(self):
count = 0
while(count < 26):
i = randint(0,8)
j = randint(8,9)
k = randint(1,9)
if (self.puzzle[i][j] != 0):
self.puzzle[i][j] = k
count += 1
def main():
print("Welcome to sudoku!!!")
answer = input( "what level of difficultly do you want today?")
if (answer == "easy"):
self.createEasy()
for x in Puzzle.puzzle:
for y in x:
print(y)
print('\n')
Puzzle.main()
我发现大多数答案要么与未按正确顺序定义的函数有关,要么不将“self”放在所有函数的参数列表中。一个答案甚至说在init函数中摆脱了“self”参数,但这也没有帮助。我也找到了这个答案,虽然我认为它也不相关。 NameError: name 'self' is not defined我唯一能想到的是我需要在其他地方声明名为puzzle的列表,因为它假设是一个类变量,但是从python代码我不认为这不是我的真实不确定,因为它是2d并且写拼图= [] []是错误的。
对不起,这是整个输出错误。
Welcome to sudoku!!!
what level of difficultly do you want today?easy
Traceback (most recent call last):
File "sudoku_maker.py", line 49, in <module>
Puzzle.main()
File "sudoku_maker.py", line 43, in main
self.createEasy(self)
NameError: name 'self' is not defined
答案 0 :(得分:1)
如果进行以下更改,错误消失:
self
作为main()
功能的参数。p = Puzzle()
然后调用p.main()
。self.puzzle
函数中写__init__
而不只是puzzle
。(然后有不同的错误,但与此无关)
答案 1 :(得分:1)
首先,在声明拼图属性的__init__
方法中,您忘记了self
,因此未声明:
def __init__(self, **puzzle):
self.puzzle = [[0 for x in range(9)] for y in range(9)]
在宣布主要功能时,您也忘记了de self
。而且,在这个内部你也有错误,当你致电Puzzle.puzzle
时,它应该是self
实例:
def main(self):
print("Welcome to sudoku!!!")
answer = input( "what level of difficultly do you want today? ")
if (answer == "easy"):
self.createEasy()
for x in self.puzzle:
for y in x:
print(y)
print('\n')
最后,当你调用这个函数时。您需要首先创建Puzzle实例,但是您使用的是Puzzle.main
,因此您没有初始化对象,因此self
实例将不存在。
你必须这样做:
Puzzle().main()
但是,使用randint(a, b)
时会出现另一个错误,因为此函数会在a
和b
之间生成一个随机int,但包含限制,因此当您在{{1}中调用它时,9,不应该在限制范围内。
答案 2 :(得分:1)
您似乎希望main()
成为类方法或静态方法而不是实例方法。类方法是不绑定到对象而是绑定到类的方法。在这种情况下,您需要清楚地定义它。
https://docs.python.org/3.5/library/functions.html#classmethod https://docs.python.org/3.5/library/functions.html#staticmethod
这个答案清楚地解释了类方法和静态方法之间的区别。 What is the difference between @staticmethod and @classmethod in Python?
解决问题的另一种方法是:
通过传递main()
作为参数,将self
作为实例方法。
main(self)
创建一个Puzzle对象。
puzzle = Puzzle()
调用对象的主要方法。
puzzle.main()