- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在尝试使用 turtle 图形在Python中制作一个类似蛇的游戏,并且当您使用a和d键转动 turtle (如果您与之前的任何回合一致)时,遇到了一个破坏游戏的错误。它似乎正在无序执行代码,但我不知道发生了什么。
完整代码如下
import turtle
import random
import math
x = 400
y = 400
global speed
global points
points = 0
speed = 2
posList = ['']
# turns your character left
def left():
global speed
global posList
key = True
char.fd(speed)
char.left(90)
char.fd(speed)
# turns your character left
def right():
global speed
global posList
key = True
char.fd(speed)
char.right(90)
char.fd(speed)
# adds one box to the point counter
def point():
global points
points += 1
wall.speed(0)
wall.pendown()
wall.forward(50)
wall.seth(90)
wall.forward(10)
wall.seth(180)
wall.forward(50)
wall.seth(270)
wall.forward(10)
wall.penup()
wall.seth(90)
wall.forward(12)
wall.seth(0)
dot.setx(random.randint(-200,200))
dot.sety(random.randint(-200,200))
print(points)
# checks if curren posisition is anywhere you have ever been
def checkBracktrack(pos, poslist):
found = False
for thing in posList:
if thing == pos:
found=True
return found
# creates the box that the game occurs in
turtle.colormode(255)
screen = turtle.Screen()
dot = turtle.Turtle()
dot.penup()
dot.speed(0)
dot.shape('turtle')
dot.setx(random.randint(-200,200))
dot.sety(random.randint(-200,200))
wall = turtle.Turtle()
wall.speed(0)
wall.penup()
wall.goto(x/2,y/2)
wall.pendown()
wall.seth(180)
wall.forward(400)
wall.seth(270)
wall.forward(400)
wall.seth(0)
wall.forward(400)
wall.seth(90)
wall.forward(400)
wall.seth(270)
wall.forward(400)
wall.seth(0)
wall.penup()
wall.forward(100)
char = turtle.Turtle()
x = 0
y = 0
# updates the position of the player turtle
while True:
screen.onkey(left,"a")
screen.onkey(right,"d")
char.hideturtle()
char.forward(speed)
char.speed(0)
turtle.listen(xdummy=None, ydummy=None)
print(char.pos())
print(posList[(len(posList)-1)])
# checks if current position is the same as any position it has ever been in !this is the bit that is having problems!
if checkBracktrack(char.pos(),posList):
speed = 0
break
# checks if it is close enough to a point marker to
if char.ycor() in range(dot.ycor()-10,dot.ycor()+10) and char.xcor() in range(dot.xcor()-10,dot.xcor()+10):
point()
# checks if in the box
if char.ycor() not in range(-200,200) or char.xcor() not in range(-200,200):
speed = 0
# adds current location to the list
posList.append(char.pos())
char.fd(speed)
print('you travelled',len(posList),'pixels')
print('collided with yourself')
print(char.pos())
print(posList)
name = input('quit')
screen.mainloop()
最佳答案
您的代码存在许多小问题:您需要重新阅读何时使用global
;您的 checkBracktrack()
函数将 poslist
作为参数,但对全局 posList
进行操作(大小写错误);由于额外的 fd()
调用和大于 1 的 speed
,您的像素行进距离计算不正确;使用turtle的.distance()
方法可以大大简化你的接近测试;您在游戏板上显示点数的代码根本不起作用;当您只需要为每个键调用一次时,您会在循环中一遍又一遍地调用 onkey()
;您的 checkBracktrack()
函数有一个不必要的循环。
我在代码中遇到的最大问题是 while True:
这不应该在基于事件的代码中发生。我重写并简化了下面的代码,解决了上述问题以及其他问题:
from turtle import Turtle, Screen
from random import randint
FONT = ('Arial', 24, 'normal')
WIDTH, HEIGHT = 400, 400
SPEED = 1
def left():
""" turns your character left """
char.left(90)
def right():
""" turns your character right """
char.right(90)
def point():
""" adds one box to the point counter """
global points
points += 1
wall.undo()
wall.write(points, font=FONT)
dot.setpos(randint(-WIDTH/2, WIDTH/2), randint(-HEIGHT/2, HEIGHT/2))
def checkBracktrack(pos, poslist):
""" checks if current posiition is anywhere you have ever been """
return pos in poslist
def move_char():
""" updates the position of the player turtle """
over = False
char.forward(SPEED)
# checks if current position is the same as any position it has ever been at
if checkBracktrack(char.pos(), posList):
over = True
# checks if in the box
elif not (-200 <= char.ycor() <= 200 and -200 <= char.xcor() <= 200):
over = True
if over:
print('you travelled', len(posList), 'pixels')
return
# adds current location to the list
posList.append(char.pos())
# checks if it is close enough to a point marker
if char.distance(dot) < 20:
point()
screen.ontimer(move_char, 10)
points = 0
posList = []
# creates the box in which the game occurs
screen = Screen()
screen.onkey(left, "a")
screen.onkey(right, "d")
screen.listen()
dot = Turtle('turtle')
dot.speed('fastest')
dot.penup()
dot.setpos(randint(-WIDTH/2, WIDTH/2), randint(-HEIGHT/2, HEIGHT/2))
wall = Turtle(visible=False)
wall.speed('fastest')
wall.penup()
wall.goto(WIDTH/2, HEIGHT/2)
wall.pendown()
for _ in range(4):
wall.right(90)
wall.forward(400)
wall.penup()
wall.forward(100)
wall.write("0", font=FONT)
char = Turtle(visible=False)
char.speed('fastest')
move_char()
screen.mainloop()
我相信,引发您最初问题的问题在重新编写代码的过程中得到了解决。
关于python - 使用 turtle 图形以奇数顺序执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46190345/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
如果 turtle 在一组坐标之上,我想让 turtle 回到地板上: 像这样: floor = -323 if turtle above floor: turtle.goto(floor)
我正在用Python语言编写一个小的文本库游戏。在使用Turtle函数数字输入和文本输入时,会出现一个文本字段,要求用户输入。当文本输入字段出现时,您可以开始输入,而不需要在输入字段中单击,但对于数字
我试图让 turtle 从程序开始就隐藏起来,但即使在放置 t.hideturtle() 之后也是如此。在我将 turtle 声明为变量的正下方, turtle 似乎仍然出现在绘图的中间。 impor
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我将 turtle 设置为最快,当我单独运行第一个循环时,效果很好,但随着我添加更多,它变得与仅单独执行第一个循环时相当。我不知道这是否只是因为绘图的复杂性,但完成形状需要相当长的时间。我可以做些什么
如何在不显示绘图过程的情况下显示最终绘图?我使用的是Python 3.4,这个项目是创建一个射箭游戏。例如,如果我使用以下代码: import turtle screen = turtle.Scree
Python 2.7 版本中的 turtle 和 Turtle 有何不同? import turtle star = turtle.Turtle() for i in range(50): s
如何告诉 turtle 面向 turtle 图形中的方向?我希望 turtle 能够转动并面向一个方向,无论其原始位置如何,我怎样才能实现这一目标? 最佳答案 我认为 turtle.setheadin
如何让 4 只不同的 turtle 同时移动?另外,如何为 Turtle.shape 方法制作人形?我知道有一个名为 register_shape 的 Screen 方法,但我找不到关于它的任何文档。
我设置了热键并且能够移动 turtle ,但是当我运行代码时,如果我超过 x 和 y 值,则不会发生任何事情..也没有错误。怎么了? if (Alex.xcor()>50 or Alex.xcor()
方向: 我创建了以下函数以允许用户将 turtle 更改为他/她选择的图像,然后随时将其标记到 Canvas 上: def TurtleShape(): try: # Tkin
我用黑色 turtle 创建了一个形状(白色矩形)而不是一条线!然后我移动屏幕底部的白色形状以创建一个必须从左向右移动的桨。我必须保持形状但删除黑色箭头。怎么办? from turtle import
我想创建 SpaceInvaders 游戏,但敌人不会被击落,而是会向玩家射击。我使用 .goto() 方法实现它,如下所示: bullet2.goto(player.xcor(),player.yc
出于教学目的,我需要一个图形默认值列表。这是我现在所拥有的: background white canvas 950W by 800H dot 5 (pixels) fil
这个问题在这里已经有了答案: Importing installed package from script with the same name raises "AttributeError: m
我目前正在上初级编程课,正在完成作业。现在,我必须用模块 turtle build 3 个房子(我完成了): def drawBody(mover): #Rectangle part
我有一些代码如下: # My code here turtle.bye() 在那之后,有什么办法可以重新打开 turtle 窗口。我知道您可以执行 turtle.clearscreen() 但这不会关
这段代码设置了一只 turtle 放置的邮票背景。另一只 turtle (其形状来自导入的图像文件)在背景上移动。但是,只要第二只 turtle 位于第一只 turtle 放置的图章上方,它就不可见。
我的程序中有两只 turtle 。它们碰撞在一起时发生了动画,但我希望一只 turtle 位于另一只 turtle 之上,如下所示: 所以,我的问题是 - 我怎样才能实现这一点 - 是否有一行简单的代
我是一名优秀的程序员,十分优秀!