Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 龟赛跑游戏-无法保持龟在正方形上_Python_Turtle Graphics - Fatal编程技术网

Python 龟赛跑游戏-无法保持龟在正方形上

Python 龟赛跑游戏-无法保持龟在正方形上,python,turtle-graphics,Python,Turtle Graphics,我和我的朋友目前正在学校编写一个练习,我们遇到了一些困难,比如如何让海龟们跟上进度。举例来说,在广场的第一面,有两只海龟在两边赛跑。然而,当他们转向90度时,其中一个或两个将从侧面脱离,这与练习要求不符 这是我们的代码: import turtle from random import randint def read_int(prompt,first,last): x = int(input(prompt)) while x < first or x > last:

我和我的朋友目前正在学校编写一个练习,我们遇到了一些困难,比如如何让海龟们跟上进度。举例来说,在广场的第一面,有两只海龟在两边赛跑。然而,当他们转向90度时,其中一个或两个将从侧面脱离,这与练习要求不符

这是我们的代码:

import turtle
from random import randint
def read_int(prompt,first,last):
    x = int(input(prompt))
    while x < first or x > last:
        print("Not in range. Try Again!!!")
        x= int(input(prompt))
    return x

square_count = read_int("Enter your laps between 1 and 10: ",1,10)
print(square_count)
#def t():

window = turtle.Screen()
window.bgcolor('lightblue')
def draw_square(turtle, center, size):
    xPt, yPt = center
    xPt -= size / 2
    yPt += size / 2
    side = 4
    size = 300
    angle = 90
    turtle.speed(0)
    turtle.up()
    turtle.goto(xPt, yPt)
    turtle.down()
    for i in range(side):
        turtle.forward(size)
        turtle.right(angle)

t = turtle.Turtle()
draw_square(t,(0,0),300)
t.shape('turtle')
t.color("red")
t.pensize(5)
t.up()
t.goto(-150, 150)

#def r():
r = turtle.Turtle()
draw_square(r,(0,0),300)
r.shape('turtle')
r.color("yellow")
r.up()
r.pensize(5)
r.goto(-150, 150)

sides = 4
size = 300


count_int = int(square_count)* sides
if count_int > 1:
    for sides in range(count_int):
            i = 0
            e = 0
            while i in range(0, size) or e in range(0, size):
                t_step = randint(1, 5)
                t.forward(t_step)
                i = i + t_step
                r_step = randint(1, 5)
                r.forward(r_step)
                e = e + r_step

            t.right(90)
            r.right(90)





window.exitonclick()
导入海龟
从随机导入randint
def read_int(提示、第一个、最后一个):
x=int(输入(提示))
当x<第一个或x>最后一个时:
打印(“不在范围内。请重试!!!”)
x=int(输入(提示))
返回x
平方计数=读取整数(“输入1到10之间的圈数:”,1,10)
打印(平方计数)
#def t():
window=turtle.Screen()
window.bgcolor('lightblue'))
def draw_square(乌龟、中心、尺寸):
xPt,yPt=中心
xPt-=尺寸/2
展翅+=尺寸/2
侧面=4
尺寸=300
角度=90
乌龟。速度(0)
乌龟
乌龟.后藤(xPt,yPt)
乌龟
对于范围内的i(侧面):
乌龟。前进(大小)
乌龟。右(角)
t=海龟。海龟()
画正方形(t,(0,0),300)
t、 形状(“海龟”)
t、 颜色(“红色”)
t、 养老金(5)
t、 up()
t、 转到(-150150)
#def r():
r=海龟。海龟()
画正方形(r,(0,0),300)
r、 形状(“海龟”)
r、 颜色(“黄色”)
r、 up()
r、 养老金(5)
r、 转到(-150150)
侧面=4
尺寸=300
计数=整数(平方计数)*边
如果计数大于1:
对于范围内的边(计数):
i=0
e=0
当i在范围(0,大小)内或e在范围(0,大小)内时:
t_阶跃=randint(1,5)
t、 前进(t_步)
i=i+t_步进
r_阶跃=randint(1,5)
r、 前进(r_步)
e=e+r_步进
t、 右(90)
r、 右(90)
window.exitonclick()

您的错误就在程序快结束时

while i in range(0, size) or e in range(0, size):
                t_step = randint(1, 5)
                t.forward(t_step)
                i = i + t_step
                r_step = randint(1, 5)
                r.forward(r_step)
                e = e + r_step

在假设i=298的情况下,t_步骤选择一个随机整数作为3。海龟最终的移动范围将超过300,因此它会移动到绘制框之外循环不会停止,因为它只在运行所有代码时意识到i超出范围。(也就是说,当线圈断开时,海龟已经移出盒子。)这就是海龟走出盒子的原因。您可以尝试使用“如果”条件来防止这种情况。

您有两种问题
首先,你应该注意你的海龟们走了多少步。因为如果一个正方形的大小是300,那么海龟可能会走很多步,它们的总和不等于300。我建议您将随机步骤的生成更改为:

steps = random.randrange(0, 4, 2)
这样,一只海龟只需走0或2步,你肯定总数会达到300步
第二点可能更重要。如果你像以前那样构造比赛循环,一只乌龟只有在另一只乌龟到达一行的末尾时才会转身,你应该重新组织你的代码,使这两只乌龟彼此独立

给你:

import turtle

from random import randint

def read_int(prompt,first,last):
    x = int(input(prompt))
    while x < first or x > last:
        print("Not in range. Try Again!!!")
        x= int(input(prompt))
    return x

no_of_laps = read_int("Enter your laps between 1 and 10: ",1 , 10)
print(no_of_laps)

window = turtle.Screen()

window.bgcolor('lightblue')

def draw_square(turtle, center, size):
    xPt, yPt = center
    xPt -= size / 2
    yPt += size / 2
    side = 4
    size = 300
    angle = 90
    turtle.speed(0)
    turtle.up()
    turtle.goto(xPt, yPt)
    turtle.down()
    for i in range(side):
        turtle.forward(size)
        turtle.right(angle)

t = turtle.Turtle()
draw_square(t,(0,0),300)

t.shape('turtle')
t.color("red")
t.pensize(5)
t.up()
t.goto(-150, 150)

#def r():
r = turtle.Turtle()
draw_square(r,(0,0),300)
r.shape('turtle')
r.color("yellow")
r.up()
r.pensize(5)
r.goto(-150, 150)

sides = 4
size  = 300

no_of_turns = int(no_of_laps) * sides

countTurns_t = 0
countTurns_r = 0
t_i = 0
r_i = 0

while countTurns_t < no_of_turns and countTurns_r < no_of_turns: 


    t_step = randint(1, 5)
    if t_i + t_step > size:
        t_step = size - t_i
        t.forward(t_step)
        t_i = 0
        t.right(90)
        countTurns_t += 1
    else:
        t.forward(t_step)
        t_i += t_step

    r_step = randint(1, 5)
    if r_i + r_step > size:
        r_step = size - r_i
        r.forward(r_step)
        r_i = 0
        r.right(90)
        countTurns_r += 1
    else:
        r.forward(r_step)
        r_i += r_step

window.exitonclick()
导入海龟
从随机导入randint
def read_int(提示、第一个、最后一个):
x=int(输入(提示))
当x<第一个或x>最后一个时:
打印(“不在范围内。请重试!!!”)
x=int(输入(提示))
返回x
无圈数=读取圈数(“输入1到10圈之间的圈数:”,1,10)
打印(无圈数)
window=turtle.Screen()
window.bgcolor('lightblue'))
def draw_square(乌龟、中心、尺寸):
xPt,yPt=中心
xPt-=尺寸/2
展翅+=尺寸/2
侧面=4
尺寸=300
角度=90
乌龟。速度(0)
乌龟
乌龟.后藤(xPt,yPt)
乌龟
对于范围内的i(侧面):
乌龟。前进(大小)
乌龟。右(角)
t=海龟。海龟()
画正方形(t,(0,0),300)
t、 形状(“海龟”)
t、 颜色(“红色”)
t、 养老金(5)
t、 up()
t、 转到(-150150)
#def r():
r=海龟。海龟()
画正方形(r,(0,0),300)
r、 形状(“海龟”)
r、 颜色(“黄色”)
r、 up()
r、 养老金(5)
r、 转到(-150150)
侧面=4
尺寸=300
圈数=整数(圈数)*边数
countTurns\u t=0
countTurns\u r=0
t_i=0
r_i=0
当countTurns\u t大小:
t_步长=大小-t_i
t、 前进(t_步)
t_i=0
t、 右(90)
countTurns\u t+=1
其他:
t、 前进(t_步)
t_i+=t_阶跃
r_阶跃=randint(1,5)
如果r_i+r_步长>大小:
r_步长=大小-r_i
r、 前进(r_步)
r_i=0
r、 右(90)
countTurns\u r+=1
其他:
r、 前进(r_步)
r_i+=r_阶跃
window.exitonclick()

另外,希望您能看到上面提供的代码是如何以及为什么按照预期工作的。仔细阅读其他答案,他们会指出编写代码时遗漏的重要问题

我会采取一种稍微不同的方法——不是硬编码两只海龟,而是为任意数量的海龟设计,然后只与两只海龟比赛。以下是基于任意数量海龟的重写,包括对style代码的一些返工,以及@Claudio的一些代码建议:

from random import randint
from turtle import Turtle, Screen
from collections import defaultdict

SIZE = 300
SIDES = 4
ANGLE = 90
MAXIMUM_STRIDE = 5

COLORS = ('red', 'gold', 'green', 'orange', 'blue')

MAX_RACERS = len(COLORS)

def read_int(prompt, first, last):
    x = int(input(prompt))

    while not first <= x <= last:
        print('Not in range! Try Again.')
        x = int(input(prompt))

    return x

def draw_square(turtle, center, size):
    xPt, yPt = center

    xPt -= size / 2
    yPt += size / 2

    turtle.up()
    turtle.goto(xPt, yPt)
    turtle.down()

    for _ in range(SIDES):
        turtle.forward(SIZE)
        turtle.right(ANGLE)

lap_count = read_int('Enter number of laps (between 1 and 10): ', 1, 10)
no_racers = read_int('Enter number of racers (between 2 and {}): '.format(MAX_RACERS), 2, MAX_RACERS)

jockey_colors = COLORS[0:no_racers]

window = Screen()
window.bgcolor('lightblue')

racers = defaultdict(dict)

draw_square(Turtle(visible=False), (0, 0), SIZE)

for color in jockey_colors:
    jockey = Turtle('turtle', visible=False)
    jockey.speed('fastest')
    jockey.color(color)

    jockey.up()
    jockey.goto(-SIZE/2, SIZE/2)
    jockey.showturtle()

    racers[color]['jockey'] = jockey
    racers[color]['sides'] = 0
    racers[color]['position'] = 0

finished = False

while not finished:
    for racer in racers.values():
        jockey = racer['jockey']

        step = randint(1, MAXIMUM_STRIDE + 1)

        if racer['position'] + step > SIZE:

            racer['sides'] += 1

            if racer['sides'] == lap_count * SIDES:
                finished = True
                break

            baby_step = SIZE - racer['position']
            jockey.forward(baby_step)
            jockey.right(ANGLE)
            racer['position'] = 0

            step -= baby_step

        jockey.forward(step)
        racer['position'] += step

window.exitonclick()
来自随机导入randint
从海龟进口海龟,屏幕
从集合导入defaultdict
尺寸=300
侧面=4
角度=90
最大步幅=5
颜色=(‘红色’、‘金色’、‘绿色’、‘橙色’、‘蓝色’)
最大车手数=长度(颜色)
def read_int(提示、第一个、最后一个):
x=int(输入(提示))

虽然不是第一次,因为我的练习要求两只乌龟在同一个正方形上跑。因此,我无法应用此解决方案。不过,谢谢你的支持。这对我帮助很大@davidmechin,我已经简化了代码,使用了一个共享的正方形。最初提供的代码(参见Claudio答案中的代码-它不关心它)有两个随机性来源。第一种方法是使步长随机。另一种是在创建算法的过程中,根据到算法角的距离缩短步长