文章目录:
一:运行效果
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() # -----------------------------主程序-------------------------------------------#