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

news2024/12/25 2:38:59

文章目录:

一:运行效果

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()
# -----------------------------主程序-------------------------------------------#

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

34-Java传输对象模式 ( Transfer Object Pattern )

Java传输对象模式 实现范例 传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据传输对象也被称为数值对象,没有任何行为传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列…

二分图

数据结构、算法总述:数据结构/算法 C/C-CSDN博客 二分图:节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。 染色法 目的:验证给定的二分图是否可…

【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

mybatis plus intercept修改sql

原始需求 在SQL语句前面加上一个request-id 问题描述 今天收到业务同学反馈,说接入某个SDK后,request-id本地debug发现sql已经修改了,但打印的sql中却没有request-id信息 看了下代码,发现用户的代码其实就是下方 方案一代码&am…

【C++进阶】竞赛常用库函数

一、排序 sort简介 sort函数包含在头文件<algorithm>中。在使用前需要#include <algorithm>或使用万能头文件。sort是C标准库中的一个函数模板&#xff0c;用于对指定范围内的元素进行排序。sort算法使用的是快速排序(QuickSort)或者类似快速排序的改进算法&…

OCP NVME SSD规范解读-14.Firmware固件升级要求

4.11节 Firmware Update Requirements 描述了数据中心NVMe SSD固件更新的具体要求&#xff0c;确保固件升级过程既安全又可靠&#xff0c;同时充分考虑了设备在升级过程中的可用性和功能性。 FWUP-1: 设备必须记录每一次固件激活过程。这意味着固件升级过程中&#xff0c;设备会…

一文搞懂 YOLOv9 训练推理全流程 | YOLOv9你绝对不知道的细节!

文章地址&#xff1a;https://arxiv.org/pdf/2402.13616.pdf 代码地址&#xff1a;https://github.com/WongKinYiu/yolov9 前言 在这篇博客中&#xff0c;我们来聊聊 YOLOv9。首先&#xff0c;值得注意的一点是&#xff0c;YOLOv9的变化相对较小&#xff0c;它仍然基于YOLOv5的…

在线影院项目话术(0.7w精选)

项目介绍 这个电影院项目不同于常见的基于会员限制用户观看范围的在线影院项目&#xff0c;主要就是按需购买片源来进行观看&#xff0c;用户就不会因高额的会员费而劝退。 项目的主要实现就是&#xff1a;微服务的五大主键&#xff0c;数据库使用mysql,redis&#xff0c;中间…

2024年湖北荆门市工程系列职称评审开始啦

(一)中级测试对象&#xff1a;拟参加近两年度相关系列(专业)中级技术职务评审&#xff0c;且未取得中级水平能力测试合格证书的专业技术人员。 (二)初级测试对象&#xff1a;拟参加近两年度档案专业、工程系列助理级职称评审&#xff0c;且未取得初级水平能力测试合格证书的专业…

白酒:陈酿过程中的老熟度评价与品质提升方法

在豪迈白酒的酿造过程中&#xff0c;陈酿是一个至关重要的环节。陈酿不仅能使白酒老熟&#xff0c;提品质&#xff0c;还能发展出与众不同的风味和口感。云仓酒庄深知陈酿的重要性&#xff0c;并进行了深入的研究和实践。本文将探讨陈酿过程中的老熟度评价与品质提升方法。 首先…

蓝桥杯day7刷题日记

P8697 [蓝桥杯 2019 国 C] 最长子序列 思路&#xff1a;直接遍历&#xff0c;和子序列相同就记录&#xff0c;不然就下一位 #include <iostream> #include <string> using namespace std; int res;int main() {string s,t;cin>>s>>t;int i0,j0;while…

IDEA 远程调试

1.什么是远程调试 Java提供了一个远程调试功能&#xff0c;支持设置断点及线程级的调试同时&#xff0c;不同的JVM通过接口的协议联系&#xff0c;本地的Java文件在远程JVM建立联系和通信。 2.服务端开启远程调试 开启远程调试功能&#xff0c;需要修改tomcat 的catalina.sh…

目录框架【欢迎订阅收藏】

前端篇 第一章vue.js 1.Vue.js入门及环境搭建 2.vue.js基础知识 3.Vue.js自定义组件 Vue.js路由 5.Vue.js状态管理 6.网络通信axios 第二章Tailwindcss 1.tailwindcss介绍及引入 2.基础样式 3.组件样式 4.工具样式 第三章Nuxt 1.nuxt介绍及环境搭建 2.nuxt 目录结构 3.nuxt …

ElasticSearch文档批量操作[ES系列] - 第503篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

超声波清洗机怎么选?过来人推荐四大表现突出的宝藏眼镜清洗机!

如果你清洁眼镜的时候总是习惯用纸巾或者是衣服擦的话&#xff0c;我劝你要赶紧把这个坏习惯给改掉&#xff01;很多不知道原因的朋友会问&#xff0c;为什么不能用纸巾擦眼镜&#xff1f;其实是因为纸巾还有衣服布料上&#xff0c;存在一些比较粗糙的微粒&#xff0c;人体手部…

车载测试 HIL测试详解

HIL测试&#xff1a;即硬件在环测试&#xff0c;是一种广泛应用于汽车电子控制系统领域的测试方法。它将实际的硬件&#xff08;如ECU、传感器、执行器等&#xff09;与模拟器件&#xff08;如模型、仿真器等&#xff09;通过接口连接起来&#xff0c;模拟实际的操作环境&#…

动态规划-----最长公共子序列(及其衍生问题)

目录 一.最长公共子序列的基本概念&#xff1a; 解决动态规划问题的一般思路&#xff08;三大步骤&#xff09;&#xff1a; 二.最长公共子序列题目&#xff1a; 三.字符串的删除操作&#xff1a; 四.最小 ASCII 删除和&#xff1a; 一.最长公共子序列的基本概念&#xff…

微前端——qiankun

一、微前端 微前端是指存在于浏览器中的微服务&#xff0c;其借鉴了后端微服务的架构理念&#xff0c;将微服务的概念扩展到前端。即将一个大型的前端应用拆分为成多个模块&#xff0c;每个微前端模块可以有不同的团队开发并进行管理&#xff0c;且可以自主选择框架&#xff0…

seata测试demo(订单)

seata工作流程: seata对分布式事务的协调和控制就是31 1>XID&#xff1a;XID是全局事务的唯一标识&#xff0c;它可以在服务的调用链路中传递&#xff0c;绑定到服务的事务上下文中。 3>TC->TM->RM TC:事务协调器>就是seata 负责维护全局事务和分支事务的状…

选项式API和组合式API的区别

选项式(options) API 和组合式(composition) API两种不同的风格书写&#xff0c;Vue3 的组件可以使用这两种api来编写。 选项式API和组合式API的区别 选项式API 选项式 API&#xff0c;具有相同功能的放在一起&#xff0c;可以用包含多个选项的对象来描述组件的逻辑&…