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_xy = 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 = 1self.goto(0, 0)self.write('你已全部过关', align='center', font=('黑体', 30, 'bold'))self.goto(0, -50)self.write('返回第一关轻按空格键', align='center', font=('黑体', 30, 'bold'))else:                   #继续自动进入下一关num = num+1self.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 numa = ms.numinput('选择关卡', '你的选择(请输入1-5)', 1)if a is None:a = numnum = 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.mzph.cn/news/769981.shtml

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

相关文章

python5:基于多进程的并发编程、基于协程的并发编程的学习笔记

进程 为什么要使用多进程?——GIL的存在,多线程实际不是并发执行 将任务分为两类:IO密集型(多线程)CPU密集型(多进程) 多进程的基本用法 concurrent.futures.process.ProcessPoolExecutor#进…

程序员35岁会失业吗?‍

程序员35岁会失业吗?👨‍💻🕒 程序员35岁会失业吗?👨‍💻🕒摘要引言技术更新与个人适应性持续学习的重要性实用学习方法 职业发展路径多样性职业转型的机会实践案例分享 企业文化与就…

【SpringBoot】如何定义接口

定义get接口 使用GetMapping定义一个基本get接口 RestController //表示定义一个json格式返回给前端 public class test {private Map<String,Object> map new HashMap<>();GetMapping(value "/test") //定义接口路径public Object userInfo(Strin…

代码随想录训练营Day32:● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 题目链接 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/ 题目描述 思路 看完视频讲解之后豁然开朗啊简直了&#xff01;&#xff01;&#xff01; 统计后一天减去前一天&#xff0c;差值为正数的&#xff0c;再…

图论基础|417. 太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

目录 417. 太平洋大西洋水流问题 827.最大人工岛 127. 单词接龙 417. 太平洋大西洋水流问题 题目链接(opens new window) 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界…

css的active事件在手机端不生效的解决方法

需求&#xff1a;需求就是实现点击图中的 “抽奖” 按钮&#xff0c;实现一个按钮Q弹的放大缩小动画 上面是实现的效果&#xff0c;pc端&#xff0c;点击触发 :active 问题&#xff1a;但是这种方式在模拟器上可以&#xff0c;真机H5一调试就没生效了&#xff0c;下面是简单…

数据结构·二叉树(1)

目录 1 树的概念及结构 1.1 树的结构 1.2 树的概念 1.3树的表示 2 二叉树的概念及结构 2.1二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的存储结构 1 树的概念及结构 1.1 树的结构 前面所学到的顺序表链表等&#xff0c;都是线性的数据结构&#xff0c;今天介绍的树&am…

电脑卸载软件怎么清理干净?电脑清理的5种方法

随着我们在电脑上安装和卸载各种软件&#xff0c;很多时候我们会发现&#xff0c;即使软件被卸载&#xff0c;其残留的文件和注册表项仍然存在于电脑中&#xff0c;这不仅占用了宝贵的磁盘空间&#xff0c;还可能影响电脑的性能。那么&#xff0c;如何确保在卸载软件时能够彻底…

mysql - 缓存

缓存 InnoDB存储引擎在处理客户端的请求时&#xff0c;当需要访问某个页的数据时&#xff0c;就会把完整的页的数据全部加载到内存中&#xff0c;也就是说即使我们只需要访问一个页的一条记录&#xff0c;那也需要先把整个页的数据加载到内存中。将整个页加载到内存中后就可以…

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…

【C++】虚拟继承 组合

目录 一、虚拟继承 &#x1f31f;【非虚拟内存分布】 &#x1f31f;【虚拟继承内存分布】 &#x1f31f;【虚拟继承读取】 &#x1f31f;【练习检验】 &#x1f31f;【继承的总结和反思】 二、组合 &#x1f31f;【继承和组合】 &#x1f31f;【前言回顾】 上一篇文章我们…

MATLAB和ROS联合仿真参考资料

参考文章&#xff1a; MATLAB和ROS联合仿真篇&#xff08;从MATLAB获取ROS信息&#xff09;链接

每日一题|djwcb【算法赛】|字符串快速幂

每日一题|djwcb【算法赛】 djwcb 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 djwcb 注意&#xff1a; 快速幂字符串&#xff0c;看…

手写springboot启动器, 学习SpringBoot的最佳实践

自己手写的SpringBoot启动器, 是一个学习了解SpringBoot启动逻辑和了解springboot原理的不错的实践Demo. 废话不多说,直接上代码: 项目结构 maven多项目结构, myspringboot 自己手写的SpringBoot启动器 service-demo 用来测试SpringBoot启动器的示例项目 项目pom依赖 1.…

python、execl数据分析(数据描述)

一 python 1.各函数 1.1python库的安装与导入 #pip install os#pip install matplotlib#pip install seaborn#pip install scikit-learn#pip install scipy#修 改 工 作 目 录import osos.getcwd () # 查看当前工作环境os.chdir( F :\my course\database ) # 修改工作环境o…

fifo ip核 ————读写时钟同步

1.原理 timescale 1ns/1ns module tb_fifo();reg sys_clk ; reg sys_rst_n ; reg [7:0] pi_data ; reg rd_req ; reg wr_req ; reg [2:0] cnt;wire empty ; wire full ; wire [7:0] po_data ; wire [7:0] usedw ;initial begins…

力扣HOT100 - 283. 移动零

解题思路&#xff1a; 双指针 指针 i 用于寻找不为零的位置 指针 j 用于寻找为零的位置 不为零时&#xff0c;自己与自己交换&#xff0c;i 和 j 同时向下一个位置移动 为零时&#xff0c;nums[ i ]与nums[ j ]交换&#xff0c;使零向后移动 class Solution {public void…

总结虚函数表机制——c++多态底层原理

前言&#xff1a; 前几天学了多态。 然后过去几天一直在测试多态的底层与机制。今天将多态的机制以及它的本质分享给受多态性质困扰的友友们。 本节内容只涉及多态的原理&#xff0c; 也就是那张虚表的规则&#xff0c;有点偏向底层。 本节不谈语法&#xff01;不谈语法&#x…

发布文章积分自动增加

controller ApiOperation(value "添加文章")PostMapping("/addwengzhang")public String addwengzhang(RequestBody WengDto wengDto) {if (wengDto.getContent() null || wengDto.getTitle() null) {return "参数不可为空";}User user user…