2017-09-19 1 views
0

Ich habe einige Probleme mit dem Spiel mit einem einfachen Spiel, das ähnlich wie Schlange ist.Python - Turtle-Koordinaten funktionieren nicht richtig in Snake-Style-Spiel

Wie Sie auf dem Bild sehen können, überlappt sich die Schlange, ist aber nicht so kollidiert, wie sie soll.

enter image description here

Die Kollision mit selbst einen Teil der Zeit nicht funktioniert, wie Sie es nicht zuverlässig erkennen kann, aber.

enter image description here

Ich habe alles versucht, ich denke an dieses Problem beheben können.

from turtle import Turtle, Screen 
from random import randint 

FONT = ('Arial', 24, 'normal') 
WIDTH, HEIGHT = 400, 400 
SPEED = 1 
points = 0 
posList = [] 
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(str(points) + ' score', font=FONT) 

    dot.setpos(randint(-WIDTH/2, WIDTH/2), randint(-HEIGHT/2, HEIGHT/2)) 
    dot.seth(randint(0,360)) 
def checkBracktrack(pos, poslist): 
## checks if current posiition is anywhere you have ever been 
    return pos in poslist 

def moveChar(): 
## updates the position of the player turtle 
    over = False 
    change = 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 
    tempPos = char.pos() 

    # adds current location to the list 
    posList.append(tempPos) 

    # checks if it is close enough to a point marker 
    if char.distance(dot) < 20: 
     point() 
    # calls the moveChar function again 
    screen.ontimer(moveChar, 1) 

# 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) 
score = 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) 
try: 
    with open('score.txt','r') as file: 
     highScore = int(file.read()) 
except: 
    with open('score.txt','w') as file: 
     file.write('0') 
    highScore = 0 
wall.penup() 
wall.forward(50) 
wall.write("0" + ' score', font=FONT) 
score.penup() 
score.setpos(wall.pos()) 
score.seth(270) 
score.fd(30) 
score.write(str(highScore) + ' high score', font=FONT) 
score.right(180) 
score.fd(30) 

char = Turtle(visible=False) 
char.speed('fastest') 

moveChar() 

screen.mainloop() 
if points > highScore: 
    with open('score.txt','w') as file: 
     file.write(str(points)) 
     print('new high score of ' + str(score) + ' saved') 
print(posList) 

Antwort

1

Ich kann Ihren Fehler nicht reproduzieren, aber lassen Sie uns etwas versuchen. Da die Schildkröte Koordinatensystem Punkt schwimmt, nehmen wir an, dass kleine Fehler in den Bruchteil Ihrer Positionen sind schleichend, die diesen Test verhindern von der Arbeit:

return pos in poslist 

So lassen Sie uns diese Zeile ändern:

return (int(pos[0]), int(pos[1])) in poslist 

und die passende Zeile ändern in moveChar():

# adds current location to the list 
posList.append((int(tempPos[0]), int(tempPos[1]))) 

Jetzt sind wir nur die Speicherung und Prüfung der ganzzahlige Teil der Position s o jede gebrochene Komponente wird ignoriert. Probieren Sie das aus und lassen Sie uns wissen, was passiert.

+0

Sie haben es geschafft, den Fehler zu beheben, vielen Dank! –

Verwandte Themen