为了防止玩家太早按下键盘,我们在第180行使用pygame.time.wait(添加半秒的等待时间。第196行的for循环对字典中的每个值进行循环。这是通过第197行和第198行的
确定苹果出现的位置163.defgetrandomlocation () :
164 .返回{ ' x ' : random.randint (0,蜂窝宽度-1),' y': random.randint(0) 0,蜂窝高度-1}
如果需要新的苹果,则需要调用getRandomLocation ()函数。 此函数返回包含横坐标x、y的词典。 x、y的值由random.randint随机生成。
游戏结束界面167.defshowgameoverscreen () :
168.game over fOnt=pygame.font.font (freesansbold.TTF,150 ) ) ) )。
169.gamesurf=字体调用程序(' game ',真,白) )。
170.over surf=字体调用程序(“over”,真,白)。
171. gameRect=gameSurf.get_rect (
172. overRect=overSurf.get_rect (
173.gamerect.midtop=(窗口宽度/2,10 ) ) ) ) ) ) ) ) ) ) )。
174.over rect.midtop=(窗口宽度/2,gameRect.height 10 25 ) ) ) ) ) ) ) )。
175.
176 .显示surf.blit (gamesurf,gameRect ) ) ) ) ) ) ) )。
177.display surf.blit (超曲面,超反射)。
178. drawPressKeyMsg (
179. pygame.display.update (
游戏结束界面与游戏开始界面相似,但游戏结束界面不是动画。 我们用两个Surf对象分别放“Game”和“Over”这个词。
180.pygame.time.wait(500 ) )。
181.checkforkeypress(#从事件队列中清除键盘按下事件
182.
183.while真:
184.if校验福克斯() :
185.pygame.event.get(# (清除#事件队列
186 .返回
“Game Over”在玩家按任意键之前显示在画面上。 为了防止玩家过早(可能不小心)按键盘,请在第180行使用pygame.time.wait ()添加半秒的等待时间。 在这半秒钟内,按键盘不会退出游戏结束界面,而是重新开始游戏。 (括号中的参数500表示500毫秒,即0.5秒)。 这是因为,例如玩家在最后关头想要避开屏幕的边缘,但是因为按按钮太晚蛇死了之类的事情会发生。 如果是这样的话,玩家很可能在showGameOverScreen ()被调用后按了键,此时按键将退出游戏界面并重新开始游戏。
Drawing函数下面的一些代码用于在屏幕上绘制分数、蛇、苹果和网格线。
188.Defdrawscore (得分) :
189.score surf=基本字体渲染(score : % s’% )得分),真,白) ) ) ) ) ) ) ) ) ) )。
190.scorerect=score surf.get _ rect (
191.scorerect.topleft=(窗口宽度- 120,10 ) ) ) ) ) ) ) ) ) ) ) )。
192.display surf.blit (得分子,得分子)。
drawScore ()函数设置字体格式,并将参数score中传递的文本内容显示在屏幕上。
195 .差速器密码(魔兽世界) :
196 .二维码:
197.x=酷睿[ ' x ' ] *蜂窝大小
198.y=酷睿*单元大小
199.wormsegmentrect=pygame.rect (x,y,细胞,细胞) )。
200.pygame.draw.rect (显示曲面、暗绿色、魔兽世界)。
201.worminnersegmentrect=pygame.rect (x 4,y 4,细胞尺寸- 8,细胞尺寸-8) ) ) ) )。
202.pygame.draw.rect (显示曲面、绿色、魔兽世界)
egmentRect)
drawWorm()函数给小蛇的每段身体绘制一个绿色的小方块(用绿色填充游戏屏幕上的一个网格)。每段身体都由wormCoords参数来传递(wormCoords是一个包含各段身体的坐标值的字典变量)。第196行的for循环对字典中的每个值进行循环。
由于网格的坐标占据了整个窗口并且是从(0,0)像素点开始的,我们很容易将网格坐标转化为像素坐标。这是通过第197行和第198行的乘式来实现的。
第199行创建了一个Rect对象,用于把小蛇的某段身体参数传递到第200行的pygame.draw.rect()中。由于所有网格小方格的边长都为CELLSIZE,小蛇的身体片段的边长也应为CELLSIZE。第200行通过将一个小方格填充为深绿色来绘制小蛇的身体片段。然后在深绿色小方格上面,我们叠加一个小一些的亮绿色方格,这让小蛇变得更好看一些。
亮绿色方格的横坐标比网格小方格要多4个像素(往右4个像素),纵坐标也多4个像素(向下4个像素),它的边长比网格小方格要小8个像素,因此亮绿色方格的下部和右部和网格也有4像素的距离。
205. def drawApple(coord):
206. x = coord['x'] * CELLSIZE
207. y = coord['y'] * CELLSIZE
208. appleRect = pygame.Rect(x, y, CELLSIZE, CELLSIZE)
209. pygame.draw.rect(DISPLAYSURF, RED, appleRect)
drawApple()函数和drawWorm()函数非常相似,只不过画红苹果时我们仅仅填充了了一个红色的方格,我们所要做的只是在206行和207行把坐标转换为像素坐标,在208行创建一个Rect对象来储存苹果的位置和大小,然后把这个Rect对象传递给pygame.draw.rect()函数。
212. def drawGrid():
213. for x in range(0, WINDOWWIDTH, CELLSIZE): # 画竖线
214. pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, WINDOWHEIGHT))
215. for y in range(0, WINDOWHEIGHT, CELLSIZE): # 画横线
216. pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (WINDOWWIDTH, y))
为了让网格更明显,我们调用pygame.draw.line()函数来画出网格的横竖线。
通常,要画32条竖线,我们需要调用32次pygame.draw.line()函数:
pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, 0), (0, WINDOWHEIGHT))
pygame.draw.line(DISPLAYSURF, DARKGRAY, (20, 0), (20, WINDOWHEIGHT))
pygame.draw.line(DISPLAYSURF, DARKGRAY, (40, 0), (40, WINDOWHEIGHT))
pygame.draw.line(DISPLAYSURF, DARKGRAY, (60, 0), (60, WINDOWHEIGHT))
......
pygame.draw.line(DISPLAYSURF, DARKGRAY, (560, 0), (560, WINDOWHEIGHT))
pygame.draw.line(DISPLAYSURF, DARKGRAY, (580, 0), (580, WINDOWHEIGHT))
pygame.draw.line(DISPLAYSURF, DARKGRAY, (600, 0), (600, WINDOWHEIGHT))
pygame.draw.line(DISPLAYSURF, DARKGRAY, (620, 0), (620, WINDOWHEIGHT))
为了简便,我们可以使用第213行到第214行的for循环来代替以上这些代码。很多其他规律的图形也可以用循环来完成,这样我们就不需要打一大堆相似的代码。
219. if __name__ == '__main__':
220. main()
在所有需要的常数、函数、和全局变量都被定义和创建后,我们调用main()函数来开始游戏。
(未完待续)