当前位置:   article > 正文

Python贪吃蛇游戏详细讲解-带源码-可直接运行_python 贪吃蛇

python 贪吃蛇

之前写了个python对象和类、封装继承等基础知识,太枯燥,这次补充一个简单的Python源码,更直观的理解,并加以运用。

基础知识讲解在这里:Python基础-面向对象、对象和类、封装、继承、多态、项目练习

一、先了解下Pygame

Pygame是一个基于Python的游戏开发库,它提供了一系列的工具和接口,使开发人员能够轻松地创建各种类型的游戏,包括2D游戏和简单的3D游戏。在使用Pygame之前,您需要先安装Pygame库。您可以通过以下命令在命令行中安装Pygame:

pip install pygame
  • 1

二、Pygame框架及步骤

  1. 初始化:先初始化Pygame。 创建窗口:创建窗口是游戏开发的第一步。可使用Pygame提供的set_mode()方法创建一个窗口。
  2. 处理事件:在Pygame中,所有的操作都是通过事件来实现的。可以使用event.get()方法获取所有的事件,并通过事件类型来判断用户的操作。
  3. 更新窗口:在绘制完图形后,需要使用pygame.display.update()方法来更新窗口,使得用户能够看到最新的游戏画面。
  4. 控制游戏帧率:在Pygame中,游戏帧率是非常重要的,可以使用Pygame提供的Clock类来控制游戏的帧率。
  5. 键盘和鼠标输入:在游戏中,键盘和鼠标输入也是非常重要的操作。可以使用Pygame提供的key模块和mouse模块来检测键盘和鼠标的输入。
    基础框架代码。
import pygame
import sys
SCREEN_X = 600
SCREEN_Y = 600

def main():
    pygame.init() # 初始化游戏引擎
    screen_size = (SCREEN_X, SCREEN_Y) # 设置游戏窗口的大小
    screen = pygame.display.set_mode(screen_size) # 创建游戏窗口
    pygame.display.set_caption('Snake') # 设置标题
    clock = pygame.time.Clock() # 控制游戏帧率
    
    while True: # 死循环,确保窗口一直显示
	    for event in pygame.event.get(): # 遍历所有事件
	        if event.type == pygame.QUIT: # 如果单击关闭窗口
	            sys.exit()

	    pygame.display.update() # 更新窗口
        clock.tick(5) # 控制游戏帧率
    # 游戏退出

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

三、snake 类、属性及方法

蛇类
方法: 增加/删除 、死亡判断、移动、改变方向
基本框架:

# 点以25为单位
class Snake:
    # 初始化各种需要的属性 [开始时默认向右/身体块x5]
    def __init__(self):
        self.dirction = pygame.K_RIGHT
        self.body = []
        for x in range(5):
            self.addnode()

    # 无论何时 都在前端增加蛇块
    def addnode(self):
    # 删除最后一个块
    def delnode(self):
    # 死亡判断
    def isdead(self):
    # 移动!
    def move(self):
    # 改变方向 但是左右、上下不能被逆向改变
    def changedirection(self, curkey):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

四、food 类、属性及方法

食物类
方法: 放置/移除
基本框架:

class Food:
    def __init__(self):
        self.rect = pygame.Rect(-25, 0, 25, 25)
    # 移除实物
    def remove(self):
    # 放置实物
    def set(self):
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

先看下运行后的游戏界面,有点丑,各位可以继续美化:
在这里插入图片描述

五、完整代码

import pygame
import sys
import random

# 全局定义
SCREEN_X = 600
SCREEN_Y = 600

# 蛇类
# 点以25为单位
class Snake:
    # 初始化各种需要的属性 [开始时默认向右/身体块x5]
    def __init__(self):
        self.dirction = pygame.K_RIGHT
        self.body = []
        for x in range(5):
            self.addnode()

    # 无论何时 都在前端增加蛇块
    def addnode(self):
        left, top = (0, 0)
        if self.body:
            left, top = (self.body[0].left, self.body[0].top)
        node = pygame.Rect(left, top, 25, 25)
        if self.dirction == pygame.K_LEFT:
            node.left -= 25
        elif self.dirction == pygame.K_RIGHT:
            node.left += 25
        elif self.dirction == pygame.K_UP:
            node.top -= 25
        elif self.dirction == pygame.K_DOWN:
            node.top += 25
        self.body.insert(0, node)

    # 删除最后一个块
    def delnode(self):
        self.body.pop()

    # 死亡判断
    def isdead(self):
        # 撞墙
        if self.body[0].x not in range(SCREEN_X):
            return True
        if self.body[0].y not in range(SCREEN_Y):
            return True
        # 撞自己
        if self.body[0] in self.body[1:]:
            return True
        return False

    # 移动!
    def move(self):
        self.addnode()
        self.delnode()

    # 改变方向 但是左右、上下不能被逆向改变
    def changedirection(self, curkey):
        LR = [pygame.K_LEFT, pygame.K_RIGHT]
        UD = [pygame.K_UP, pygame.K_DOWN]
        if curkey in LR + UD:
            if (curkey in LR) and (self.dirction in LR):
                return
            if (curkey in UD) and (self.dirction in UD):
                return
            self.dirction = curkey

# 食物类
# 方法: 放置/移除
# 点以25为单位
class Food:
    def __init__(self):
        self.rect = pygame.Rect(-25, 0, 25, 25)

    def remove(self):
        self.rect.x = -25

    def set(self):
        if self.rect.x == -25:
            allpos = []
            # 不靠墙太近 25 ~ SCREEN_X-25 之间
            for pos in range(25, SCREEN_X - 25, 25):
                allpos.append(pos)
            self.rect.left = random.choice(allpos)
            self.rect.top = random.choice(allpos)
            print(self.rect)

def show_text(screen, pos, text, color, font_bold=False, font_size=60, font_italic=False):
    # 获取系统字体,并设置文字大小
    cur_font = pygame.font.SysFont("宋体", font_size)
    # 设置是否加粗属性
    cur_font.set_bold(font_bold)
    # 设置是否斜体属性
    cur_font.set_italic(font_italic)
    # 设置文字内容
    text_fmt = cur_font.render(text, 1, color)
    # 绘制文字
    screen.blit(text_fmt, pos)

def main():
    pygame.init() # 初始化游戏引擎
    screen_size = (SCREEN_X, SCREEN_Y) # 设置游戏窗口的大小
    screen = pygame.display.set_mode(screen_size) # 创建游戏窗口
    pygame.display.set_caption('Snake') # 设置标题
    clock = pygame.time.Clock() # 控制游戏帧率
    scores = 0
    isdead = False

    # 蛇/食物
    snake = Snake()
    food = Food()

    while True: # 死循环,确保窗口一直显示
        for event in pygame.event.get(): # 遍历所有事件
            if event.type == pygame.QUIT: # 如果单击关闭窗口
                sys.exit()
            if event.type == pygame.KEYDOWN:
                snake.changedirection(event.key)
                # 死后按space重新
                if event.key == pygame.K_SPACE and isdead:
                    return main()
        # 填充窗口颜色
        screen.fill((0, 0, 0))

        # 画蛇身 / 每一步+1分
        if not isdead:
            scores += 1
            snake.move()
        for rect in snake.body:
            pygame.draw.rect(screen, (0, 255, 0), rect, 0)

        # 显示死亡文字
        isdead = snake.isdead()
        if isdead:
            show_text(screen, (100, 200), 'YOU DEAD!', (227, 29, 18), False, 100)
            show_text(screen, (150, 260), 'press space to try again...', (0, 0, 22), False, 30)

        # 食物处理 / 吃到+50分
        # 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
        if food.rect == snake.body[0]:
            scores += 50
            food.remove()
            snake.addnode()

        # 食物投递
        food.set()
        pygame.draw.rect(screen, (255, 0, 127), food.rect, 0)
        # 显示分数文字
        show_text(screen, (50, 500), 'Scores: ' + str(scores), (255, 0, 0))

        pygame.display.update()
        clock.tick(5)

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154

既然都看到这里了,请点赞+关注鼓励一下,后续继续更新。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/702129
推荐阅读
相关标签
  

闽ICP备14008679号