Python浆果收集小游戏:实现随机emoji替换与碰撞检测的最简方法
浆果生成与碰撞检测的最简实现
首先解决现有代码的核心逻辑问题:之前每次调用地图渲染函数assignstring()时,都会当场随机生成浆果坐标,这会导致每次玩家移动刷新地图,浆果位置就随机跳变,根本无法稳定存储坐标做碰撞判定。
整个实现不需要改动原本的游戏框架,只需要4步调整:
- 把浆果坐标改成全局变量存储,仅在游戏启动、玩家完成收集时更新,不会随地图刷新乱跑
- 修正伪代码里的赋值笔误:不要两次给同一个变量
berrycord1赋值,分别按照地图的行、列有效范围生成坐标,同时加校验避免浆果刷在玩家出生/当前位置上 - 把默认场景的禁止emoji,在浆果坐标位置替换为实际的浆果emoji
- 加1行碰撞判定:玩家坐标与浆果坐标重合时,触发重新生成新的浆果位置,完成收集逻辑
关键代码调整点
- 在全局变量区(原有
posx、posy定义的下方)新增全局存储的浆果坐标,做初始位置校验:
# 全局存储浆果坐标,范围和地图循环边界完全匹配 berry_y = random.randint(0, 8) # 对应地图行范围:循环a是range(9),合法值0-8 berry_x = random.randint(0, 20) # 对应地图列范围:循环i是range(21),合法值0-20 # 初始校验,避免浆果刷在玩家初始位置上 while berry_y == posy and berry_x == posx: berry_y = random.randint(0, 8) berry_x = random.randint(0, 20)
- 补全
berryspawn函数,替代原有随机生成浆果坐标的逻辑:
def berryspawn(): global berry_x, berry_y, posx, posy # 重新生成浆果坐标,避开玩家当前所在位置 berry_y = random.randint(0, 8) berry_x = random.randint(0, 20) while berry_y == posy and berry_x == posx: berry_y = random.randint(0, 8) berry_x = random.randint(0, 20)
- 修改
assignstring函数的渲染逻辑:
删掉函数内部原来每次随机生成bers1、bers2的代码,把原有判断逻辑替换为调用全局存储的浆果坐标,显示浆果emoji:
# 删除原函数内的临时随机坐标代码 # bers1 = random.randint(0, 22) # bers2 = random.randint(0, 10) # print(bers1, bers2) for a in range(9): for i in range(21): if i == posx and a == posy: s = s + emoji.emojize(":bear:") elif a == berry_y and i == berry_x: s = s + emoji.emojize(":strawberry:") # 替换为需要的浆果emoji else: s = s + emoji.emojize(":prohibited:")
- 在游戏主循环里加入碰撞检测逻辑:
顺手修正原代码里的小bug——原来连续两次调用poschange函数会导致坐标计算错位,直接合并成一次调用即可,之后加收集判定:
while True: savex = posx savey = posy # 修正原代码两次调用poschange的bug posx, posy = poschange(posx, posy) # 检测是否碰到浆果 if posx == berry_x and posy == berry_y: print("收集到1个浆果!") berryspawn() # 触发新的浆果生成 if savex != posx or savey != posy: assignstring() print(posx, posy)
调整完成后,浆果会固定停留在场景位置,不会随着地图刷新乱跑,玩家走到浆果位置时会自动触发收集、重新生成新的浆果,完全满足存储坐标做碰撞检测的需求。
内容的提问来源于stack exchange,提问作者Miklath
相关产品推荐
相关产品推荐

