簡體   English   中英

Python-Turtle坐標在蛇形游戲中無法正常工作

[英]Python - Turtle coordinates not working properly in snake style game

我在一個類似於蛇的簡單游戲中遇到了一些破壞游戲的問題。

如您在圖片中看到的,蛇在重疊,但沒有像預期的那樣碰撞。

在此處輸入圖片說明

如您所見,與自身的碰撞確實在某些時候起作用,但這並不可靠。

在此處輸入圖片說明

我已經盡力解決此問題。

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)

我無法重現您的錯誤,但請嘗試一下。 由於烏龜坐標系是浮點,所以我們假設小誤差正在蔓延到您的位置的小數部分,從而阻止了此測試的進行:

return pos in poslist

因此,讓我們將該行更改為:

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

並在moveChar()更改匹配行:

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

現在,我們僅存儲和測試位置的整數部分,因此將忽略任何小數部分。 試試這個,讓我們知道會發生什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM