百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python小游戏-贪吃蛇大冒险

off999 2024-12-03 17:15 18 浏览 0 评论

一、游戏简介

1.1游戏操作及游戏规则
(1)游戏开始后,通过键盘上下左右键控制贪吃蛇移动寻找食物;
(2)贪吃蛇每吃一个食物,身长会增加一个单位;
(3)在正常模式中,贪吃蛇如果碰到墙面或咬到自身,则游戏失败;
(4)在可穿墙模式中,贪吃蛇可以穿过墙面,但咬到自身后,游戏失败。

二、游戏总体设计

2.1 游戏总体设计框架图

三、编译语言以及用到的库文件描述

3.1 Python语言
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),Python语言具有非常简洁且清晰的语法特点,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。目前,基于Python语言的相关技术正在飞速发展,用户数量急剧增大,相关的资源越来越多。
3.2 pygame库
Pygame是跨平台Pyth,Pygame 作者是 Pete Shinners, 协议为 GNU Lesser General Public License。Pygame包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。
3.3 random库
Random是产生随机数的库,即随机数发生器,random产生的是伪随机数或者说是用一种复杂的方法计算得到的序列值,因此每次运算时需要一个不同的种子值。种子值不同,得到的序列值也不同。
3.4 time库
time库是Python中处理时间的标准库,用于计算机时间的表达,提供获取系统时间并格式化输出功能,提供系统级精确计时功能,也可用于程序性能分析。
3.5 sys库
sys.exit([ arg ])用于程序的退出,sys.exit(n) 退出程序,正常退出时exit(0)。这是通过引发SystemExit 异常来实现的,因此遵循finally语句的子句所指定的清理操作try ,并且可以拦截外层的退出尝试。可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象。如果它是整数,则零被认为是“成功终止”,并且任何非零值等视为“异常终止”。

四、游戏设计与实现

4.1游戏整体设计

1.定义贪吃蛇对象,包括蛇头和蛇身两个部分,蛇头单独设置,蛇身使用列表来存储;
2.定义食物对象,包括食物对象的初始化、随机颜色和随机位置的设置;
3.定义初始化界面,在该界面中设置文本为“正常模式”、“可穿墙模式”和“退出”的三个按钮供玩家选择;
4.定义正常模式,包括游戏窗口显示、主循环和判断贪吃蛇死亡的设置;
5.定义可穿墙模式,包括游戏窗口显示、主循环和判断贪吃蛇死亡的设置;
6.定义游戏结束窗口,包括窗口显示和最后得分显示的设置。

4.2主要函数解析

4.2.1 new_food()函数
食物对象初始化函数,传入形参为贪吃蛇蛇头坐标。当贪吃蛇吃掉食物后,通过该函数生成新的食物。通过传入形参判断新生成的食物坐标是否与蛇头坐标相同,若相同则重新生成新的坐标。
4.2.2 start_game()函数
正常模式的主循环函数,通过该函数进行正常模式下贪吃蛇和食物的初始化、玩家控制贪吃蛇运动、蛇头和蛇身的判断更新和得分统计实现。
4.2.3 die_snake()函数
正常模式下贪吃蛇死亡判断函数,传入形参为贪吃蛇蛇头和蛇身坐标数据。在该函数中设置布尔型变量die_flag,若死亡设置为Ture并返回,没有死亡为False。通过遍历蛇身存储列表,判断蛇身坐标是否与蛇头坐标相同,若相同则判定贪吃蛇咬到自身,死亡。同时,判断贪吃蛇是否撞墙,及判断蛇头的x和y坐标是否窗体的宽高,若超过则死亡。
4.2.4 start_kgame()函数
可穿墙模式的主循环函数,通过该函数进行可穿墙模式下贪吃蛇和食物的初始化、玩家控制贪吃蛇运动、蛇头和蛇身的判断更新和得分统计实现。
4.2.5 through_snake()函数
可穿墙模式下贪吃蛇死亡判断函数,传入形参为贪吃蛇蛇头和蛇身坐标数据。在该函数中设置布尔型变量die_flag,若死亡设置为Ture并返回,没有死亡为False。通过遍历蛇身存储列表,判断蛇身坐标是否与蛇头坐标相同,若相同则判定贪吃蛇咬到自身,死亡。
4.2.6 show_end()函数
游戏结束时,结束界面设置函数。在该函数中进行结束界面窗体的初始化,在窗体中显示玩家的最终得分,并在改函数中调用pygame库quit方法,使该库停止工作。
4.2.7 into_game()函数
游戏初始界面实现函数,在该函数中进行游戏初始界面窗体的初始化。在该界面窗体中设置文本为“正常模式”、“可穿墙模式”和“退出”的三个点击按钮,通过设置循环,调用button函数(详细见6.2.8)监听玩家的点击。
4.2.8 button()函数
游戏初始界面按钮监听函数,在该函数中实现对玩家鼠标点击事件和键盘输入事件的监听。并根据玩家选择,运行按钮对应的触发函数。即点击“正常模式”按钮,运行正常模式的主循环函数,以此类推。

五、运行模块代码结构


在运行模块,进行pygame库的初始化、设置游戏背景音乐、显示窗口各个参数的设置以及游戏初始界面的显示设置,具体结果代码如下图:

六、游戏运行测试(截图)

1.游戏初始选择界面

2.正常模式运行界面



3.可穿墙模式运行界面

4.游戏结束界面



七、游戏完整代码

import sys
import time
import pygame
from random import *
# Position类,通过其构造函数,设置x和y
class Position(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
# 生成随机的食物
def new_food(head):
    while True:
        new_food = Position(randint(0, 48) * 20, randint(0, 29) * 20)
        # 判断新生成的事物是否和贪吃蛇蛇头重合,重合则不创键
        if new_food.x != head.x and new_food.y != head.y:
            break
        else:
            continue
    return new_food
# 绘制,在窗体中绘制贪吃蛇、食物
# color:颜色,position: 坐标
def rect(color, position):
    pygame.draw.circle(window, color, (position.x, position.y), 10)
# 初始界面和游戏中点差退出游戏时
def exit_end():
    pygame.quit()
    quit()
# 游戏结束时,显示得分的窗体的设置
def show_end():
    # 设计窗口
    # 定义窗口大小
    small_window = pygame.display.set_mode((960, 600))
    init_background = pygame.image.load("image/init_bgimg.jpg")
    small_window.blit(init_background, (0, 0))
    # 定义标题
    pygame.display.set_caption("贪吃蛇大冒险")
    # 定义背景图片
    font = pygame.font.SysFont("simHei", 40)
    fontsurf = font.render('游戏结束! 你的得分为: %s' % score, False, black)
    small_window.blit(fontsurf, (250, 200))
    pygame.display.update()
    time.sleep(2)
    pygame.quit()
    sys.exit()
# 正常模式死亡设置
# head: 蛇头, snake_body:蛇身
def die_snake(head, snake_body):
    # 定义标志物,默认为false,true时判定贪吃蛇碰到自己,死亡
    die_flag = False
    # 遍历存放贪吃蛇位姿的列表,从第1个开始,(第0个位蛇头)
    for body in snake_body[1:]:
        # 如果蛇头的xy和蛇身xy相等,则判定相撞,设置flag为ture
        if head.x == body.x and head.y == body.y:
            die_flag = True
    # 若蛇头的xy在显示窗体外,或flag为true,则显示结束界面,并退出游戏
    if head.x < 0 or head.x > 960 or head.y < 0 or head.y > 600 or die_flag:
        pygame.mixer.music.stop()
        show_end()
# 正常模式主体设置
def start_game():
    # 定义存分数的全局变量
    global score
    global color
    color = (randint(10, 255), randint(10, 255), randint(10, 255))
    # 定义存放玩家键盘输入运动方向的变量,初始为向右
    run_direction = "right"
    # 定义贪吃蛇运动方向的变量,初始为玩家键入方向
    run = run_direction
    # 实例化蛇头、蛇身、食物对象
    head = Position(160, 160)
    # 初始化蛇身长度为3个单位
    snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]
    # 初始化食物位置
    food = Position(300, 300)
    # 死循环
    while True:
        window.blit(background, (0,0))
        # 监听玩家键盘输入的运动方向值,并根据输入转为up、down、right或left,方便程序中调用
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                show_end()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    run_direction = "up"
                elif event.key == pygame.K_RIGHT:
                    run_direction = "right"
                elif event.key == pygame.K_LEFT:
                    run_direction = "left"
                elif event.key == pygame.K_DOWN:
                    run_direction = "down"
        # 食物
        rect(color, food)
        # 蛇头
        rect(black, head)
        # 蛇身
        for pos in snake_body:
            rect(white, pos)
        # 判断贪吃蛇原运动方向与玩家键盘输入的运动方向是否违反正常运动情况
        if run == "up" and not run_direction == "down":
            run = run_direction
        elif run == "down" and not run_direction == "up":
            run = run_direction
        elif run == "left" and not run_direction == "right":
            run = run_direction
        elif run == "right" and not run_direction == "left":
            run = run_direction
        # 插入蛇头位置到蛇身列表中
        snake_body.insert(0, Position(head.x, head.y))
        # 根据玩家键入方向进行蛇头xy的更新
        if run == "up":
            head.y -= 20
        elif run == "down":
            head.y += 20
        elif run == "left":
            head.x -= 20
        elif run == "right":
            head.x += 20
        # 判断是否死亡
        die_snake(head, snake_body)
        # 判断蛇头和食物坐标,若相等,则加分,并生成新的食物
        if head.x == food.x and head.y == food.y:
            score += 1
            food = new_food(head)
            color = (randint(10, 255), randint(10, 255), randint(10, 255))
        else:
            snake_body.pop()
        font = pygame.font.SysFont("simHei", 25)
        mode_title = font.render('正常模式', False, grey)
        socre_title = font.render('得分: %s' % score, False, grey)
        window.blit(mode_title, (50, 30))
        window.blit(socre_title, (50, 65))
        # 绘制更新
        pygame.display.update()
        # 通过帧率设置贪吃蛇速度
        clock.tick(8)
# 可穿墙模式死亡设置
# head:蛇头,snake_body:蛇身
def through_snake(head, snake_body):
    # 定义标志位
    die_flag = False
    # 遍历,蛇头碰到蛇身时,flag为true退出游戏
    for body in snake_body[1:]:
        if head.x == body.x and head.y == body.y:
            die_flag = True
    if die_flag:
        pygame.mixer.music.stop()
        show_end()
    else:  # 当蛇头的xy出窗体时
        # 四种穿墙情况,分别设置
        if head.x < 0:
            head.x = 960
        if head.x > 960:
            head.x = 0
        if head.y < 0:
            head.y = 600
        if head.y > 600:
            head.y = 0
# 穿墙模式主体设置
def start_kgame():
    global score
    global color
    color = (randint(10, 255), randint(10, 255), randint(10, 255))
    # 定义蛇初始方向
    run_direction = "up"
    run = run_direction
    # 实例化蛇头、蛇身、食物对象
    head = Position(160, 160)
    # 三格
    snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]
    # 初始化事物位置
    food = Position(300, 300)
    # 死循环,监听键盘键值
    while True:
        window.blit(background, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                show_end()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    run_direction = "up"
                elif event.key == pygame.K_RIGHT:
                    run_direction = "right"
                elif event.key == pygame.K_LEFT:
                    run_direction = "left"
                elif event.key == pygame.K_DOWN:
                    run_direction = "down"
        # 食物
        rect(color, food)
        # 蛇头
        rect(black, head)
        # 蛇身
        for pos in snake_body:
            rect(white, pos)
        # 判断贪吃蛇原运动方向与玩家键盘输入的运动方向是否违反正常运动情况
        if run == "up" and not run_direction == "down":  # 若运动方向为向上,玩家输入运动方向向下,则违背贪吃蛇正常运动情况
            run = run_direction
        elif run == "down" and not run_direction == "up":
            run = run_direction
        elif run == "left" and not run_direction == "right":
            run = run_direction
        elif run == "right" and not run_direction == "left":
            run = run_direction
        # 插入蛇头位置到蛇身列表中
        snake_body.insert(0, Position(head.x, head.y))
        # 根据玩家键入方向进行蛇头xy的更新
        if run == "up":
            head.y -= 20
        elif run == "down":
            head.y += 20
        elif run == "left":
            head.x -= 20
        elif run == "right":
            head.x += 20
        # 穿墙实现
        through_snake(head, snake_body)
        # 判断是否加分和随机生成新的食物
        if head.x == food.x and head.y == food.y:
            score += 1
            food = new_food(head)
            color = (randint(10, 255), randint(10, 255), randint(10, 255))
        else:
            snake_body.pop()
        font = pygame.font.SysFont("simHei", 25)
        mode_title = font.render('穿墙模式', False, grey)
        socre_title = font.render('得分: %s' % score, False, grey)
        window.blit(mode_title, (50, 30))
        window.blit(socre_title, (50, 65))
        # 绘制更新
        pygame.display.update()
        # 通过帧率设置贪吃蛇速度
        clock.tick(8)
# 监听函数,监听键盘输入
# msg: 按钮信息,x: 按钮的x轴,y: 按钮的y轴,w: 按钮的宽,h: 按钮的高,ic: 按钮初始颜色,ac: 按钮按下颜色,action: 按钮按下的动作
def button(msg, x, y, w, h, ic, ac, action=None):
    # 获取鼠标位置
    mouse = pygame.mouse.get_pos()
    # 获取键盘输入
    click = pygame.mouse.get_pressed()
    if x + w > mouse[0] > x and y + h > mouse[1] > y:
        pygame.draw.rect(window, ac, (x, y, w, h))
        if click[0] == 1 and action != None:
            action()
    else:
        pygame.draw.rect(window, ic, (x, y, w, h))
    # 设置按钮中的文字样式和居中对齐
    font = pygame.font.SysFont('simHei', 20)
    smallfont = font.render(msg, True, white)
    smallrect = smallfont.get_rect()
    smallrect.center = ((x + (w / 2)), (y + (h / 2)))
    window.blit(smallfont, smallrect)
# 游戏初始界面,选择模式
def into_game():
    into = True
    while into:
        window.blit(init_background, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit_end()
        # 设置字体
        font = pygame.font.SysFont("simHei", 50)
        # 初始界面显示文字
        fontsurf = font.render('欢迎来到贪吃蛇大冒险!', True, black)  # 文字
        fontrect = fontsurf.get_rect()
        fontrect.center = ((width / 2), 200)
        window.blit(fontsurf, fontrect)
        button("正常模式", 370, 370, 200, 40, blue, brightred, start_game)
        button("可穿墙模式", 370, 420, 200, 40, violte, brightred, start_kgame)
        button("退出", 370, 470, 200, 40, red,brightred, exit_end)
        pygame.display.update()
        clock.tick(15)

相关推荐

登录126邮箱入口(登录126邮箱入口官网)

126邮箱是网易的一个免费邮箱登录入口在浏览器输入:mail.126.com浏览器进入126邮箱网站之后,即可自行登录126邮箱账号。如何在手机上登录126邮箱1、打开手机,找到并打开网易邮箱软件。2...

如何让防火墙允许某个软件(如何允许防火墙阻止访问)

1.打开电脑的开始菜单,找到控制面板选项,并点击打开。2.在打开的控制面板中,找到防火墙选项,并点击打开。3.在打开的防火墙界面中,单击左侧的允许程序通过防火墙选项。4.在跳转的界面中,选择允许通过防...

智慧工厂管理系统(智慧工厂管理系统哪家好)
智慧工厂管理系统(智慧工厂管理系统哪家好)

智慧工厂智能化系统整体的解决方案分为三个主要部分,分别是现场控制系统(FDC)、生产数据管理系统(PDM)以及工厂数字化协同平台(LCT)。其中,现场控制系统(FDC)是智慧工厂系统非常重要的核心组成部分,它是一个支持大规模互联的集群控制系...

2025-11-13 22:03 off999

笔记本无法连接此网络(笔记本无法连接网络wifi)
  • 笔记本无法连接此网络(笔记本无法连接网络wifi)
  • 笔记本无法连接此网络(笔记本无法连接网络wifi)
  • 笔记本无法连接此网络(笔记本无法连接网络wifi)
  • 笔记本无法连接此网络(笔记本无法连接网络wifi)
电脑如何打开隐藏文件(电脑怎么打开隐藏文件夹)

要显示隐藏文件,首先需要打开文件资源管理器,然后点击菜单栏中的“查看”选项,选中“隐藏项目”复选框即可。此时,隐藏文件和文件夹将会显示在文件资源管理器中,可以进行正常操作。如果需要隐藏文件和文件夹,可...

华硕官网客服电话(华硕官网400客服电话)

华硕维修中心官网,http://www.asus.com.cn/support/你可以通过电话,邮件等方式联系华硕的售后客户,提供你的主板序列号,他会告诉你的。华硕ROG真享服务包是一项专门针对购买华...

win11如何进入安全模式(win11如何进入安全模式启动)

进入Win11安全模式有多种方法,下面介绍两种常用的方法:方法一:使用系统配置工具1.使用组合键Win+R打开“运行”对话框,输入“msconfig”并按Enter键。2.在“系统配...

网易邮箱163登录界面(网易163邮箱登陆界面)

163邮箱登录首页入口为http://mail.163.com/网易163免费邮箱--中文邮箱第一品牌.容量自动翻倍,支持50兆附件,免费开通手机号码邮箱赠送3G超大附件服务.支持各种客户端软件收发,...

win10激活注意事项(win10激活过程要多久)

1.是:KMS激活、数字许可证激活、产品密钥激活。2.KMS激活是通过KeyManagementService服务器来激活系统,它需要连接到企业内部的KMS服务器进行激活,适用于企业用户。数字...

华硕官网正品查询(华硕官网防伪查询)

登陆网站www.asus.com.cn进入网站,点击防伪查询,输入16位防伪数码,即可辨别真伪。华硕显卡sn码官网查1.打开浏览器进入华硕官方网站。2.在页面下方找到“华硕产品服务政策”类目,点击进入...

数据网络打开了连不上网怎么回事

1、如您无法上网请尝试关机开机重启;请检查是否已达本月流量封顶阀值;请检查手机设置移动数据是否已打开;手机设置流动数据选项APN及名称是否设置为3gnet。2、如仍无法上网,建议您可通过以下方式进行排...

synopsys软件(synthia软件)

PSIM是趋向于电力电子领域以及电机控制领域的仿真应用包软件。PSIM具有仿真高速、用户界面友好、波形解析等功能,为电力电子电路的解析、控制系统设计、电机驱动研究等有效提供强有力的仿真环境。本...

cmd定时关机命令设置时间(cmd定时关机怎么设置)

在WindowsXP下打开C盘,在Windows下选system32中有一个shutdown的程序,可以复制到其它系统中。“开始”--->运行--->(在输入shutdown的命令)...

笔记本电脑开机就蓝屏(笔记本电脑开机就蓝屏了)

USB:  假如计算机处于开机的状态时USB接口上有U盘等存储设备,那么计算机就很有可能出现蓝屏现象,而且无法正常开机。因此,当计算机在开机时出现蓝屏状态时,我们首先要检查一下USB接口是否有接入U...

重置无线路由器(重置无线路由器密码)

1、将网线—路由器—电脑之间的线路连接好,启动电脑和路由器设备;2、启动设备后,打开浏览器,在地址栏中输入192.168.1.1进入无线路由器设置界面。(如进不了请翻看路由器底部铭牌或者是路由器使用说...

取消回复欢迎 发表评论: