Python龟游戏,制作不在境外的墙,修复NoneType错误代码,不可迭代

时间:2017-11-29 20:43:36

标签: python turtle-graphics nonetype

一切都工作正常,直到我放入涉及胜利和完成的所有内容,然后它一直告诉我之前正在运行的代码现在不可迭代。应该发生的事情是当他们越过一定距离他们到达地图上的其他地方时,我不在乎别的,这只是一个考验。我一直收到错误代码。

`Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1699, in 
__call__
return self.func(*args)
File "C:\Program Files\Python36\lib\turtle.py", line 686, in eventfun
fun()
File "E:\Home made game\original.py", line 183, in k1
elif win(player):
File "E:\Home made game\original.py", line 37, in win
return inside(position, winner)
File "E:\Home made game\original.py", line 7, in inside
x1 = min(p[0] for p in rectangle)
TypeError: 'NoneType' object is not iterable'

这是我的其余代码。

from turtle import Turtle, Screen

def inside(point, rectangle):
    x, y = point

    # not efficient, just a quick solution
    x1 = min(p[0] for p in rectangle)
    y1 = min(p[1] for p in rectangle)
    x2 = max(p[0] for p in rectangle)
    y2 = max(p[1] for p in rectangle)

    return x1 < x < x2 and y1 < y < y2

def not_safe(turtle):
    position = turtle.position()
    return inside(position, river) and not inside(position, bridge)

def winLine(turtle):
    turtle.up()
    turtle.color('red')
    turtle.goto(-WIDTH / 2, 0)

    turtle.down()
    turtle.begin_poly()
    turtle.begin_fill()
    turtle.forward(WIDTH)
    turtle.right(90)
    turtle.forward(50)
    turtle.right(90)
    turtle.forward(WIDTH)
    turtle.end_fill()
    turtle.end_poly()

def win(turtle):
    position = turtle.position()
    return inside(position, winner)

def drawTree(t, sd):
    for i in range(4):
        layout.down()
        t.forward(sd)
        t.right(90)
        layout.up()

def drawRiver(turtle):
    turtle.color('darkblue', 'blue')

    turtle.goto(-WIDTH / 2, 0)

    turtle.begin_poly()
    turtle.begin_fill()
    turtle.forward(WIDTH)
    turtle.right(90)
    turtle.forward(100)
    turtle.right(90)
    turtle.forward(WIDTH)
    turtle.end_fill()
    turtle.end_poly()

    return turtle.get_poly()

def tree(branchLen,layout):
    if branchLen > 6:
        layout.down()
        layout.forward(branchLen)
        layout.right(20)
        tree(branchLen-6,layout)
        layout.left(40)
        tree(branchLen-6,layout)
        layout.right(20)
        layout.backward(branchLen)
        layout.up()

def main():
    layout.speed('fastest')
    layout.left(90)
    layout.up()
    layout.backward(100)
    layout.down()
    layout.color("brown")
    tree(36,layout)
    layout.right(90)
    layout.up()


def drawBridge(turtle):
    turtle.goto(150, 25)
    turtle.color('rosybrown4', 'saddlebrown')

    turtle.begin_poly()
    turtle.begin_fill()
    turtle.forward(100)
    turtle.left(90)
    turtle.forward(150)
    turtle.left(90)
    turtle.forward(100)
    turtle.left(90)
    turtle.end_fill()
    turtle.end_poly()

    return turtle.get_poly()

def drawPlanks(turtle):
    layout.goto(149, -125)
    for i in range(37):
        layout.pensize(.1)
        layout.down()
        layout.color("black")
        layout.forward(.3)
        layout.left(90)
        layout.forward(99)
        layout.left(90)
        layout.forward(.3)
        layout.left(90)
        layout.forward(99)
        layout.left(90)
        layout.up()
        layout.forward(4)
    layout.goto(149, 25)
    layout.down()
    layout.left(90)
    layout.forward(100)
    layout.pensize(.1)
    layout.up()
    layout.goto(149, -125)
    layout.down()
    layout.right(90)
    layout.forward(151)
    layout.up()
    layout.goto(49, -125)
    layout.down()
    layout.forward(151)
 wn = Screen()
 wn.bgcolor('lightgreen')
 WIDTH = wn.window_width()

layout = Turtle(visible=False)
layout.speed('fastest')
layout.penup()

river = drawRiver(layout)
bridge = drawBridge(layout)
planks = drawPlanks(layout)
winner= winLine(layout)
layout.up()
layout.right(90)

# Tree locations
layout.goto(222, 198)
main()
layout.goto(-334, 155)
main()
layout.goto(132, 140)
main()
layout.goto(50, -222)
main()
layout.goto(200, -122)
main()
layout.goto(-362,200)
main()
layout.goto(-222, 198)
main()
layout.goto(350, 350)
main()
layout.goto(-200, -150)
main()
layout.color("blue")
layout.goto(0, -50)
player = Turtle('arrow')
player.color('grey')
player.penup()

player.goto(0, -200)
player.setheading(90)


def k1():
    player.forward(45)
    if not_safe(player):
        player.goto(0, -200)
        player.setheading(90)
    elif win(player):
        player.goto(200, 100)

def k4():
    player.back(45)
    if not_safe(player):
        player.goto(0, -200)
        player.setheading(90)
    elif win(player):
        player.goto(200, 100)

def k2():
    player.left(30)

def k3():
    player.right(30)

wn.onkey(k1, "Up")
wn.onkey(k2, "Left")
wn.onkey(k3, "Right")
wn.onkey(k4, "Down")

wn.listen()
wn.mainloop()

1 个答案:

答案 0 :(得分:0)

您正在为这些变量指定多边形:

river = drawRiver(layout)
bridge = drawBridge(layout)
planks = drawPlanks(layout)
winner = winLine(layout)

但是,drawPlanks和winLine这两个函数不返回多边形;他们默认返回None,分配给plankswinner;之后,当您在inside上致电winner时,它会传递None而不是polygon作为参数。您需要为这两个函数添加return turtle.get_poly()

def winLine(turtle):
    turtle.up()
    turtle.color('red')
    turtle.goto(-WIDTH / 2, 0)

    turtle.down()
    turtle.begin_poly()
    turtle.begin_fill()
    turtle.forward(WIDTH)
    turtle.right(90)
    turtle.forward(50)
    turtle.right(90)
    turtle.forward(WIDTH)
    turtle.end_fill()
    turtle.end_poly()

    return turtle.get_poly()      # <-- here

def drawPlanks(turtle):
    layout.goto(149, -125)
    for i in range(37):
        layout.pensize(.1)
        layout.down()
        layout.color("black")
        layout.forward(.3)
        layout.left(90)
        layout.forward(99)
        layout.left(90)
        layout.forward(.3)
        layout.left(90)
        layout.forward(99)
        layout.left(90)
        layout.up()
        layout.forward(4)
    layout.goto(149, 25)
    layout.down()
    layout.left(90)
    layout.forward(100)
    layout.pensize(.1)
    layout.up()
    layout.goto(149, -125)
    layout.down()
    layout.right(90)
    layout.forward(151)
    layout.up()
    layout.goto(49, -125)
    layout.down()
    layout.forward(151)

    return turtle.get_poly()      # <-- and there