python+pygame实现推箱子小游戏之六

 前文内容请移步:

python+pygame实现推箱子小游戏之一

python+pygame实现推箱子小游戏之二

python+pygame实现推箱子小游戏之三

python+pygame实现推箱子小游戏之四

python+pygame实现推箱子小游戏之五

在本小节实现runGame的代码

在runGame中主要是响应键盘的操作。还是在代码中来一一讲解

'''
关卡的游戏主循环
'''
def runGame(screen, gamelevel):
	clock = pygame.time.Clock()
	gamedisplay = gameDisplay(screen)
	gamedisplay.loadLevelMap(gamelevel)

	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				quitGame()
			elif event.type == pygame.KEYDOWN:
				if event.key == pygame.K_LEFT:
					next_pos = gamedisplay.worker.getNextPos('left')
					if gamedisplay.gamemap.isCanPushPos(*next_pos):
						gamedisplay.worker.move('left')
					else:
						box = gamedisplay.gamemap.getTheBoxByPos(*next_pos)
						if box:
							next_pos = box.getNextPos('left')
							if gamedisplay.gamemap.isCanPushPos(*next_pos):
								gamedisplay.worker.move('left')
								box.move('left')
					break
				if event.key == pygame.K_RIGHT:
					next_pos = gamedisplay.worker.getNextPos('right')
					if gamedisplay.gamemap.isCanPushPos(*next_pos):
						gamedisplay.worker.move('right')
					else:
						box = gamedisplay.gamemap.getTheBoxByPos(*next_pos)
						if box:
							next_pos = box.getNextPos('right')
							if gamedisplay.gamemap.isCanPushPos(*next_pos):
								gamedisplay.worker.move('right')
								box.move('right')
					break
				if event.key == pygame.K_DOWN:
					next_pos = gamedisplay.worker.getNextPos('down')
					if gamedisplay.gamemap.isCanPushPos(*next_pos):
						gamedisplay.worker.move('down')
					else:
						box = gamedisplay.gamemap.getTheBoxByPos(*next_pos)
						if box:
							next_pos = box.getNextPos('down')
							if gamedisplay.gamemap.isCanPushPos(*next_pos):
								gamedisplay.worker.move('down')
								box.move('down')
					break
				if event.key == pygame.K_UP:
					next_pos = gamedisplay.worker.getNextPos('up')
					if gamedisplay.gamemap.isCanPushPos(*next_pos):
						gamedisplay.worker.move('up')
					else:
						box = gamedisplay.gamemap.getTheBoxByPos(*next_pos)
						if box:
							next_pos = box.getNextPos('up')
							if gamedisplay.gamemap.isCanPushPos(*next_pos):
								gamedisplay.worker.move('up')
								box.move('up')
					break
				if event.key == pygame.K_r:
					gamedisplay.initCurGame()
					gamedisplay.loadLevelMap(gamelevel)
		gamedisplay.draw(gamedisplay.worker, gamedisplay.gamemap)
		if gamedisplay.gamemap.curLevelCompleted():
			return
		pygame.display.flip()
		clock.tick(100)

注解:

1、套娃的过程中,最外面的是gameDisplay,所以先实例化一个gameDisplay,叫做gamedisplay

2、利用传入的参数gamelevel加载该关卡地图loadLevelMap

3、开始消息循环,用到的主要是键盘事件,就是上下左右,r键,响应一次,就调用gamedisplay的draw函数重绘一次游戏页面

4、用gamemap的curLevelCompleted函数判断该关卡是否过关,过关就return,到main里面的switchGame,由用户选择“下一关”还是“退出”。

5、flip显示出来

以向左来为例简要讲解一下移动处理过程:

3.1 首先getNextPos函数获取下一个位置next_pos,

3.2如果这个位置工人worker可以到达,则移动这个工人worker

3.3如果工人worker不能移动,就有两种可能:

  3.3.1该方向上下一个位置的箱子可以在该方向上移动:此时,先getTheBoxByPos找到next_pos上的箱子对象,再获取该箱子在该方向上的下一个位置,如果箱子可以到达,则移动该箱子及工人

  3.3.2 如果不满足条件,则不能move

至此,讲解完成。

当然,大家会看到,runGame消息循环中有大量代码重复。故可以改成:

'''
关卡的游戏主循环
'''
def myMove(_gamedisplay,_direction):
	next_pos = _gamedisplay.worker.getNextPos(_direction)
	if _gamedisplay.gamemap.isCanPushPos(*next_pos):
		_gamedisplay.worker.move(_direction)
	else:
		box = _gamedisplay.gamemap.getTheBoxByPos(*next_pos)
		if box:
			next_pos = box.getNextPos(_direction)
			if _gamedisplay.gamemap.isCanPushPos(*next_pos):
				_gamedisplay.worker.move(_direction)
				box.move(_direction)

def runGame(screen, gamelevel):
	clock = pygame.time.Clock()
	gamedisplay = gameDisplay(screen)
	gamedisplay.loadLevelMap(gamelevel)

	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT:
				quitGame()
			elif event.type == pygame.KEYDOWN:
				if event.key == pygame.K_LEFT:
					myMove(gamedisplay,'left')
					break
				if event.key == pygame.K_RIGHT:
					myMove(gamedisplay,'right')
					break
				if event.key == pygame.K_DOWN:
					myMove(gamedisplay,'down')
					break
				if event.key == pygame.K_UP:
					myMove(gamedisplay,'up')
					break
				if event.key == pygame.K_r:
					gamedisplay.initCurGame()
					gamedisplay.loadLevelMap(gamelevel)
		gamedisplay.draw(gamedisplay.worker, gamedisplay.gamemap)
		if gamedisplay.gamemap.curLevelCompleted():
			return
		pygame.display.flip()
		clock.tick(100)

关卡文件就是使用普通的文本编辑器就可以了,注意其对应的关系。

详见python+pygame实现推箱子小游戏之四

w:推箱子的工人

*:墙

#:箱子

o:目的地

大家一关关过后,到最后一关都过去了,会发现先弹出switchGame的界面,点击后才显示“恭喜通关!”,体验不是很好,聪明的你自行解决一下这个问题~~~

“源码面前,了无秘密”    ---   侯捷《STL源码剖析》

推箱子源码及资源

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个用Python实现推箱子小游戏的示例代码(仅供参考): ``` # 导入必要的模块 import tkinter as tk # 定义游戏界面的类 class Game(tk.Frame): # 初始化游戏界面 def __init__(self, master): super().__init__(master) self.master = master self.pack() # 定义游戏地图和游戏元素 self.map = [ "#### ", "#@### ", "# $ ", "# $ ", "# . ", "######" ] self.player_x, self.player_y = 1, 1 self.box_x, self.box_y = 2, 2 self.target_x, self.target_y = 4, 5 # 创建游戏界面的组件 self.create_widgets() # 创建游戏界面的组件 def create_widgets(self): # 创建游戏地图的画布 self.canvas = tk.Canvas(self, width=300, height=300) self.canvas.pack() # 加载游戏元素的图片 self.wall_img = tk.PhotoImage(file="wall.gif") self.box_img = tk.PhotoImage(file="box.gif") self.target_img = tk.PhotoImage(file="target.gif") self.player_img = tk.PhotoImage(file="player.gif") # 在画布上绘制游戏地图和游戏元素 for y in range(len(self.map)): for x in range(len(self.map[y])): if self.map[y][x] == "#": self.canvas.create_image(x*50+25, y*50+25, image=self.wall_img) elif self.map[y][x] == "$": self.canvas.create_image(x*50+25, y*50+25, image=self.box_img) elif self.map[y][x] == ".": self.canvas.create_image(x*50+25, y*50+25, image=self.target_img) elif self.map[y][x] == "@": self.canvas.create_image(x*50+25, y*50+25, image=self.player_img) # 绑定键盘事件 self.master.bind("<Up>", self.move_up) self.master.bind("<Down>", self.move_down) self.master.bind("<Left>", self.move_left) self.master.bind("<Right>", self.move_right) # 判断游戏是否胜利 def check_win(self): return self.box_x == self.target_x and self.box_y == self.target_y # 移动玩家和箱子 def move(self, dx, dy): new_player_x, new_player_y = self.player_x + dx, self.player_y + dy new_box_x, new_box_y = self.box_x, self.box_y if new_player_x == self.box_x and new_player_y == self.box_y: new_box_x, new_box_y = self.box_x + dx, self.box_y + dy if self.map[new_player_y][new_player_x] != "#": self.player_x, self.player_y = new_player_x, new_player_y self.box_x, self.box_y = new_box_x, new_box_y self.update_game() # 上移 def move_up(self, event): self.move(0, -1) # 下移 def move_down(self, event): self.move(0, 1) # 左移 def move_left(self, event): self.move(-1, 0) # 右移 def move_right(self, event): self.move(1, 0) # 更新游戏界面 def update_game(self): self.canvas.delete("all") for y in range(len(self.map)): for x in range(len(self.map[y])): if self.map[y][x] == "#": self.canvas.create_image(x*50+25, y*50+25, image=self.wall_img) elif self.map[y][x] == "$": self.canvas.create_image(x*50+25, y*50+25, image=self.box_img) elif self.map[y][x] == ".": self.canvas.create_image(x*50+25, y*50+25, image=self.target_img) elif self.map[y][x] == "@": self.canvas.create_image(x*50+25, y*50+25, image=self.player_img) if self.check_win(): self.canvas.create_text(150, 150, text="You Win!", font=("Arial", 20)) # 创建主窗口并运行游戏 if __name__ == "__main__": root = tk.Tk() root.title("Push Box Game") game = Game(root) game.mainloop() ``` 需要注意的是,由于没有使用pygame库,所以在实现游戏界面和游戏元素时,使用了Tkinter库的Canvas组件来绘制游戏界面。同时,由于没有使用外部资源加载函数,所以在代码中需要手动加载游戏元素的图片,并使用Canvas组件的create_image方法来绘制游戏元素。另外,由于没有使用pygame库的事件循环机制,所以在实现玩家移动和箱子移动时,使用了Tkinter库的键盘事件绑定功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值