如何在代码任意位置调用Foe类实现随机输出数值的重新生成?
实现方案
你的两个需求都可以实现,核心是调整类结构,把随机参数生成的逻辑抽成可复用的独立方法:
1. 现有代码的问题
你贴的原始代码存在明显语法问题:最后两行if main_menu == False:和foeResetter()直接写在了类的全局作用域,不属于__init__方法,会在类定义阶段就直接执行,导致后续实例化类时出现异常,需要先把这部分逻辑调整到正确位置。
2. 调整后的完整代码
import random # 假设Actor父类为你预先定义的基础类 class Foe(Actor): def __init__(self, image): super().__init__(image) # 初始化时调用随机参数生成方法,首次生成属性值 self.reset_random_params() # 所有随机生成逻辑抽为独立方法,后续要重排数值直接调用该方法即可 def reset_random_params(self): self.rotation = random.uniform(-2.5, 2.5) firside = random.randint(1, 8) secside = random.randint(1, 8) # 保证起止位置不相邻、不重复 while firside == secside or secside == firside + 1 or secside == firside - 1 or (firside == 8 and secside == 1) or (firside == 1 and secside == 8): secside = random.randint(1, 8) # 生成起始位置 if firside == 1: self.fx = random.randint(0, 425) self.fy = -40 elif firside == 2: self.fx = random.randint(426, 850) self.fy = -40 elif firside == 3: self.fx = 880 self.fy = random.randint(0, 212) elif firside == 4: self.fx = 880 self.fy = random.randint(213, 425) elif firside == 5: self.fx = random.randint(0, 425) self.fy = 465 elif firside == 6: self.fx = random.randint(426, 850) self.fy = 465 elif firside == 7: self.fx = -40 self.fy = random.randint(0, 212) elif firside == 8: self.fx = -40 self.fy = random.randint(213, 425) # 生成目标位置 if secside == 1: self.dx = random.randint(0, 425) self.dy = -40 elif secside == 2: self.dx = random.randint(426, 850) self.dy = -40 elif secside == 3: self.dx = 880 self.dy = random.randint(0, 212) elif secside == 4: self.dx = 880 self.dy = random.randint(213, 425) elif secside == 5: self.dx = random.randint(0, 425) self.dy = 465 elif secside == 6: self.dx = random.randint(426, 850) self.dy = 465 elif secside == 7: self.dx = -40 self.dy = random.randint(0, 212) elif secside == 8: self.dx = -40 self.dy = random.randint(213, 425) # 你原有的全局逻辑可以放在这里,根据自己的需求调整触发时机 # if not main_menu: # foeResetter()
3. 使用方法
- 任意位置重复调用Foe类生成新敌人:直接多次实例化即可,每个实例都会生成独立的随机参数
# 示例:生成多个敌人实例 foe1 = Foe("enemy_red.png") foe2 = Foe("enemy_blue.png") - 给已存在的Foe实例重新随机数值:直接调用
reset_random_params()方法即可# 示例:敌人到达终点后重新生成随机位置 foe1.reset_random_params()
内容的提问来源于stack exchange,提问作者Whi_24
相关产品推荐
相关产品推荐

