我正在尝试为我在Python中编码的俄罗斯方块创建旋转程序。旋转部件正常工作但我有块从屏幕旋转或进入其他块的问题。我试图创建的是一个函数,它将在实际旋转块之前进行测试旋转以查看旋转是否有效。
这里调用函数:
if rotatecheck(curblock,rowheight,columnwidth):
rotate(curblock,rowheight,columnwidth)
其中curblock
是一个包含4个矩形对象和1种颜色的列表,columnwidth
和rowheight
是定义游戏空间大小的整数,rotatecheck()
定义为
def rotatecheck(curc, ro, col):
new=[]
ct=len(blockonscreen)-1
if ct==0:
ct=1
for z in range(len(curc)):
new.append(curc[z])
rotate(new, ro, col)
for i in range(len(new)-1):
if new[i].left<0 or new[i].left>=WINDOWWIDTH:
return False
for b in blockonscreen:
if b !=curc:
for x in range(len(block)-1):
if new[i] == block[x]:
return False
return True
blockonscreen
是包含4个rect对象和颜色的列表列表,rotate()
定义为
def rotate(curr,ro,col):
if curr[4]==yellow:
rotateo(curr,ro,col)
elif curr[4]==cyan:
rotatei(curr,ro,col)
else:
rotatea(curr,ro,col)
def rotatei(curr,ro,col):
if curr[2].centerx>curr[0].centerx and curr[3].centerx>curr[0].centerx:
horiz=True
curr[0].centerx+=col
bla=1
elif curr[2].centerx<curr[0].centerx and curr[3].centerx<curr[0].centerx:
horiz=True
curr[0].centerx-=col
bla=-1
elif curr[2].centery>curr[0].centery and curr[3].centery>curr[0].centery:
horiz=False
curr[0].centery+=ro
bla=-1
elif curr[2].centery<curr[0].centery and curr[3].centery<curr[0].centery:
horiz=False
curr[0].centery-=ro
bla=1
for f in range (1,4):
if horiz:
curr[f].left=curr[0].left
curr[f].top=curr[0].top+(blocks[0][f-1][0]*ro*bla)
else:
curr[f].top=curr[0].top
curr[f].right=curr[0].right+(blocks[0][f-1][0]*col*bla)
def rotateo(curr,ro,col):
pass
def rotatea(curr,ro,col):
middlex=curr[0].centerx
middley=curr[0].centery
for r in range(1,4):
if curr[r].centery==middley and curr[r].centerx>middlex:
curr[r].centery+=ro
curr[r].centerx-=col
elif curr[r].centery==middley and curr[r].centerx<middlex:
curr[r].centery-=ro
curr[r].centerx+=col
elif curr[r].centerx==middlex and curr[r].centery>middley:
curr[r].centery-=ro
curr[r].centerx-=col
elif curr[r].centerx==middlex and curr[r].centery<middley:
curr[r].centery+=ro
curr[r].centerx+=col
elif curr[r].centerx>middlex and curr[r].centery>middley:
curr[r].centerx-=(2*col)
elif curr[r].centery>middley and curr[r].centerx<middlex:
curr[r].centery-=(2*ro)
elif curr[r].centerx<middlex and curr[r].centery<middley:
curr[r].centerx+=(2*col)
elif curr[r].centerx>middlex and curr[r].centery<middley:
curr[r].centery+=(2*ro)
在当前状态下,程序就像rotatecheck()
不存在一样。我反复搜索我的代码,但我发现它没有任何问题。
答案 0 :(得分:1)
这里的问题似乎是rotatecheck
实际rotate
您尝试测试的对象,导致它们rotate
d即使它return False
为for z in range(len(curc)):
new.append(curc[z])
centerx
centery
和curc
保存在curc
中的对象中,当您执行此操作时,您将填入一个新列表,其中包含对相同对象的引用,然后旋转。您需要在copy
中创建单个对象的副本;定义一个centerx
方法,该方法创建一个具有相同值的新对象。 {{1}}。