简介:摘要:本文描述了运用Pygame来制作简单的贪吃蛇游戏以及制作中遇到的一些问题与解决方法 关键词:Pygame,贪吃蛇 1 概述:游戏是人们日常最主要的娱乐方式之一。Pygame是python平台下的游戏开发库,可以用于一些2D游戏的制作。 2 游戏内容介绍:游戏中使用三个单位的正方形作为贪吃蛇的身体,以一个单位的正方形作为食物。当贪吃蛇吃掉食物后,它的身体会变长。玩家可以控制贪吃蛇的移动从而吃到食物。当蛇的头部撞到游戏界面边缘时游戏结束。程序运行起来如下图所示: 3 核心代码:在最开始的时候,我们需要导入Pygame,系统以及随机数的模块,代码如下: import pygame, sys, random 首先贪吃蛇游戏由蛇和食物组成,游戏中蛇呈白色,食物呈红色。蛇的身体是由三个20*20的像素框组成,食物由一个像素框组成。玩家可以通过上下左右四个键来控制蛇的移动方向从而吃到食物。当蛇的头部碰到食物时,代表它吃到了食物。当它吃到食物后,蛇的生体增加一个像素框,食物再从屏幕上随机生成。当玩家按下的按键和蛇行动的方向相反时,蛇不会做出反应,当按键和蛇的行动方向相同时,蛇也不会加速。 玩家可以通过键盘上的方向键来控制蛇的移动方向并且当玩家按的方向键与蛇移动方向相反时,蛇不会做出反应。以下是其部分代码: if event.key == K_RIGHT: changeDirection = "right" if event.key == K_LEFT: changeDirection = "left" if event.key == K_UP: changeDirection = "up" if event.key == K_DOWN: changeDirection = "down" 上面这段代码定义了当玩家按下右方向键时,贪吃蛇的改变移动方向为右。当玩家按下左方向键时,贪吃蛇的改变移动方向左。同理,按下上方向键时贪吃蛇的改变移动方向为上,按下下箭头时,贪吃蛇的改变移动方向为向下。 if changeDirection == "left" and not direction == "right": direction = changeDirection if changeDirection == "right" and not direction == "left": direction = changeDirection if changeDirection == "up" and not direction == "down": direction = changeDirection if changeDirection == "down" and not direction == "up": direction = changeDirection 上述代码表示当改变方向为右且移动方向不为左时,贪吃蛇就会向右转反之亦然。当改变方向为上且移动方向不为下时,蛇会向上转,同理,当改变方向为下,移动方向不为上时,蛇会向下转。 制作时设置游戏界面大小,目标初始位置以及蛇的大小和初始运动方向也极为重要,大家可以按照自己的喜好来调整游戏界面的大小和蛇的初始运动方向。 playSurface = pygame.display.set_mode((640, 600)) pygame.display.set_caption("Snake using Python") snakePosition = [100, 100] snakeBody = [[100, 100], [80, 100], [60, 100]] targetposition = [300, 300] eatenFlag = 1 direction = "right" 其中640为游戏界面的宽度,600为界面的高度。"Snake using Python"这三个单词为这个游戏的标题。在这段代码中,我们可以看到蛇的初始位置为100,100,蛇由三个相连的像素框组成并且蛇的初始移动方向为向右移动。食物的初始位置在300,300这个位置上。 蛇头向前延伸一格,就会把它原来尾部的格子去掉使它看起来像是整体向前移动而不是从头部无限延长。当它吃到游戏中的食物后,就会把尾部的格子保留让它看起来像是变长了。当食物被蛇吃掉之后,新的食物会在游戏界面内随机生成。下面是部分代码: if eatenFlag == 0: x = random.randrange(1, 32) y = random.randrange(1, 24) targetposition = [int(x * 20), int(y * 20)] eatenFlag = 1 玩家可以在游戏在中通过按下方向键来控制蛇行动的方向 if direction == "right": snakePosition[0] += 20 if direction == "left": snakePosition[0] -= 20 if direction == "up": snakePosition[1] -= 20 if direction == "down": snakePosition[1] += 20 在游戏中的每个像素框的大小均为20*20,由此,我们可以从上面的这段代码中看出当玩家按下右箭头时,蛇的头部会向它的右侧移动一个像素宽框,从而让它看起来像是往右转了一样。由于游戏中像素框的排列是从左往右递增得的,所以向右转的符号为正的。而在垂直方向,像素框是从上往下递增的,所以向上转的符号为负。同理,向左转的符号也为负,向下转的符号为正。 当然,制作者也可以由自己的喜好来定义游戏背景的颜色,贪吃蛇的颜色以及食物的颜色 pygame.draw.rect(playSurface, whiteColor, Rect(position[0], position[1], 20, 20)) pygame.draw.rect(playSurface, redColor, Rect(targetposition[0], targetposition[1], 20, 20)) 先在整段代码的开头定义好颜色之后,就可以用上面这段代码来调整贪吃蛇的颜色和食物的颜色。可以看到我的代码中的贪吃蛇颜色是为白色,食物的颜色为红色。 同时,制作时需要设置贪吃蛇的前进速度,否则它将会快速的撞到游戏界面的边缘导致游戏结束 if snakePosition[0] > 620 or snakePosition[0] < 0: gameOver() elif snakePosition[1] > 600 or snakePosition[1] < 0: gameOver() 如果贪吃蛇头部的格子碰到游戏界面的最左侧或者最右侧时,则游戏介绍。同理,如果贪吃蛇的头部碰到游戏界面的最上方或者最下方时,游戏结束。 下面的frame per second 控制不同计算机的速度,如果屏蔽掉 就会很快。 fps.tick(3) 上面的代码表示当贪吃蛇的头部撞到游戏边缘时,游戏结束。最后的fps.tick(3)中的3则表示贪吃蛇移动时的速度。 4 结束语: Pygame可以使游戏的开发变得更快捷,对初学者来说更容易上手。本文描述了贪吃蛇游戏制作时要注意的点以及一些核心算法。 5 参考文献: [1]杜兰, 陈琳琳, 黄祎静. 基于Pygame的壁球游戏的设计与开发[J]. 电子技术与软件工程, 2018, No.144(22):69+217. [2] https://www.pygame.org (pygame 的官方网站) [3]瞿苏. (2019). 基于python的飞机大战游戏设计. 扬州职业大学学报, 23(01), 39-43.