admin管理员组

文章数量:1794759

《Python游戏趣味编程》 第8章 勇闯地下一百层

《Python游戏趣味编程》 第8章 勇闯地下一百层

8 勇闯地下一百层

图书简介可以看这里:

童晶:《Python游戏趣味编程》新书上架了

本章我们将编写一个勇闯地下一百层的游戏,键盘控制游戏角色左右移动,跳到下方随机生成的砖块上,尝试坚持一百层,效果如图8-1所示。首先实现键盘控制游戏角色移动;然后实现角色与砖块相对位置的判断、多个砖块的显示、上移与更新;最后实现失败判断、得分的计算与显示、行走动画效果。

本章案例最终代码一共74行,代码参看:配套资源\\第8章\\8-7.py,视频效果参看:配套资源\\第8章\\勇闯地下一百层.mp4。

import pgzrun # 导入游戏库 import random # 导入随机库 WIDTH = 600 # 设置窗口的宽度 HEIGHT = 800 # 设置窗口的高度 playerSpeed = 5 # 玩家水平移动速度 brickSpeed = 2 # 砖块自动上移速度 isLoose = False # 游戏是否失败 score = 0 # 游戏得分 alien = Actor('alien') # 导入玩家图片 alien.x = WIDTH/2 # 设置玩家的x坐标 alien.y = HEIGHT/5 # 设置玩家的y坐标 lastAlienY = alien.y # 记录角色上一帧的y坐标 bricks = [] # 存储所有砖块的列表,开始为空 for i in range(5): brick = Actor('brick') # 导入砖块图片 brick.pos = 100*(i+1), 150*(i+1) # 设置砖块的(x,y)坐标 bricks.append(brick) # 把当前砖块加入列表中 def draw(): # 绘制模块,每帧重复执行 screen.clear() # 清空游戏画面 alien.draw() # 绘制玩家 for brick in bricks: # 绘制列表中每个砖块 brick.draw() # 绘制砖块 screen.draw.text("你已坚持了 "+str(score)+"层!", (400, 20), fontsize=25, fontname='s', color='white') if isLoose: # 如果游戏失败,输出相关信 screen.draw.text("游戏失败!", (80, HEIGHT/2-100), fontsize=100, fontname='s', color='red') def update(): # 更新模块,每帧重复操作 global isLoose, playerSpeed, brickSpeed, score, lastAlienY isPlayerOnGround = False # 开始假设角色没有站在砖块上 for brick in bricks: # 对列表中所有砖块遍历 # 玩家正好站在砖块上面,在方块左右之间,可以左右移动 if abs(alien.bottom-brick.top) < 5 \\ and brick.left - alien.left < alien.width*2/3 \\ and alien.right - brick.right < alien.width*2/3: alien.image = 'alien' # 设为在砖块上站立的图片 isPlayerOnGround = True # 玩家在一块砖上 alien.bottom = brick.top # 玩家跟着砖块一直向上移动 if lastAlienY < alien.y: score += 1 # 之前还不在砖上,表示现在刚开始落到砖上,分数+1 if keyboard.left: # 如果按下键盘左键 alien.x = alien.x - playerSpeed # 玩家左移 if keyboard.right: # 如果按下键盘右键 alien.x = alien.x + playerSpeed # 玩家右移 lastAlienY = alien.y # 对所有砖块遍历后,更新lastAlienY的值 if not isPlayerOnGround: alien.image = 'alien_falling' # 设为在空中的玩家图片 alien.y += 5 # 玩家不在任何一块砖上,就下落 for birck in bricks: # 所有砖块缓慢上移 birck.y -= brickSpeed if bricks[0].top < 10: # 最上面的一个砖块达到画面顶部时 del bricks[0] # 删除最上面的砖块 brick = Actor('brick') # 新增一个砖块 brick.x = random.randint(100, 500) # 水平位置随机 brick.y = HEIGHT # 从最下部出现 bricks.append(brick) # 将新砖块添加到列表中 if alien.top < 0 or alien.bottom > HEIGHT: # 角色超出上下范围,游戏失败 playerSpeed = 0 # 玩家水平移动速度设为0 brickSpeed = 0 # 砖块自动上移速度设为0 isLoose = True # 游戏失败 pgzrun.go() # 开始执行游戏

行走动画的实现:

import pgzrun # 导入游戏库 WIDTH = 1200 # 设置窗口的宽度 HEIGHT = 600 # 设置窗口的高度 # 导入所有的分解动作图片,存在列表当中 Anims = [Actor('1'), Actor('2'), Actor('3'), Actor('4'), Actor('5')] numAnims = len(Anims) # 分解动作图片的张数 animIndex = 0 # 表示需要显示的动作图片的序号 animSpeed = 0 # 用于控制行走动画速度 player_x = WIDTH/2 # 设置玩家的x坐标 player_y = HEIGHT/2 # 设置玩家的y坐标 for i in range(numAnims): Anims[i].x = player_x # 设置所有分解动作图片的x坐标 Anims[i].y = player_y # 设置所有分解动作图片的y坐标 def draw(): # 绘制模块,每帧重复执 screen.fill('gray') # 灰色背景 Anims[animIndex].draw() # 绘制玩家当前分解动作图片 def update(): # 更新模块,每帧重复操作 global animIndex, player_x, animSpeed if keyboard.right: # 如果按下键盘右键 player_x += 5 # 角色向右移动 for i in range(numAnims): # 所有分解动作图片更新x坐标 Anims[i].x = player_x if (player_x >= WIDTH): # 角色走到最右边 player_x = 0 # 再从最左边出现 animSpeed += 1 # 用于控制动作动画速度 if animSpeed % 5 == 0: # 动作动画速度是移动速度的1/5 animIndex += 1 # 每一帧分解动作图片序号加1 if animIndex >= numAnims: # 放完最后一个分解动作图片了 animIndex = 0 # 再变成第一张分解动作图片 pgzrun.go() # 开始执行游戏

 

分步骤代码、图片素材、讲解视频可以从异步社区下载:

www.epubit/bookDetails?id=UB72096d97d6149

分步骤代码也可以直接从这里下载:

联想Filez

 

这一章主要实现了勇闯地下一百层游戏,讲解了键盘控制角色移动、图片的相对位置判断、列表图片的循环删除与生成、行走动画等功能,学习了绝对值函数、列表元素的删除等知识点。读者可以尝试在本章代码基础上继续改进:

1. 为游戏添加得分、空中下落、游戏失败时的各种音效;

2. 实现得分越来越高,游戏速度越来越快的效果;

3. 增加一些特效,比如玩家站在不同砖块上会自动向左或向右滑动;

4. 增加一些敌人,玩家在下落的同时躲避敌人。

读者也可以参考本章的开发思路,尝试设计并分步骤实现超级玛丽、魂斗罗等小游戏。

 

本文标签: 下一趣味游戏Python