在编写俄罗斯方块游戏时,遇到了一些似乎无法克服的挑战。我希望这些块能够系统地逐个下降,但似乎无法得到,因为我遇到了另一个错误。这是我的错误服务代码
#All modules have been imported
class block1(Widget):
def __init__(self, **kwargs):
super(block1, self).__init__(**kwargs)
xpositions = (0, 50, 100, 150, 200, 250, 300, 350, 400)
self.bind(pos= self.fall)
self.pos_x = random.choice(xpositions)
self.pos_y = Window.height
self.pos = (self.pos_x,self.pos_y)
self.vel_x = 0
self.vel_y = -5
velocity = vel_x,vel_y
def fall(self, **kwargs):
self.pos = Vector(*self.position) + self.pos
if self.pos[1]==0:
self.position[1] = 0
return self.pos
@classmethod
def new_widget(cls):
return cls
#This widget is intended to help me create the new instance of a the
same class i.e to multiply this block within my app
class block2(Widget):
def __init__(self, **kwargs):
super(block1, self).__init__(**kwargs)
xpositions = (0, 50, 100, 150, 200, 250, 300, 350, 400)
self.bind(pos= self.fall)
self.pos_x = random.choice(xpositions)
self.pos_y = Window.height
self.pos = (self.pos_x,self.pos_y)
self.vel_x = 0
self.vel_y = -5
velocity = vel_x,vel_y
def fall(self, **kwargs):
self.pos = Vector(*self.position) + self.pos
if self.pos[1]==0:
self.position[1] = 0
return self.pos
@classmethod
def new_widget(cls):
return cls
#This widget is intended to help me create the new instance of a the
same class i.e to multiply this block within my app
我面临三个问题。第一个是在我的函数块类调用fall
下的函数中,当block1 has no attribute called velocity
函数中明显存在__init__
时,我不断收到错误消息。
我定义了两个新的块类,分别为每个自定义.kv
文件,为每个文件定义了不同的颜色和大小。每当创建类时,我都会编写代码来定义新的启动位置和固定的速度。之后,我创建了fall类以使我的应用程序掉落。
在我的应用程序类的构建中,我试图通过检测一个块何时下降并随后使下一个块开始,使块一个接一个地下降。
def build(self):
game= board()
first = block1()
second = block2()
game.add_widget(first)
Clock.schedule_interval(first.fall, 1/60)
if first.pos[1] == 0:
game.add_widget(second)
Clock.schedule_interval(second.fall, 1/60)
其次,在我的 init 函数中,我尝试将fall
函数绑定到该类的pos
属性,以便在块掉落时将pos
属性班级随之变化。无论程序如何,无论绑定如何,似乎都无法检测到pos
中的更改。
最后,我尝试创建一个新的@classmethod
,它将帮助我为tetris应用反复无限制地创建新块,并且不知道我在哪里弄错了。我创建了一个类方法,该方法返回该类的新实例,并计划创建一个循环,以这种方式继续创建类的新实例:
game = tetrisgame()#This is the main layout for the game
while game:#To create a loop to keep adding new blocks
blockchoice = randint(1,6)
if blockchoice == 1:
game.add_widget(block1.new_widget)
Clock.schedule_interval(block1.fall,1/60)
for i in allblocks:
if block1.collide_widget(i):
block1.position[1] = 0
这给我一个绑定错误,提示widget.bind
错误,并且无法为我的课程创建新实例。
有人可以帮我澄清一下吗?
注意:我试图挑选出导致错误的代码部分,以防止发布过多的代码,因此请注意,所有模块均已导入,.kv
文件已全部导入设计被省略。
答案 0 :(得分:0)
这里有很多问题。您的block1
实际上没有velocity
属性。 velocity
中提到的__init__()
只是一个局部变量。如果希望将其作为属性,则必须将其分配为self.velocity=
。同样,对velx,vely
的引用也没有引用属性self.velx
和self.vely
。
您的fall()
方法引用的self.position
我在任何地方都看不到。
我看不到您的小部件位置如何更改。也许您的fall()
方法中的那行应该是:self.pos = Vector(*self.velocity) + self.pos
。
pos
的{{1}}属性告诉Widget
在何处绘制,所以我不认为您担心将Kivy
绑定到任何东西,这将是pos
的位置。