Как помешать Python Черепахе пройти линии, которые она нарисовала? - PullRequest
0 голосов
/ 24 марта 2020

Я создаю игру, используя Черепаху в Python 3.

Моя главная проблема в том, что черепаха может перемещаться по "нарисованным" линиям в игре. По сути, это рандомизированная игра «flappy-bird», отличающаяся каждый раз, когда вы запускаете программу.

Можно ли запретить черепахе проходить линии, которые она нарисовала?

Программа создает оба стены и дыры, которые игрок должен пройти, как легкая птица, где это труба-труба разной длины на трубах.

И если я запускаю print(hole) в конце программы, это возвращает None. Почему это?

Вот моя программа:

import turtle
import random
GameOver=False
import math
import time


board = turtle.Screen()
board.screensize(50.50)
board.bgcolor("black")
board.title("Labyrinten")
Hast_på_ritande_av_bana= 0
TURTLE_SIZE = 20
playerspeed = 50
n=1 #variabeler som gör att den hoppar ett steg åt höger när den gör raderna t.ex. ((930/8)*n)
b=2 #

global player


#SÄTTER UPP SKÄRM
border = turtle.Turtle()
border.speed(Hast_på_ritande_av_bana)

border.hideturtle()
border.color("white")
border.shape("triangle")
border.penup()
border.goto(TURTLE_SIZE/2 - board.window_width()/2, board.window_height()/2 - TURTLE_SIZE/2)
border.pendown()
border.showturtle()

border.rt(90)
border.fd(780)
border.penup()

#ritar banan

for rader in range(4): #creating the maze

    border.lt(90)
    border.fd(930/8)
    border.pendown()
    border.lt(90)
    wall_ett = border.fd(random.randint(50,630))    #lower wall on row 1
    border.penup()
    hole=border.fd(random.randint(30,70))           #hole on row 1
    border.pendown()
    wall_ett_ett = border.goto (TURTLE_SIZE/2 - board.window_width()/2 + (930/8*n), board.window_height()/2 - TURTLE_SIZE/2) #higher wall on row 1
    border.rt(90)
    border.fd(930/8)
    border.rt(90)
    wall_två_ett = border.fd(random.randint(50, 630)) #lower wall on row 2
    border.penup()
    hole2 = border.fd(random.randint(30, 70))         #hole on row 2
    border.pendown()
    wall_två_två = border.goto(TURTLE_SIZE/2 - board.window_width()/2 + (930/8*b), + TURTLE_SIZE/2 - board.window_height()/2 ) # higher wall on row 2
    n = n + 2
    b = b + 2

border.goto(TURTLE_SIZE/2 - board.window_width()/2 , TURTLE_SIZE/2 - board.window_height()/2 )
border.goto(TURTLE_SIZE/2 - board.window_width()/2, board.window_height()/2 - TURTLE_SIZE/2)
border.penup()
border.lt(90)
border.fd(930/8)
border.pendown()
border.goto(-TURTLE_SIZE + board.window_width()/2, board.window_height()/2 - TURTLE_SIZE/2)
border.hideturtle()



player=turtle.Turtle()
player.color("green")
player.shape("turtle")
player.hideturtle()
player.penup()
player.goto(TURTLE_SIZE/2 - board.window_width()/2, board.window_height()/2 - TURTLE_SIZE/2)
player.rt(90)
player.fd(30)
player.lt(90)
player.fd((930/8)/2)
player.rt(90)
player.showturtle()
coordinates = player.pos()







#Skapa spelaren (som går igenom banan)
def spawna_spelare():
    spawn = turtle.Turtle()
    spawn.color("green")
    spawn.shape("turtle")
    spawn.hideturtle()
    spawn.penup()

    spawn.goto(TURTLE_SIZE/2 - board.window_width()/2, board.window_height()/2 - TURTLE_SIZE/2)
    spawn.rt(90)
    spawn.fd(30)
    spawn.lt(90)
    spawn.fd((930/8)*(random.randint(1,8)))
    spawn.rt(90)

    spawn.showturtle()

#Gå med spelaren
def move_left():
    x  = player.xcor()
    x -= playerspeed

    if x  < -460:
        x = -460
    player.setx(x)

def move_right():

    x = player.xcor()
    x += playerspeed
    if x > 450:
        x = 450
    player.setx(x)


    if x.distance(wall_ett) >20: #or wall_ett_ett or wall_två_ett or wall_två_två) == 1:  #
        player.shape("triangle")

def move_down():
    y = player.ycor()
    y -= playerspeed
    if y < -375:
        y = -375
    player.sety(y)

def move_up():
    y = player.ycor()
    y += playerspeed

    if y > 380:
        y = 380
    player.sety(y)

turtle.listen()
turtle.onkey(spawna_spelare, "space")
turtle.onkey(move_left, "Left")
turtle.onkey(move_right, "Right")
turtle.onkey(move_down, "Down")
turtle.onkey(move_up, "Up")





wall_ett = border.xcor()
wall_två_ett=border.xcor()
print(wall_ett)
print(wall_ett)
print(hole)







board.mainloop()

1 Ответ

0 голосов
/ 24 марта 2020

Таким образом, вам нужно нарисовать стены так, чтобы потом можно было проверить, пересекается ли ход, запрошенный игроком, с любой стеной (или границей).

Вот предложение:

SCREEN_WIDTH = 800
HOLE_HEIGHT = 50
SCREEN_HEIGHT  = 600
NUM_WALLS = 8

board = turtle.Screen()
board.setup(SCREEN_WIDTH+10, SCREEN_HEIGHT+10)
board.screensize(SCREEN_WIDTH, SCREEN_HEIGHT)
board.setworldcoordinates(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)

border = turtle.Turtle()
border.speed(10) # draw walls as fast as possible
border.color('white')
border.hideturtle()
# list of the drawn walls, each wall is represented by a tuple:
# (wall_x, wall_hole_lower_y, wall_hole_upper_y)
walls = [] 
for wall_ix in range(NUM_WALLS):
    # compute coordinates of wall and store them
    wall_x = int((1+wall_ix) * SCREEN_WIDTH / (1+NUM_WALLS))
    wall_ybottom = random.randint(0, SCREEN_HEIGHT - HOLE_HEIGHT)
    wall_ytop = wall_ybottom + HOLE_HEIGHT
    walls.append((wall_x, wall_ytop, wall_ybottom))
    # draw wall
    border.penup()
    border.goto(wall_x, 0)
    border.pendown()
    border.goto(wall_x, wall_ybottom)
    border.penup()
    border.goto(wall_x, wall_ytop)
    border.pendown()
    border.goto(wall_x, SCREEN_HEIGHT)

def move_right():
    old_x  = player.xcor()
    new_x = old_x + playerspeed
    y = player.ycor()

    for wall_x, wall_ytop, wall_ybottom in walls:
        if old_x <= wall_x <= new_x:
            # player is possibly moving across the wall, check that y is valid
            if wall_ybottom < y < wall_ytop:
                # OK ! player moves through the hole
                player.setx(new_x)
            else:
                # invalid, player is crossing a wall line
                # resetting to old position, but you might want to stop the game
                player.setx(old_x)
...