蟒蛇龟从coords返回varibles

时间:2017-08-28 13:20:29

标签: python turtle-graphics

有没有办法根据乌龟的位置调用预设的代码行?

我已尝试使用$stream=fopen($url, 'rb'); while(!feof($stream)){ $buffer=fread($stream, 128); echo $buffer; flush(); } fclose($stream); turtle.pos(),但我无法让它回忆起代码。

我试过了: xcor/ycor

我是Python龟的新手。


    if turtle.pos == (0.00,50.00):
        combat()

2 个答案:

答案 0 :(得分:1)

您的代码中存在许多我希望修复的问题:

#the imports are now all at the start - this is generally considered the way to go
import turtle
import random
import time

#constant declarations
GRID_UNIT = 50
GRID_SIZE = 5

HALF_GRID = GRID_SIZE // 2

SPIDER_LOCATIONS = [(1, 1),
                    (-1, 0)]

TREASURE_LOCATIONS = [(1, -2),
                      (-2, -1)]

TOWN_LOCATIONS = [(-2, -2),
                  (2, -2),
                  (-2, 2),
                  (2, 2)]

#simplified event functions
def combat():
    print("You stepped on a spider!")

def treasure():
    print("You found treasure!")

def town():
    print("You entered a town")

#scaled setpos for use with int grid coords
def grid_setpos(x, y, scale):
    turtle.setpos((x - 0.5) * scale, (y - 0.5) * scale)

#draw a grid
def draw_grid(size, unit):
    for x in range(-size // 2, size // 2 + 1):
        turtle.pu()
        turtle.setpos(x * unit, -size // 2 * unit)
        turtle.pd()
        turtle.setpos(x * unit, size // 2 * unit)

        turtle.pu()
        turtle.setpos(-size // 2 * unit, x * unit)
        turtle.pd()
        turtle.setpos(size // 2 * unit, x * unit)

#draw the map, iterating over stored global coordinates
def map_starting_area(size, unit):
    draw_grid(size, unit)

    # square = town
    # circle = fight
    # arrow = quest marker
    # turtle = weapon shops
    # triangle = potion shop
    # hollow circle = chest

    turtle.shape("circle")
    turtle.pu()

    for x, y in SPIDER_LOCATIONS:
        grid_setpos(x, y, unit)
        turtle.stamp()

    for x, y in TREASURE_LOCATIONS:
        turtle.pu()
        grid_setpos(x, y - 0.25, unit)
        turtle.pd()
        turtle.circle(unit // 4)

    turtle.shape("square")
    turtle.pu()

    for x, y in TOWN_LOCATIONS:
        grid_setpos(x, y, unit)
        turtle.stamp()

turtle.speed('fastest')

map_starting_area(GRID_SIZE, GRID_UNIT)

turtle.color('orange')
turtle.shape('classic')

print('you continue with your journey')
print('you leave the protection of your farm and head into the open land')
print('you come to a cross road')

turtle.showturtle()

turtle_x, turtle_y = 0, 0

grid_setpos(0, 0, GRID_UNIT)

while True:
    direction = input('would you like to go north, south, east or west: ').lower()

    if direction == 'north':
        if turtle_y < HALF_GRID:
            turtle_y += 1
        else:
            print("You hit a wall")

    elif direction == 'south':
        if turtle_y > -HALF_GRID:
            turtle_y -= 1
        else:
            print("You hit a wall")

    elif direction == 'east':
        if turtle_x < HALF_GRID:
            turtle_x += 1
        else:
            print("You hit a wall")

    elif direction == 'west':
        if turtle_x > -HALF_GRID:
            turtle_x -= 1
        else:
            print("You hit a wall")

    elif direction == 'quit':
        break

    grid_setpos(turtle_x, turtle_y, GRID_UNIT)

    if (turtle_x, turtle_y) in SPIDER_LOCATIONS:
        combat()

    if (turtle_x, turtle_y) in TOWN_LOCATIONS:
        town()

    if (turtle_x, turtle_y) in TREASURE_LOCATIONS:
        treasure()

正在解决的要点:当乌龟撞到某个位置时如何“触发”事件。我通过对您的代码进行了一些更改来解决这个问题:

首先,由于你的乌龟总是在网格上,我将跟踪整齐地跟踪turtle_xturtle_y。这很重要,因为整数可以正确测试是否相等。当乌龟处于浮点位置时,实际上可能无法检查它是否在特定点。网格中的每个单元格都是-HALF_GRIDHALF_GRID范围内的一个坐标,位置由1-1离散地更改。现在你还需要知道每个“事件”的位置。我通过在文件开头将全局常量列表中的多个事件的位置存储起来来完成此操作。顺便说一句,我还改变了你的地图绘制方法,以便在这些列表上使用迭代,并为网格绘图使用for循环,因为这更加清晰(它使代码更易于阅读,因此对我来说,以及更短)。我希望您同意map_starting_area现在更容易理解。由于被跟踪的坐标现在是整数,因此只要调用setpos,它们就需要“按比例放大”。我通过编写辅助函数grid_setpos来完成此操作,用于在网格中设置位置。

简而言之,它现在存储一对整数用作海龟位置,因此它可以测试是否有任何等于那么。然后用乌龟做一些数学运算(将每个坐标向上调整GRID_UNIT),将整数坐标映射回网格。

以前,乌龟的坐标是浮点。这意味着它们是'十进制'数字(这足够接近以纠正它无关紧要)。但是,当您在网格上时,实际上并不需要十进制数。网格上的坐标是离散(整数)。因此,坐标现在被存储为整数。这意味着可以测试它们是否完全相等。它还使用蜘蛛坐标列表,并使用一些快速Python来查看当前坐标是否在此列表中:if (turtle_x, turtle_y) in SPIDER_LOCATIONS:

我已经简化了处理事件的方法(combat()town()treasure())到他们证明自己正在工作的地方,因为这是必要的对于这个问题。你可以扩展它们以扩展你的游戏。

我也改变了你的变量名。在Python中,通常使用underscore_casecamelCase来表示变量和函数,但从不CapitalCase(因为这是针对类),Capital_Underscore_Case几乎从不据我所知,用过。

小改动:

  • 导入语句现在全部位于顶部
  • 从地图逻辑中分离网格逻辑
  • 当你隐藏/展示海龟时还有其他一些错误

如果你想更多地概括它,并且有不同的位置,不同的事件属性等,我建议你开始编写一些类(具有xy等属性,可能是像encounter这样的实例方法。它超出了这个问题的范围(用乌龟坐标进行相等测试),但在Python类及其用途上有很多tutorials。我建议你开始简单并建立与这个项目的集成。如果你真的陷入了你的类实现,你当然总是会问另一个问题。

回应您的评论:通常不建议为每个城镇创建单独的变量。列表适用于需要表现相同的许多事物。想象一下,如果你有50个城镇,所有城镇都有不同的变量。如果您希望每个城镇跟踪姓名/有不同的事件等,请参阅我关于课程的部分。在通过OO编程更好地熟悉自己之后,您将需要一个城镇实例列表。如果您在尝试使用课程后对课程感到困惑,请发布有关您的问题的特定问题以及您目前所获得的课程

答案 1 :(得分:0)

val x = "_pi" val re = "^[\\._].*$".r x match { case re(z) => println("false") case _ => println("true") } 是一个函数

turtle.pos