首页 > 编程语言 >Python使用pygame写的贪吃蛇详解

Python使用pygame写的贪吃蛇详解

时间:2024-11-30 19:58:11浏览次数:10  
标签:block Python snake 贪吃蛇 pygame y1 change dis

使用python实现的贪吃蛇小游戏,只实现了基础功能

代码

import pygame #python中流行游戏开发库,提供图像处理等功能
import random #python标准库,随机生成数,随机生成食物位置

#初始化模块
pygame.init()

# 颜色
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# 定义显示屏幕大小
dis_width = 800  #宽度800像素
dis_height = 600 #高度600像素

#创建游戏窗口和题目
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('贪吃蛇小游戏')

#提供了一个方法控制帧率
clock = pygame.time.Clock()

#蛇被绘制成10×10的像素块
snake_block = 10

#游戏中字体设置
font_style = pygame.font.SysFont(None, 80, bold=False)
score_font = pygame.font.SysFont(None, 25)

def your_score(score):
    #显示当前分数
    value = score_font.render("Score: " + str(score), True, yellow) #将分数储存在value中
    dis.blit(value, [10, 10])                                       #绘制在离图像左上10×10的位置

def our_snake(snake_block, snake_list):
    #绘制蛇
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])    #绘制每节蛇的位置
'''
#使用这段代码不能够将\n显示分行
def message(msg, color):        #传入文本和颜色
    #居中显示信息
    mesg = font_style.render(msg, True, color)  #True表示抗锯齿
    text_rect = mesg.get_rect(center=(dis_width / 2, dis_height / 2))  # 获取居中位置
    dis.blit(mesg, text_rect)
'''

def message(msg, color):        
    # 分割消息为多行并居中显示
    lines = msg.split('\n')  # 使用换行符分割消息
    line_height = font_style.get_height()  # 获取单行文本的高度
    total_height = line_height * len(lines)  # 计算所有行的总高度
    start_y = (dis_height - total_height) // 2  # 计算开始绘制的位置,使其垂直居中

    # 循环绘制每一行
    for i, line in enumerate(lines):
        mesg = font_style.render(line, True, color)  # 渲染每行文本
        text_rect = mesg.get_rect(center=(dis_width / 2, start_y + i * line_height))  # 获取每行的矩形区域并居中
        dis.blit(mesg, text_rect)  # 绘制消息


def gameLoop():
    #游戏主循环
    game_over = False

    #初始位置
    x1 = dis_width / 2
    y1 = dis_height / 2

    #控制运动方向,初始不移动
    x1_change = 0
    y1_change = 0

    snake_list = []     #储存蛇的位置
    Length_of_snake = 1 #蛇的长度

    #定义食物随机位置
    foodx = round(random.randrange(0, dis_width - snake_block)/10) * 10.0 
    foody = round(random.randrange(0, dis_height - snake_block)/10) * 10.0

    #游戏循环
    while not game_over:

        for event in pygame.event.get():
            #用户点击了×就停止
            if event.type == pygame.QUIT:
                game_over = True
            #检测用户按下的键
            if event.type == pygame.KEYDOWN:
                # 防止掉头
                if event.key == pygame.K_LEFT and x1_change == 0:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT and x1_change == 0:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP and y1_change == 0:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN and y1_change == 0:
                    y1_change = snake_block
                    x1_change = 0
                
                '''
                # WASD 键对应的控制,加入WASD控制会明显感觉到运行变慢,有延迟
                elif event.key == pygame.K_a and x1_change == 0:  # A: 向左
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_d and x1_change == 0:  # D: 向右
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_w and y1_change == 0:  # W: 向上
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_s and y1_change == 0:  # S: 向下
                    y1_change = snake_block
                    x1_change = 0
                '''
        # 判断是否撞墙,位置超出边界就撞墙
        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_over = True

        #更新位置
        x1 += x1_change
        y1 += y1_change
        dis.fill(blue)  #填充屏幕
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])  #绘制食物,矩形
        snake_head = [x1, y1]
        snake_list.append(snake_head)
        if len(snake_list) > Length_of_snake:
            del snake_list[0]

        # 判断是否撞到自己
        for block in snake_list[:-1]:
            if block == snake_head:
                game_over = True

        our_snake(snake_block, snake_list)
        your_score(Length_of_snake - 1)
        pygame.display.update()

        # 判断是否吃到食物
        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block)/10) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block)/10) * 10.0
            Length_of_snake += 1

        #蛇的帧率,或者说蛇移动的速度,随着Length_of_snake越大,速度越快
        clock.tick(10 + (Length_of_snake // 5))

    # 游戏结束
    #dis.fill(blue)
    message("Game Over!\nYour Score=" + str(Length_of_snake-1), yellow)
    pygame.display.update()
    pygame.time.delay(2000)  # 显示2秒退出
    pygame.quit()

gameLoop()

运行需要pygame库

pip3 install pygame

可以打包成exe

pip install pyinstaller
pyinstaller --onefile --windowed snake_game.py

pygame函数

使用的pygame部分函数

  • 创建窗口:screen = pygame.display.set_mode((800, 600)) # 800x600窗口
  • 设置窗口标题:pygame.display.set_caption("My Game")
  • 更新窗口:pygame.display.update()
  • 检测输入,如鼠标键盘等:
#点×退出
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        pygame.quit()

#键盘
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    # 左箭头键被按下

#鼠标
x, y = pygame.mouse.get_pos()

#鼠标键
left, middle, right = pygame.mouse.get_pressed()
if left:
    # 鼠标左键被按下...
  • 图形绘制:
pygame.draw.rect(screen, (255, 0, 0), (100, 100, 50, 50))  # rect红色矩形
pygame.draw.circle(screen, (0, 255, 0), (400, 300), 50)  # circle绿色圆形
pygame.draw.line(screen, (0, 0, 255), (100, 100), (200, 200), 5)  # line蓝色线条
pygame.draw.polygon(screen, (255, 255, 0), [(100, 100), (200, 50), (300, 100)])  # 黄色三角形,polygon是多边形
  • 图像加载:image = pygame.image.load("image.png")
  • 图像放置:screen.blit(image, (x, y)) # 在指定位置绘制图像
  • 帧率:clock = pygame.time.Clock() clock.tick(60) # 设置帧率为60
  • 字体文字:
#字体样式,大小
font = pygame.font.SysFont("Arial", 30)
#字体内容,抗锯齿,颜色
text_surface = font.render("Hello, World!", True, (255, 255, 255))
#输出,位置
screen.blit(text_surface, (100, 100))

标签:block,Python,snake,贪吃蛇,pygame,y1,change,dis
From: https://blog.csdn.net/2301_79442295/article/details/144159344

相关文章

  • python毕设 在线学习平台程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于在线学习平台的研究,现有研究主要以平台的整体架构和功能实现为主,如大规模在线课程平台(MOOC)的设计与推广等。然而专门针对Python技......
  • Python练习
    练习11、已知lst=[5,2,1,4,9],程序实现:删除lst元素中的最大值和最小值(不考虑多个最值情况)lst=[5,2,1,4,9]lst.sort()print(lst)#[1,2,4,5,9]dellst[0],lst[len(lst)-1]print(lst)#[2,4,5]lst.pop(0)print(lst)#[4,5]练习22、已知info={......
  • 从高校就业信息管理系统到Python和Java类系统开题报告:结构化研究的提纲优化
    个人名片......
  • Python入门 - 判断语句
    判断No.1if判断概念:如果判断条件为真(True),就让程序执行某些代码如果判断条件为假(False),就让程序跳过某些代码语法:ifTrue:print("今天状态很不错")if代表“如果”,是关键字if后面跟随判断条件,结果为真or假英文冒号是if判断的固定格式,表示该句的结束需要在归属于i......
  • Python入门 - 编程基础
    代码与文本No.1输入和输出概念:输入:计算机【收到】来自外界的数据传递·输出:计算机对外界【发出】的数据传递print:理解为“打印”,能让计算机在屏幕上输出内容语法:print("Helloworld")print语法包含四个部分:指令名print;指令附带的括号();标记文本的双引号”;引用的文本......
  • Python深度强化学习智能体DDPG自适应股票交易策略优化道琼斯30股票数据可视化研究
    全文链接:https://tecdat.cn/?p=38380原文出处:拓端数据部落公众号股票交易策略在投资公司中起着至关重要的作用。然而,在复杂多变的股票市场中获取最优策略颇具挑战。本文探索深度强化学习在优化股票交易策略以实现投资回报最大化方面的潜力。选取30只股票作为交易标的,其每日价......
  • Python蒙特卡罗MCMC:优化Metropolis-Hastings采样策略与Fisher矩阵计算参数推断应用—
    全文链接:https://tecdat.cn/?p=38397原文出处:拓端数据部落公众号本文介绍了其在过去几年中的最新开发成果,特别阐述了两种有助于提升Metropolis-Hastings采样性能的新要素:跳跃因子的自适应算法以及逆Fisher矩阵的计算,该逆Fisher矩阵可用作提议密度。通过多个示例展示,这些......
  • python实现自动计算排工期
    一、需求说明如果大家涉及到项目管理的话,那么一定逃不掉规划工期。由于在规划工期的时候需要考虑将法定节假日和周六日进行去除,所以许多人都会打开日历,一天一天的去计算。这样效率即慢,同时也容易出现错误,那么如何快速实现工期的排定呢?假设开发的过程和顺序如下(其他行业的当......
  • Micropython machine库简介
        Micropython是一种精简高效的Python实现,专门为微控制器和嵌入式系统设计。在Micropython中,machine库是一个非常重要的库,它提供了对微控制器硬件的底层访问和控制功能。本文将详细介绍Micropython的machine库,包括其功能、用法和示例程序。一、machine库概述  ......
  • python毕设 社区食堂管理系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于社区食堂管理系统的研究,现有研究多集中在食堂的运营模式和政策扶持方面1,专门针对利用Python开发社区食堂管理系统的研究较少。在......