Python PyGame检测碰撞,即使碰撞没有发生

Python PyGame检测碰撞,即使碰撞没有发生,python,python-3.x,pygame,pygame-surface,Python,Python 3.x,Pygame,Pygame Surface,我想用Python制作一个蛇游戏,但当我想检测与矩形的碰撞时,游戏似乎会检测碰撞,即使它们没有发生: if snake_rect.colliderect(jablko_rect): print("Mniam!") 此碰撞检查可无限打印文本。很明显,这两个单独的对象没有相互接触,它如何打印文本。我想这不是一个while循环问题。碰撞检查用于49 x 49 px的图像 整个代码: import random import pygame from time import s

我想用Python制作一个蛇游戏,但当我想检测与矩形的碰撞时,游戏似乎会检测碰撞,即使它们没有发生:

if snake_rect.colliderect(jablko_rect):
   print("Mniam!")
此碰撞检查可无限打印文本。很明显,这两个单独的对象没有相互接触,它如何打印文本。我想这不是一个while循环问题。碰撞检查用于49 x 49 px的图像
整个代码:

import random
import pygame
from time import sleep

pygame.init()
SZEROKOSC = 800
WYSOKOSC = 600
plansza = pygame.display.set_mode((SZEROKOSC, WYSOKOSC))  # rozmiar okna gry
pygame.display.update()
pygame.display.set_caption("Snake")  # tytuł okna gry

KROK = 25  # o ile "kroków" ma się przemieszczać snake
snake = pygame.image.load("snake_element.png").convert()  # nasz snake
jablko = pygame.image.load("apple.png").convert()  # nasze jabłko
snake_rect = snake.get_rect()
jablko_rect = jablko.get_rect()

clock = pygame.time.Clock()

czcionka = pygame.font.SysFont(None, 50)


def wiadomosc(msg, color):
    wiad = czcionka.render(msg, True, color)
    plansza.blit(wiad, [SZEROKOSC / 2 - 100, WYSOKOSC / 2 - 25])


def petla_gry():
    przegrana = False
    zamkniecie = False

    x1 = SZEROKOSC / 2  # koordynaty
    y1 = WYSOKOSC / 2  # koordynaty

    x1_zmiana = 0
    y1_zmiana = 0

    jablko_x = round(random.randrange(0, SZEROKOSC - 25) / 25.0) * 25.0  # 25 to połowa rozmiaru naszych obrazków
    jablko_y = round(random.randrange(0, WYSOKOSC - 25) / 25.0) * 25.0  # 25 to połowa rozmiaru naszych obrazków

    print(jablko_x)
    print(jablko_y)

    while not przegrana:
        while zamkniecie:
            plansza.fill(white)
            wiadomosc("Przegrałeś! Q - wyjście z gry, C - restart gry", (255, 0, 0))
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        przegrana = True
                        zamkniecie = False
                    if event.key == pygame.K_c:
                        petla_gry()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                przegrana = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_a:
                    x1_zmiana = -KROK
                    y1_zmiana = 0
                elif event.key == pygame.K_d:
                    x1_zmiana = KROK
                    y1_zmiana = 0
                elif event.key == pygame.K_w:
                    x1_zmiana = 0
                    y1_zmiana = -KROK
                elif event.key == pygame.K_s:
                    x1_zmiana = 0
                    y1_zmiana = KROK

        if x1 >= SZEROKOSC or x1 <= 0 or y1 >= WYSOKOSC or y1 <= 0:
            przegrana = True
            wiadomosc("Przegrałeś!", (255, 0, 0))
            pygame.display.update()
            sleep(2)

        x1 += x1_zmiana
        y1 += y1_zmiana

        plansza.fill((255, 255, 255))

        plansza.blit(snake, (x1 - 25, y1 - 25))  # 25 to połowa rozmiaru naszych obrazków
        plansza.blit(jablko, (jablko_x, jablko_y))
        pygame.display.update()

        if snake_rect.colliderect(jablko_rect):
            print("Mniam!")

        '''if x1 == jablko_x and y1 == jablko_y:
            print("Mniam!")'''

        clock.tick(8)  # czas odświeżania - ruch snake'a

    pygame.quit()
    quit()

petla_gry()
随机导入
导入pygame
从时间上导入睡眠
pygame.init()
斯泽罗科斯克=800
WYSOKOSC=600
plansza=pygame.display.set_模式((SZEROKOSC,WYSOKOSC))35;rozmiar-okna-gry
pygame.display.update()
pygame.display.set_标题(“蛇”)35; tytułokna gry
KROK=25#o ile“KROKów”ma sięprzemieszczać蛇
snake=pygame.image.load(“snake_element.png”).convert()#nasz snake
jablko=pygame.image.load(“apple.png”).convert()
snake\u rect=snake.get\u rect()
jablko_rect=jablko.get_rect()
clock=pygame.time.clock()
czcionka=pygame.font.SysFont(无,50)
def wiadomosc(味精,颜色):
wiad=czcionka.render(msg,True,color)
plansza.blit(wiad,[SZEROKOSC/2-100,WYSOKOSC/2-25])
def petla_gry():
przegrana=False
Zamniecie=假
x1=SZEROKOSC/2#koordynaty
y1=WYSOKOSC/2#koordynaty
x1_zmiana=0
y1_zmiana=0
jablko#u x=圆形(随机。随机范围(0,SZEROKOSC-25)/25.0)*25.0#25至połowa rozmiaru-naszych obrazków
jablko#u y=圆形(随机。随机范围(0,WYSOKOSC-25)/25.0)*25.0#25至połowa rozmiaru-naszych obrazków
打印(jablko_x)
打印(jablko_y)
虽然不是普泽格拉纳:
而Zamkinecie:
平面填充(白色)
wiadomosc(“Przegrałeś!Q-wyjście z gry,C-restart gry”,(255,0,0))
pygame.display.update()
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_q:
przegrana=True
Zamniecie=假
如果event.key==pygame.K_c:
佩特拉·格里()
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
przegrana=True
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_a:
x1_zmiana=-KROK
y1_zmiana=0
elif event.key==pygame.K\u d:
x1_zmiana=克朗
y1_zmiana=0
elif event.key==pygame.K_w:
x1_zmiana=0
y1_zmiana=-KROK
elif event.key==pygame.K_:
x1_zmiana=0
y1_zmiana=克朗
如果x1>=SZEROKOSC或x1=WYSOKOSC或y1返回一个具有曲面对象大小的矩形,但它返回一个始终从(0,0)开始的矩形,因为曲面对象没有位置。
使用
blit
功能将表面放置在显示屏上的某个位置

您必须设置矩形的位置,例如:

snake_rect.topleft=(x1-25,y1-25)
jablko_rect.toplight=(jablko_x,jablko_y)
如果snake_rect.Collide rect(jablko_rect):
打印(“Mniam!”)