1、安装需要的库pygame
Python Pygame 是一款专门为开发和设计 2D 电子游戏而生的软件包,它支 Windows、Linux、Mac OS 等操作系统,具有良好的跨平台性。Pygame 由 Pete Shinners 于 2000 年开发而成,是一款免费、开源的的软件包,因此您可以放心地使用它来开发游戏,不用担心有任何费用产生。
终端安装执行命令为 pip install pygame
本人采用的是pycharm编译器, 在pycharm中可以在设置中的python解释器中安装pygame包。
2、创建文件夹
用于保存代码及其所需要的字体和图片
1、其中字体用到的文件为s.ttf,可在网站中下载喜欢的字体,将字体另存为s.ttf放在fonts文件夹中。
2、images中的图片文件为cookie.jpg snake1.jpg
3、创建python文件为 snake.py
3、游戏代码解析
1、导入需要的库
import pgzrun # 导入游戏库
import random # 导入随机库
2、界面大小及蛇大小
TILE_SIZE = 20 # 小蛇方块的大小,20*20
WIDTH = 40*TILE_SIZE # 设置窗口的宽度 800
HEIGHT = 30*TILE_SIZE # 设置窗口的高度 600
3、导入蛇头及食物
snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标cookie = Actor('cookie') # 导入食物方块图片
cookie.x = random.randint(10, 30)*TILE_SIZE # 食物方块图片的x坐标
cookie.y = random.randint(10, 30)*TILE_SIZE # 食物方块图片的y坐标
Snake = [] # 存储蛇的列表
Snake.append(snkaeHead) # 把蛇头加入到列表中for i in range(4): # 再为蛇添加4段蛇身snakebody = Actor('snake1') # 导入蛇身方块图片snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方块图片的x坐标snakebody.y = Snake[i].y # 蛇身方块图片的y坐标Snake.append(snakebody) # 把蛇身加入到列表中
4、 初始运动方向、分数及成败
direction = 'up' # 控制小蛇运动方向
isLoose = False # 游戏是否失败
score = 0 # 游戏得分
5、绘图
def draw(): # 绘制模块,每帧重复执行screen.clear() # 每帧清除屏幕,便于重新绘制for snkaebody in Snake: # 绘制蛇snkaebody.draw()cookie.draw() # 食物的绘制screen.draw.text("得分:"+str(score), (360, 20), fontsize=25,fontname='s', color='white')if isLoose: # 显示游戏失败信息screen.draw.text("游戏失败!", (180, HEIGHT/2-100),fontsize=100, fontname='s', color='blue')
6、键盘操作运动方向
def update(): # 更新模块,每帧重复操作global directionif keyboard.left: # 如果按下键盘左键direction = 'left' # 小蛇要向左移if keyboard.right: # 如果按下键盘右键direction = 'right' # 小蛇要向右移if keyboard.up: # 如果按下键盘上键direction = 'up' # 小蛇要向上移if keyboard.down: # 如果按下键盘下键direction = 'down' # 小蛇要向下移
7、蛇运动及碰撞效果
def moveSnake(): # 和蛇相关的一些操作global direction, isLoose, scoreif isLoose:returnnewSnakeHead = Actor('snake1') # 创建新蛇头的图片# 根据direction变量设定新蛇头的坐标,比如小蛇向下移动,就在旧蛇头的下边newSnakeHead = Actor('snake1')if direction == 'right': # 小蛇向右移动newSnakeHead.x = Snake[0].x + TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'left': # 小蛇向左移动newSnakeHead.x = Snake[0].x - TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'up': # 小蛇向上移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y - TILE_SIZEif direction == 'down': # 小蛇向下移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y + TILE_SIZE# 当小蛇(新蛇头)超出边框时游戏失败if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT \or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:isLoose = True# 当小蛇蛇头碰到自身时,游戏失败for snakebody in Snake: # 对所有蛇身循环,判断是否和蛇头坐标一致if newSnakeHead.x == snakebody.x and newSnakeHead.y == snakebody.y:isLoose = Truebreak# 当小蛇头碰到食物时,不处理,也就是长度+1;饼干重新随机位置出现;if newSnakeHead.x == cookie.x and newSnakeHead.y == cookie.y:cookie.x = random.randint(5, 35)*TILE_SIZEcookie.y = random.randint(5, 25)*TILE_SIZEscore = score + 1 # 得分加1else: # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变del Snake[len(Snake)-1]Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面# time.sleep(0.2) # 暂停0.2秒clock.schedule_unique(moveSnake, 0.2) # 下一次隔0.2秒调用
8、调用函数及执行游戏
moveSnake() # 调用移动蛇的函数
pgzrun.go() # 开始执行游戏
4、游戏完整代码
import pgzrun # 导入游戏库
import random # 导入随机库TILE_SIZE = 20 # 小蛇方块的大小,20*20
WIDTH = 40*TILE_SIZE # 设置窗口的宽度 800
HEIGHT = 30*TILE_SIZE # 设置窗口的高度 600snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标cookie = Actor('cookie') # 导入食物方块图片
cookie.x = random.randint(10, 30)*TILE_SIZE # 食物方块图片的x坐标
cookie.y = random.randint(10, 30)*TILE_SIZE # 食物方块图片的y坐标Snake = [] # 存储蛇的列表
Snake.append(snkaeHead) # 把蛇头加入到列表中
for i in range(4): # 再为蛇添加4段蛇身snakebody = Actor('snake1') # 导入蛇身方块图片snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方块图片的x坐标snakebody.y = Snake[i].y # 蛇身方块图片的y坐标Snake.append(snakebody) # 把蛇身加入到列表中direction = 'up' # 控制小蛇运动方向
isLoose = False # 游戏是否失败
score = 0 # 游戏得分def draw(): # 绘制模块,每帧重复执行screen.clear() # 每帧清除屏幕,便于重新绘制for snkaebody in Snake: # 绘制蛇snkaebody.draw()cookie.draw() # 食物的绘制screen.draw.text("得分:"+str(score), (360, 20), fontsize=25,fontname='s', color='white')if isLoose: # 显示游戏失败信息screen.draw.text("游戏失败!", (180, HEIGHT/2-100),fontsize=100, fontname='s', color='blue')def update(): # 更新模块,每帧重复操作global directionif keyboard.left: # 如果按下键盘左键direction = 'left' # 小蛇要向左移if keyboard.right: # 如果按下键盘右键direction = 'right' # 小蛇要向右移if keyboard.up: # 如果按下键盘上键direction = 'up' # 小蛇要向上移if keyboard.down: # 如果按下键盘下键direction = 'down' # 小蛇要向下移def moveSnake(): # 和蛇相关的一些操作global direction, isLoose, scoreif isLoose:returnnewSnakeHead = Actor('snake1') # 创建新蛇头的图片# 根据direction变量设定新蛇头的坐标,比如小蛇向下移动,就在旧蛇头的下边newSnakeHead = Actor('snake1')if direction == 'right': # 小蛇向右移动newSnakeHead.x = Snake[0].x + TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'left': # 小蛇向左移动newSnakeHead.x = Snake[0].x - TILE_SIZEnewSnakeHead.y = Snake[0].yif direction == 'up': # 小蛇向上移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y - TILE_SIZEif direction == 'down': # 小蛇向下移动newSnakeHead.x = Snake[0].xnewSnakeHead.y = Snake[0].y + TILE_SIZE# 当小蛇(新蛇头)超出边框时游戏失败if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT \or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:isLoose = True# 当小蛇蛇头碰到自身时,游戏失败for snakebody in Snake: # 对所有蛇身循环,判断是否和蛇头坐标一致if newSnakeHead.x == snakebody.x and newSnakeHead.y == snakebody.y:isLoose = Truebreak# 当小蛇头碰到食物时,不处理,也就是长度+1;饼干重新随机位置出现;if newSnakeHead.x == cookie.x and newSnakeHead.y == cookie.y:cookie.x = random.randint(5, 35)*TILE_SIZEcookie.y = random.randint(5, 25)*TILE_SIZEscore = score + 1 # 得分加1else: # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变del Snake[len(Snake)-1]Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面# time.sleep(0.2) # 暂停0.2秒clock.schedule_unique(moveSnake, 0.2) # 下一次隔0.2秒调用
moveSnake() # 调用移动蛇的函数
pgzrun.go() # 开始执行游戏
5、游戏效果
QQ录屏20221002232005