Python 300行游戏开发(基于Pygame贪吃蛇)

本文是一篇使用Python 300行代码实现的基于Pygame的贪吃蛇游戏教程,详细介绍了游戏开发过程,包括游戏模式、规则、资源管理、碰撞检测和控制方法。游戏包含简单模式和普通模式,通过键盘控制蛇移动,吃食物增加长度,触碰墙体或自身身体导致游戏失败。游戏音效和图像资源均有说明,同时提供了源码供读者学习和探讨。
摘要由CSDN通过智能技术生成

使用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'
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值