python pygame写俄罗斯方块 用代码做俄罗斯方块_python pygame写俄罗斯方块

接下来要进入操作部分了

坚持才能获得最后的成就感噢

用移动变量处理用户输入

216. elif (event.key == K_LEFT or event.key == K_a):

217. movingLeft = False

218. elif (event.key == K_RIGHT or event.key == K_d):

219. movingRight = False

220. elif (event.key == K_DOWN or event.key == K_s):

221. movingDown = False

按下一个方向键(或是WASD键)设置 movingLeft, movingRight, or movingDown 变量反馈为错误,表示玩家不再想沿着这条道路移动积木。代码稍后会根据Boolean值中的移动变量处理要做什么。请注意,向上箭头和W键用于旋转积木,而不是移动积木。 这就是为什么没有moveUp变量。

检验滑动或旋转是否是变量

223. elif event.type == KEYDOWN:

224. # moving the block sideways

225. if (event.key == K_LEFT or event.key == K_a) and isValidPosition(board, fallingPiece, adjX=-1):

226. fallingPiece['x'] -= 1

227. movingLeft = True

228. movingRight = False

229. lastMoveSidewaysTime = time.time()

当按下向左键(向左移动是一个变量,移动着积木,所以决定称为isValidPosition()),那么我们应该通过将dropsPiece ['x']的值减去1来将位置更改为左边的一个空格。isValidPosition()函数具有可选参数,称为adjX和adjY。但有时我们不想检查积木当前的位置,但是宁愿检查一些小空格的位置。

如果我们将-1赋值给adjX(“adjusted X”的缩写),那么就不会检查积木数据结构位置的有效性,而是会检查如果左边有一个空格,积木的位置将会放在那里。1赋值给adjX会检查右边的空间。还有adjY作为可选参数。-1赋值给 adjY 检查积木现在所处位置上面一格,将数值如3赋值给adjY会检查积木所处位置下面3格。

movingLeft变量设置为True,仅是确认掉落的积木既不会向左也不会向右移动,在228行的movingRight变量被设定为False。在229行的lastMoveSidewaysTime 变量会下载当前的时间。

这些变量的设置是为了玩家按下方向键使积木继续移动。如果movingLeft变量设置为 True,程序知道向左键(或A键)按下还未松开。如果时间被存入lastMoveSidewaysTime变量后的0.15秒(数据被存储在MOVESIDEWAYSFREQ中),就在这时程序会再次将积木移到左边。

231. elif (event.key == K_RIGHT or event.key == K_d) and isValidPosition(board, fallingPiece, adjX=1):

232. fallingPiece['x'] += 1

233. movingRight = True

234. movingLeft = False

235. lastMoveSidewaysTime = time.time()

线231至235上的代码几乎与第225至229行完全相同,只是当按下右箭头键(或D键)时,它处理向下移动下降的部分。

237. # rotating the block (if there is room to rotate)

238. elif (event.key == K_UP or event.key == K_w):

239. fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(SHAPES[fallingPiece['shape']])

向上键(或w键)可以多次翻转下落的积木。这里所有代码要做的是将fallingPiece的数据库中翻转键的值加1。然而,如果增加的翻转键的值比翻转总数大,然后通过“修改“形状可能旋转的总数(这就是len(SHAPES[fallingPiece['shape']]),则数值将会变为0,现在举一个J形状的例子,它拥有四种翻转方向组合:

>>> 0 % 4

0

>>> 1 % 4

1

>>> 2 % 4

2

>>> 3 % 4

3

>>> 5 % 4

1

>>> 6 % 4

2

>>> 7 % 4

3

>>> 8 % 4

0

>>>

240. if not isValidPosition(board, fallingPiece):

241. fallingPiece['rotation'] = (fallingPiece['rotation'] - 1) % len(SHAPES[fallingPiece['shape']])

如果新的旋转方向是无效的,那是因为它与底板上的一些方块重叠在一起,那么我们想通过从dropsPiece ['rotation']减去1来将其切换回原来的旋转。我们可以通过len(SHAPES[fallingPiece['shape']])来修改旋转方向,如果新的数值是-1,该修改将会更改为列表中的最后一个旋转。 以下是修改负数的示例:

>>> -1 % 4

3

242. elif (event.key == K_q): # rotate the other direction

243. fallingPiece['rotation'] = (fallingPiece['rotation'] - 1) % len(SHAPES[fallingPiece['shape']])

244. if not isValidPosition(board, fallingPiece):

245. fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(SHAPES[fallingPiece['shape']])

242行到245行与238行到241行做着相同的事,除了处理玩家按下控制相反方向翻转的积木的Q键的情况。在这种情况下,我们从dropsPiece ['rotation']中减去1(在第243行完成),而不是加1。

247. # making the block fall faster with the down key

248. elif (event.key == K_DOWN or event.key == K_s):

249. movingDown = True

250. if isValidPosition(board, fallingPiece, adjY=1):

251. fallingPiece['y'] += 1

252. lastMoveDownTime = time.time()

如果按向下键或S键,那么积木下降的速度比正常的要快。251行是在底板向下移动积木一格(仅仅是有效的空格)。movingDown变量设置为True, lastMoveDownTime重置当前时间。稍后将会检查这些变量,为了按下向下键或S键移动的积木将以更快的速度持续下降。

(未完待续)