使用300行实现贪吃蛇的简单游戏(详细教程)
上效果图:
简单介绍
编译器:
PyCharm
环境:
python 3.7
使用的库:
Pygame,需要自己安装,或者在PyCharm中自动安装。
模式介绍:
包含简单模式和普通模式。
简单模式:只有触碰到墙体才判断游戏失败,吃到自己的身体则会丢失后面一节(这个可能有点小问题)
普通模式:触碰到墙体或者自己的身体判断游戏失败
游戏规则:
这个就不用详细介绍了吧,通过移动去拾取食物从而增加自己的长度,由于时间紧迫没有设置分数之类的,游戏只有失败没有成功-----“狗头”
游戏使用的资源(图片和音频)
头部图片
身体和食物图片
尾部图片
失败的图片
背景音效
失败音效
吃到食物音效
关于蛇和食物的设计:
这两个部分都是通过一个列表去存储坐标然后进行绘画出来的。碰撞也是根据两个列表是否有重复的坐标进行判断的。
# 储存龙的位置, 并初始位置
self.dragon_location = [(25, 20), (25, 21), (25, 22)]
# 火球位置
self.ball_location = [(30, 10)]
废话说完了(小二)上代码:
导包
import pygame
import sys
import os
import random
初始化窗口
# 初始化并创建一个屏幕对象
pygame.init()
# 设置窗体位置
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d, %d" % (300, 50)
# 引入全局配置设置
settings = Settings()
# 初始化屏幕
screen = pygame.display.set_mode((settings.screen_with, settings.screen_height))
# 设置游戏名
pygame.display.set_caption("贪吃(龙王)")
# 创建开始按钮
play_button = Button(screen, settings, 'PLAY')
# 初始化Clock
my_clock = pygame.time.Clock()
# 创建火球
ball = Ball(screen)
# 创建龙
dragon = Dragon(screen, ball)
pygame.mixer.init()
# 加载背景音乐
sound = pygame.mixer.Sound('music/background.wav')
sound.play(-1)
注意:这里加载音效的时候只能用Sound并且是wav格式的音频,不使用wav的格式会报错!
全局配置类(配置了游戏的基本设置)
class Settings:
"""游戏的全局配置类"""
def __init__(self):
"""初始化游戏"""
# 屏幕宽高
self.screen_with = 1000
self.screen_height = 800
# 背景颜色
self.bg_color = (255, 255, 255)
# 帧数
self.FPS = 10
# 游戏是否结束
self.fail = True
# 判断是否是第一次打开窗口,
self.flag = True
# 是否是简单模式
self.isSimple = False
初始化食物的位置和绘制食物
这里火球根据判断蛇头部和食物两个列表中坐标是否重复来判断是否被吃掉,如果吃掉了就随机在窗口内重置位置。
class Ball:
"""火球设置"""
def __init__(self, screen):
self.screen = screen
# 火球图片
self.ball_image = pygame.image.load('images/ball.png')
# 火球位置
self.ball_location = [(30, 10)]
# 火球是否被吃了
self.flag = False
# 每格大小
self.cell = 20
# 绘制火球
def drawing(self):
width = self.ball_location[0][0] * self.cell
height = self.ball_location[0][1] * self.cell
# 绘制位置
rect = pygame.Rect(width, height, self.cell, self.cell)
# 火球位置
self.screen.blit(self.ball_image, rect)
# 火球被吃了更新
def update(self):
location_x = random.randint(0, 49)
location_y = random.randint(0, 39)
self.ball_location.insert(0, (location_x, location_y))
self.flag = False
初始化蛇的位置,移动和绘制
initialize函数是为了游戏结束后可以调用并且初始化位置和方向信息。
蛇因为使用三张图片进行绘制的,所有分为头,身体和尾部。
而方向为用UP DOWN LEFT TIGHT进行区分。
class Dragon:
"""龙的设置"""
def __init__(self, screen, ball):
self.screen = screen
# 火球
self.ball = ball
# 龙的速度
self.dragon_speed = 10
# 龙头的图片
self.dragon_image = pygame.image.load('images/dragon.png')
# 龙身体图片
self.dragon_body = pygame.image.load('images/ball.png')
# 龙尾部图片
self.dragon_tail = pygame.image.load('images/tail.png')
# 每格大小
self.cell = 20
def initialize(self):
# 龙的方向 UP DOWN LEFT TIGHT
self.dragon_direction = 'UP'
# 储存龙的位置, 并初始位置
self.dragon_location = [(25, 20), (25, 21), (25, 22)]
键盘的控制
本游戏使用,上下左右键(非WSAD)进行控制,如果自己需要自动更改键值就好了。通过点击窗口的关闭进行游戏退出。上下左右只是改变了蛇的方向,具体的渲染在蛇的类里面。
elif event.type == pygame.MOUSEBUTTONDOWN:
这个下面是判断按钮的点击,判断是简单模式还是普通模式,从而对相应的参数进行初始化。
至于按钮的绘制后面直接放到源码里面吧。
# 监视键盘事件
for event in pygame.event.get():
# 按下窗体关闭键退出游戏
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and dragon.dragon_direction != 'DOWN':
dragon.dragon_direction = 'UP'
elif event.key == pygame.K_DOWN and dragon.dragon_direction != 'UP':
dragon.dragon_direction = 'DOWN'
elif event.key == pygame.K_LEFT and dragon.dragon_direction != 'RIGHT':
dragon.dragon_direction = 'LEFT'
elif event.key == pygame.K_RIGHT and dragon.dragon_direction != 'LEFT':
dragon.dragon_direction = 'RIGHT'