Python利用Turtle小乌龟实现推箱子游戏

文章目录:

一:运行效果

1.演示

2.思路和功能

二:代码

文件架构

level.py

PushBox.py


必备知识:python图形化编程turtle小乌龟

一:运行效果

1.演示

效果图◕‿◕✌✌✌ 

Python利用Turtle小乌龟实现推箱子游戏运行演示


参考: python入门小游戏之推箱子(1小时20分钟)

博主提取资源: 提取

2.思路和功能

通过按键开始切换重启游戏,和上下左右建控制人物移动,去推动箱子到指定地方实现闯关


地图:列表集合

二:代码

文件架构

level.py

# 关卡:屏幕正中心为原点

    # C代表:关卡的外部
    # X代表:墙的位置
    # O代表:箱子应该去的正确位置
    # B代表:现在箱子的位置
    # P代表:玩家所在的位置
    # 空白:代表空白

# 8行8列的关卡:每个方块大小是50
#     左上角坐标中心位置(-175,175)
def level_list():       #数列从0开show_win始存储信息的
    level_1 = [
        'CCXXXCCC',
        'CCXOXCCC',
        'CCX XXXX',
        'XXXB BOX',
        'XO BPXXX',
        'XXXXBXCC',
        'CCCXOXCC',
        'CCCXXXCC']
    level_2 = [
        'CXXXXCCC',
        'CX OXXXX',
        'XXO    X',
        'XOO XX X',
        'X B  B X',
        'XX BBXXX',
        'CXP  XCC',
        'CXXXXXCC']
    level_3 = [
        'CCXXXXXXCC',
        'CCX    XXX',
        'CCX B    X',
        'XXX B XX X',
        'XOOO B   X',
        'XOOOBXB XX',
        'XXXX X B X',
        'CCCX  P  X',
        'CCCXXXXXXX']
    level_4 = [
        'CCCXXXXXX',
        'XXXXO  PX',
        'X  BBB  X',
        'XOXXOXXOX',
        'X   B   X',
        'X  BOX XX',
        'XXXX   XC',
        'CCCXXXXXC']
    level_5 = [
        'CXXXXXXXC',
        'XX     XX',
        'X  BOB  X',
        'X BXOXB X',
        'XXOOPOO X',
        'X BXOXB X',
        'X  BOB  X',
        'X   X  XX',
        'XXXXXXXXC']

    # 关卡集合
    levels = []
    # 把关卡加入集合
    levels.append(level_1)
    levels.append(level_2)
    levels.append(level_3)
    levels.append(level_4)
    levels.append(level_5)

    # 返回列表
    return(levels)

PushBox.py

# 导入turtle
import turtle
# 导入外部写的关卡模块
import level

# 创建窗口
ms = turtle.Screen()
# 设置初始尺寸
ms.setup(900, 650, 200, 0)

# 标题
ms.title('推箱子小游戏')

# 注册图片
# 背景图片
ms.register_shape('bc1.gif')
ms.register_shape('bc2.gif')
ms.register_shape('bc3.gif')
ms.register_shape('bc4.gif')
ms.register_shape('bc5.gif')

ms.register_shape('wall.gif')
ms.register_shape('o.gif')          # 正确箱子位置标识图片
ms.register_shape('p.gif')          # 小人
ms.register_shape('box.gif')        # 箱子
ms.register_shape('boxc.gif')       # 推到正确位置,箱子变色

# 默认背景图片1
ms.bgpic('bc1.gif')

ms.tracer(0)        #追踪 屏幕刷新

# 调用地图列表信息
levels = level.level_list()


# ------------------------------------------------------------------------画笔Pen(箱子移动)
#里面使用了move函数、show_win函数
class Pen(turtle.Turtle):   #继承海龟模块中的海龟类
    #每定义一个类就做属性的初始化
    def __init__(self, pic):
        super().__init__()
        self.shape(pic)     #形状
        self.penup()        #抬笔

    # 让人物和箱子移动
    def move(self, x, y, px, py):
        gox, goy = x+px, y+py
        # 人物
        if (gox, goy) in go_space:
            self.goto(gox, goy)
        #箱子 人
        if (gox+px, goy+py) in go_space and (gox, goy) in box_space:
            # 找到箱子开始推
            for i in box_list:
                if i.pos() == (gox, goy):               #前面有箱子:人要去的地方和设定箱子的位置一样
                    # 更新人物
                    go_space.append(i.pos())
                    # 移除海龟
                    box_space.remove(i.pos())

                    i.goto(gox+px, goy+py)              #移动箱子
                    self.goto(gox, goy)                 #人物移动

                    # 到新地方:移除人物
                    go_space.remove(i.pos())
                    # 更新箱子位置信息
                    box_space.append(i.pos())

                    # 判断箱子是否到达正确的位置
                    if i.pos() in correct_box_space:    # 正确箱子的位置
                        # 更新箱子的样式
                        i.shape('boxc.gif')
                    else:
                        # 不变
                        i.shape('box.gif')

                    # 判断推的箱子是否全部达到指定位置
                    if set(box_space) == set(correct_box_space):    #列表变成集合
                        text.show_win()                             #提示游戏赢了

                    

    # 定义移动:调用move()方法
    def go_up(self):            #上
        self.move(self.xcor(), self.ycor(), 0, 50)
    def go_down(self):          #下
        self.move(self.xcor(), self.ycor(), 0, -50)
    def go_left(self):          #左
        self.move(self.xcor(), self.ycor(), -50, 0)
    def go_right(self):         #右
        self.move(self.xcor(), self.ycor(), 50, 0)
# ------------------------------------------------------------------------画笔Pen

# ------------------------------------------------------------------------开始画游戏Game
#里面使用了Pen函数
class Game():
    def paint(self):    #定义一个画的方法
        #地图是几行几列的(随便那行列都可以取出来)
        i_date = len(levels[num-1])         #行
        j_date = len(levels[num-1][0])      #列

        # 行
        for i in range(i_date):
            # 列
            for j in range(j_date):
                # 根据左上角坐标遍历
                x = -j_date*25+25+j*50 + sister_x
                y = i_date*25-25-i*50
                # O代表:箱子应该去的正确位置
                if levels[num-1][i][j] == 'O':
                    correct_box.goto(x, y)
                    correct_box.stamp()         #设置正确箱子的位置不需要移动,盖个章
                    go_space.append((x, y))
                    correct_box_space.append((x, y))
        for i in range(i_date):
            for j in range(j_date):
                #开始画的位置
                # 关卡:屏幕正中心为原点   8行8列的关卡每个方块大小是50    左上角坐标中心位置(-175,175)
                x = -j_date*25+25+j*50 + sister_x       #-175+j*50      x增加
                y = i_date*25-25-i*50                   #175-i*50       y减少

                # 空白:代表空白
                if levels[num-1][i][j] == ' ':
                    go_space.append((x, y))
                # X代表:墙的位置
                if levels[num-1][i][j] == 'X':
                    wall.goto(x, y)
                    # 墙不需要移动,盖个章
                    wall.stamp()
                # P代表:玩家所在的位置
                if levels[num-1][i][j] == 'P':
                    player.goto(x, y)
                    go_space.append((x, y))
                # B代表:现在箱子的位置
                if levels[num-1][i][j] == 'B':
                    box = Pen('box.gif')            #画箱子
                    box.goto(x, y)
                    box_list.append(box)
                    box_space.append((x, y))
# ------------------------------------------------------------------------开始画游戏Game

# ------------------------------------------------------------------------游戏提示信息ShowMessage
#含有 message函数 show_win函数
class ShowMessage(turtle.Turtle):
    def __init__(self):
        super().__init__()
        self.penup()
        self.pencolor('blue')
        self.ht()       #隐藏海龟鼠标

    # 显示信息:第几关、重新开始、选择关卡
    def message(self):
        self.goto(0+sister_x, 290)
        self.write(f'第{num}关', align='center', font=('仿宋', 20, 'bold'))
        self.goto(0+sister_x, 270)
        self.write('重新开始本关请按回车键', align='center', font=('仿宋', 15, 'bold'))
        self.goto(0+sister_x, 250)
        self.write('选择关卡请按Q', align='center', font=('仿宋', 15, 'bold'))

    #提示游戏赢了
    def show_win(self):
        global num  #全局变量
        if num == len(levels):  #走到了最后一关
            num = 1
            self.goto(0, 0)
            self.write('你已全部过关', align='center', font=('黑体', 30, 'bold'))
            self.goto(0, -50)
            self.write('返回第一关轻按空格键', align='center', font=('黑体', 30, 'bold'))
        else:                   #继续自动进入下一关
            num = num+1
            self.goto(0, 0)
            self.write('恭喜过关', align='center', font=('黑体', 30, 'bold'))
            self.goto(0, -50)
            self.write('进入下一关请按空格键', align='center', font=('黑体', 30, 'bold'))
# ------------------------------------------------------------------------游戏提示信息ShowMessage

# ------------------------------------------------------------------------初始化init
#里面使用了message()
def init():
    # 清除文字的显示
    text.clear()
    # 清除墙
    wall.clear()
    # 清除正确位置的箱子
    correct_box.clear()
    # 清除箱子
    for i in box_list:
        i.ht()      #隐藏海龟
        del(i)      #删除海龟
    box_list.clear()
    # 清除箱子所在位置的坐标列表
    box_space.clear()
    # 清除人的列表
    go_space.clear()
    # 清除正确的箱子列表
    correct_box_space.clear()

    # 重新画
    game.paint()
    # 显示信息
    text.message()

    #每次切换不同的图片
    ms.bgpic(f'bc{num}.gif')
# ------------------------------------------------------------------------初始化init

# ------------------------------------------------------------------------键盘输入选择关卡choose
#里面使用了init函数
def choose():
    global num
    a = ms.numinput('选择关卡', '你的选择(请输入1-5)', 1)
    if a is None:
        a = num
    num = int(a)    #确定输入的关卡
    init()          #初始化
    ms.listen()     #屏幕监听
# ------------------------------------------------------------------------键盘输入选择关卡choose


# -----------------------------主程序-------------------------------------------#
sister_x = 225              #游戏地图显示的位置右移距离,给左边照片让出位置
num = 1                     #默认从第1关开始
correct_box_space = []      #正确的箱子列表(正确箱子位置标识图片)
box_list = []               #设置有箱子海龟的列表
box_space = []              #箱子移动所在位置的坐标列表
go_space = []               #人的列表

# 继承创建对象:使用Pen()函数
wall = Pen('wall.gif')          # 画墙
correct_box = Pen('o.gif')      # 画箱子应该去的正确位置:O代表
player = Pen('p.gif')           # 画:玩家所在的位置P代表

#开始画游戏:使用Game()函数
game = Game()
game.paint()

#提示信息
text = ShowMessage()        # 创建对象
text.message()              # 调用message() 方法

#屏幕的监听  screen.onkey(函数,‘需要监听的键’)
ms.listen()
ms.onkey(player.go_up, 'Up')                #上
ms.onkey(player.go_down, 'Down')            #下
ms.onkey(player.go_left, 'Left')            #左
ms.onkey(player.go_right, 'Right')          #右
ms.onkey(init, 'Return')                    #回车 开始当前
ms.onkey(init, 'space')                     #空格 开始下一关
ms.onkey(choose, 'Q')                       #Q键退出

#每次追踪刷新之后,对屏幕进行更新
while True:
    ms.update()

# 主循环,持续加载
ms.mainloop()
# -----------------------------主程序-------------------------------------------#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/487476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师笔记

计算机 运算器组成:算术逻辑单元(ALU)、累加寄存器(AC)、数据缓冲寄存器(DR)、状态条件寄存器()等组成。 控制器组成:指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、指令译码器(ID)。 最小数据单位:bit 最小存储单位: byte n进制 转 1…

【工作中问题解决实践 十二】线上如何排查CPU100%的情况

当我们把服务发布到服务器器,可能会因为一些问题造成我们的服务器CPU被打满甚至超过100%,那如果我们想知道到底上在做什么操作导致CPU持续过高呢?因为在线上只能通过日志看问题,或者排查到哪个进程或者哪个线程持续占用CPU。然后才…

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325

摘 要 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

c++翁恺

1、面向对象 Data:杯子的属性 Opera:杯子提供的服务 老师上课: C:按流程执行 C:定一个教室,有很多学生,投影仪,灯,每个学生反映不一样。 这个场景有什么东西&#xff0c…

SSM整合遇到的问题,非常干货,希望能帮助到您~

你们好,我是金金金。 无法自动装配 配置类已经配置了扫描 那是什么原因导致? 解决 很明显位置都不在一起,需要更改。 结果类型不匹配select id“selectEmployeeByCondition” 什么原因导致? 这个是因为我建立了很多子模块 名字…

基于tcp协议的网络通信(将服务端守护进程化)

目录 守护进程化 引入 介绍 如何实现 思路 接口 -- setsid 注意点 实现代码 daemon.hpp log.hpp 运行情况 前情提要 -- 前后台任务介绍(区别命令),sessionsid介绍,session退出后的情况(nuhup,终端进程控制组),任务进程组概念,任务与进程组的关系,-bash介绍-CSDN博客…

最详细的ubuntu 安装 docker教程

Docker是一种流行的容器化平台,它能够简化应用程序的部署和管理。本文将介绍在Ubuntu操作系统上安装Docker的步骤,以便我们可以开始使用Docker来构建和运行容器化应用程序。 系统版本 本文以Ubuntu20.05系统为例安装docker,Ubuntu官方下载地…

输出当前时间

用途:在项目中一些属性中设置当前时间 实例代码 import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class time {public static void main(String[] args){LocalDateTime china LocalDateTime.now(); DateTimeFormatter forma…

函数作用域和块级作用域:JavaScript中的变量作用域解析

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

知识图谱操作的探索与利用

目录 前言1 搜索(Search)1.1 基于关键词搜索1.2 属性搜索1.3 模式匹配 2 过滤(Filtering)2.1 属性过滤2.2 关系过滤 3 引导(Guidance)3.1 相关实体推荐3.2 路径推荐 4 合并(Merging)…

OpenLayers基础教程——WebGLPoints图层样式的设置方法

1、前言 前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法,这篇博客就来介绍一下WebGLPoints图层的样式设置问题。 2、样式运算符 在VectorLayer图层中,我们只需要创建一个ol.style.Style对象即可,WebGLPoints则不…

【c++】类和对象(三)构造函数和析构函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章我们带来类和对象重要的部分,构造函数和析构函数 目录 1.类的6个默认成员函数2.构造函数2.1构造函数其他特性 3.构析函数3.1特性:…

03课程发布模块课程预览

课程预览界面 界面原型 课程在发布前需要运营方进行审核,作为课程制作方即教学机构发布课程前可以通过课程预览功能查看课程详情界面,及时修改页面中的内容排版和违规问题 课程预览就是把课程的相关信息进行整合然后在课程预览界面进行展示&#xff0…

为jupyter安装和使用不同的python版本

安装好jupyter后,发现为默认的python3,想要切换到python3.10, 1.创建新环境python310 conda create -n python310 python3.10 2.进入新环境python310 conda activate python310 3.下载jupyter notebook conda install jupyter notebook…

802.1X网络访问控制协议

802.1X是一种由IEEE(电气和电子工程师协会)制定的网络访问控制协议,主要用于以太网和无线局域网(WLAN)中基于端口的网络接入控制。802.1X协议通过认证和授权机制,确保只有合法的用户和设备才能够接入网络&a…

Facebook如何使用增强技术提升广告效果?

AR in AD - case study 脸书2021年宣布了引入AR的新方法,以推动其应用套件中的产品发现和购买。但他们首先考虑是技术。据脸书称,技术一直是增强现实在其应用程序中更广泛使用的主要障碍。这就是为什么它现在正在做出改变,使企业主和广告商更…

OpenHarmony 源码解析之SystemUi—Statusbar(TS)

作者:董伟 简介 SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相关信息展示及交互界面,包括系统状态、系统提示、系统提醒等,例如系统时间、电量信息。 本文主要分析batterycomponent、clockcomponent、wificompo…

2024年3月26日 十二生肖 今日运势

小运播报:2024年3月26日,星期二,农历二月十七 (甲辰年丁卯月己丑日),法定工作日。 红榜生肖:鸡、鼠、猴 需要注意:马、狗、羊 喜神方位:东北方 财神方位:…

[HGAME 2023 week2]Designer

[HGAME 2023 week2]Designer 考点:XSS跨站脚本攻击,模板注入 代码审计 function auth(req, res, next) {const token req.headers["authorization"]if (!token) {return res.redirect("/")}try {const decoded jwt.verify(token,…

登录注册界面

T1、编程设计理工超市功能菜单并完成注册和登录功能的实现。 显示完菜单后&#xff0c;提示用户输入菜单项序号。当用户输入<注册>和<登录>菜单序号时模拟完成注册和登录功能&#xff0c;最后提示注册/登录成功并显示注册信息/欢迎XXX登录。当用户输入其他菜…