Apple не исчезнет, ​​когда моя змея прикоснется к ней

Это мой первый пост! Я пытаюсь сделать клона змеи в Pygame, но когда моя змея касается яблока, она не телепортируется в другое место. Вот мой код:

import pygame          
import time
import random

pygame.init()          

wh = (255,255,255)     #white
bk = (0,0,0)           #black
ylw = (255,255,0)      #yellow 
prpl = (127,0,127)     #purple

snakeXChange = 0
snakeYChange = 0
dWidth = 800
dHeight = 600 
clock = pygame.time.Clock()
fps = 25
blockSize = 15
appleX = round(random.randrange(0, dWidth - blockSize)/ 10.0)* 10.0
appleY = round(random.randrange(0, dHeight - blockSize) / 10.0)* 10.0
snakeX = dWidth / 2           
snakeY = dHeight / 2          
font = pygame.font.SysFont(None, 25)
def message(msg, color):
    screenText = font.render(msg, True, color)
    gameDisplay.blit(screenText, [dWidth / 2, dHeight / 2])

gameDisplay = pygame.display.set_mode((dWidth,dHeight))     
pygame.display.set_caption('Snek')                   #shoutout to Hopson


gameExit = False                                    
gameOver = False


while not gameExit:                                  
    for event in pygame.event.get():                 
        if event.type == pygame.QUIT:                
            gameExit = True                         
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                snakeXChange = -blockSize
                snakeYChange = 0
            if event.key == pygame.K_RIGHT:
                snakeXChange = blockSize
                snakeYChange = 0
            if event.key == pygame.K_UP:
                snakeYChange = -blockSize
                snakeXChange = 0
            if event.key == pygame.K_DOWN:
                snakeYChange = blockSize
                snakeXChange = 0


    snakeX += snakeXChange

    snakeY += snakeYChange

    gameDisplay.fill(prpl)                          

    pygame.draw.rect(gameDisplay, wh, [snakeX,snakeY,blockSize,blockSize])  #snake

    pygame.draw.rect(gameDisplay, ylw, [appleX,appleY,blockSize,blockSize]) #apple

    if snakeX == appleX and snakeY == appleY:
        appleX = round(random.randrange(0, dWidth - blockSize)/ 10.0)* 10.0
        appleY = round(random.randrange(0, dHeight - blockSize) / 10.0)* 10.0

    clock.tick(fps)

    pygame.display.update()  

message("GAME OVER NIBBA", ylw)
pygame.display.update()                              #updates the display
time.sleep(5)
pygame.quit()                                        
quit()    

Первоисточник: https://paste.ee/p/eSimt

Я следую за учебниками NewBoston в качестве ссылки.

ура

SalmonSan

1 ответ

Вы округляете appleX а также appleY координаты до ближайшего кратного 10, но перемещаются с шагом 15 пикселей, и это означает, что может случиться так, что змея не сможет дотронуться до яблока. Например, appleX может быть 410, а змея начинается с 400, поэтому она никогда не сможет достичь яблока.

Просто округлите все позиции до ближайшего кратного 15 (blockSize и скорость):

appleX = round(random.randrange(0, dWidth - blockSize) / 15.0) * 15.0
appleY = round(random.randrange(0, dHeight - blockSize) / 15.0) * 15.0
snakeX = round(dWidth / 2. / 15.) * 15
snakeY = round(dHeight / 2. / 15.) * 15

Вы также можете просто пройти 15 как step аргумент random.randrange чтобы получить случайное число, кратное 15.

appleX = random.randrange(0, dWidth-blockSize, 15)

Также было бы возможно использовать pygame.Rect s для обнаружения столкновений и сохранения координат.

Другие вопросы по тегам