运行Python turtle/pyw代码时海龟对象不显示的问题求助
Turtle代码海龟不显示问题排查结果
这不是电脑环境问题,完全是代码本身的逻辑错误导致的,具体问题和修复方案如下:
核心错误点
- 最致命的问题:你在所有海龟对象初始化代码的前面加了
while True:死循环,程序启动后会一直卡在这个死循环里反复定义函数,永远执行不到后面创建player、dragon海龟实例的代码,自然不会有任何海龟显示。 - 战斗逻辑语法错误:
fight函数中你写了player -= damage_dealt,player是海龟对象,不能直接做数值减法,这里应该是修改玩家血量变量ph -= damage_dealt。 - 变量未定义错误:第二个主循环
while ph >=0 and dh>=0执行时,ph和dh还没有被定义,程序运行到这里会直接报错终止。 - 按键绑定适配问题:你绑定的是大写的
W/A/S/D,实际运行时需要开启大写锁定才能触发按键操作,建议改成小写或者同时绑定大小写。
修复后的参考代码
from turtle import * import random player_win = 0 dragon_win = 0 player_level = 0 player_xp = 0 # 提前初始化血量变量 ph = 500 dh = 500 # 函数直接定义在全局,不要放在死循环里 def forward(): global player player.forward(20) def backward(): global player player.backward(20) def left(): global player player.left(20) def right(): global player player.right(20) def fight(): global player, dragon, ph, dh, player_xp, player_level print("You have encountered a wild dragon!") fight_yes_or_no = input("Do you want to fight this dragon??") if fight_yes_or_no == "yes": ph = 500 dh = 500 while ph > 0 and dh > 0: if dh > 0: print("Dragon attacks!") damage_dealt = random.randint(0, 50) print("Dragon caused", damage_dealt, "damage") # 修正血量操作对象 ph -= damage_dealt if ph > 0: print("Player attacks!") damage_dealt = random.randint(0, 50) print("Player caused", damage_dealt, "damage") dh -= damage_dealt if dh == 0: print("Player wins!") print("You have earned 20 xp!") player_xp +=20 if player_xp >= 100: player_level +=1 player_xp = player_xp - 100 print("You have reached level", player_level) break if ph == 0: print("dragon wins!") print("You have lost 20 xp!") player_xp -=20 if player_xp < 0: player_xp = 0 if player_level > 0 and player_xp == 0: player_level -=1 print("You have reached level", player_level) if player_level <= 0: print("You died!") quit() break if fight_yes_or_no == "no": print("Ok") # 初始化海龟和窗口逻辑 player = Turtle() player.home() screen = Screen() player.penup() player.speed(0) # 绑定小写按键,更符合使用习惯 screen.onkey(forward, "w") screen.onkey(backward, "s") screen.onkey(left, "a") screen.onkey(right, "d") screen.listen() dragon = Turtle() dragon.shape("turtle") dragon.penup() dragon.goto(30, 40) dragon.speed(0) # 游戏主循环 while True: if player.distance(dragon) < 20: fight() # 战斗结束后把龙移到随机位置避免反复触发战斗 dragon.goto(random.randint(-200,200), random.randint(-200,200)) # 保持turtle窗口响应 screen.update()
内容的提问来源于stack exchange,提问作者Keanan Chiu
相关产品推荐
相关产品推荐

