Python Pygame崩溃时,包含代码时打开

2024-06-12 14:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的第一个问题,但我有点迷路了,所以我想知道是否有人能告诉我为什么它会崩溃。我对python相当陌生(尽管我用其他语言编写了很多其他代码)。所以我的pygame基本上是一个猫捉老鼠的游戏,白色是猫,黑色是老鼠。。。你明白了。唯一的问题是,当我打开它时,我看到blit文本大约一秒钟,然后它崩溃了。我尝试了很多次查看代码,但都没有结果,所以如果有人能帮我查看一下,我将不胜感激(我可能错过了一些愚蠢的事情,比如不正确的缩进)

import pygame
import random
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
Green= (0,225,0)

pygame.init()
windowSurface=pygame.display.set_mode((1000,1000))
pygame.display.set_caption("1st PyGame")
clock = pygame.time.Clock();
counter, text = 60, '60'.rjust(3)
pygame.time.set_timer(pygame.USEREVENT, 1000)
font = pygame.font.SysFont('Consolas', 30)


exit = False
xcord=250
ycord=250
xchange=0
ychange=0
xCord=750
yCord=750
xChange=0
yChange=0
while not exit:
    windowSurface.fill((255,0,0))
    text='Cat And Mouse !!!White=Cat(arrow-keys) Black=Mouse(wasd)!!! White Wins By Catching Black But If Black Lasts A Minute Then Black Wins!!!'
    windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 500))
    pygame.display.flip()
    time.sleep(15)
    text='Get Ready Game Starts In 15 Seconds'
    windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 500))
    clock.tick(60)
    time.sleep(15)
    start_ticks=pygame.time.get_ticks()
    seconds=(pygame.time.get_ticks()-start_ticks)/1000
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit=True
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                xChange-=10
                yChange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_LEFT:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_RIGHT:
                xChange+=10
                yChange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_RIGHT:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_UP:
                xChange+=0
                yChange-=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_UP:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_DOWN:
                xChange+=0
                yChange+=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_DOWN:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_a:
                xchange-=10
                ychange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_a:
                xchange=0
                ychange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_d:
                xchange+=10
                ychange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_d:
                xchange=0
                ychange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_w:
                xchange+=0
                ychange-=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_w:
                xchange=0
                ychange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_s:
                xchange+=0
                ychange+=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_s:
                xchange=0
                ychange=0
    crashxCord1=xCord+10
    crashxCord2=xCord-10
    crashyCord1=yCord+10
    crashyCord2=yCord-10


    for e in pygame.event.get():
        if e.type==pygame.USEREVENT: 
            counter-=1
            text=str(counter).rjust(3) if counter > 0 else 'Black Wins'
        if e.type==pygame.QUIT: break
    else:
        if text=='Black Wins':
            windowSurface.fill(0,0,0)
            screen.blit(font.render(text, True, (0, 255, 0)), (500, 100))
            pygame.display.flip()
            clock.tick(60)
            time.sleep(10)
            exit=True
        else:
            screen.blit(font.render(text, True, (0, 255, 0)), (500, 100))
            pygame.display.flip()
            clock.tick(60)


    if crashxCord1<=xcord and crashxCord2>=xcord and crashyCord1<=ycord and crashyCord2>=ycord:
        text='White Wins'
        windowSurface.fill(255,255,255)
        screen.blit(font.render(text, True, (0, 255, 0)), (500, 100))
        pygame.display.flip()
        clock.tick(60)
        time.sleep(10)
        exit=True
    pygame.display.update()
    xcord+=xchange
    ycord+=ychange
    xCord+=xChange
    yCord+=yChange
    windowSurface.fill(red)
    pygame.draw.rect(windowSurface, black, ([xcord,ycord,20,20]))
    pygame.draw.rect(windowSurface, white, ([xCord,yCord,20,20]))
    clock.tick(60)
    pygame.display.update()

Tags: keytexteventtrueiftimetypedisplay
1条回答
网友
1楼 · 发布于 2024-06-12 14:28:41

你犯了一个很小但致命的错误。你忘记导入时间模块了

import time

将这一行直接放在import pygame之后,这将解决您的第一个问题

下一个问题是,在每帧中都会导致time.sleep。当你打开一个pygame窗口时,你永远不会想要时间。睡眠呼叫。如果此时用户与窗口进行任何交互,程序将变得无响应,并崩溃。我创建了一个小函数,并用延迟替换它,这样用户可以在暂停时与屏幕交互

这是许多小事情之一,将导致一个新的pygame开发人员撕掉你所有的头发

我建议大家阅读一下这本书: http://www.apress.com/gp/book/9781590598726

它解释了所有Pygame惯例和标准。这是我用来开始Pygame开发的书

你的碰撞检测很难被击中。这只猫必须正好在老鼠的顶端才能获胜。如果这是您想要的,这是您的工作代码。如果你只想触摸,说这个词,我会告诉你怎么做

代码如下:

import pygame
import random
import time
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
Green= (0,225,0)

pygame.init()
windowSurface=pygame.display.set_mode((1000,1000))
pygame.display.set_caption("1st PyGame")
clock = pygame.time.Clock();
counter, text = 60, '60'.rjust(3)
pygame.time.set_timer(pygame.USEREVENT, 1000)
font = pygame.font.SysFont('Consolas', 30)


exit = False
xcord=250
ycord=250
xchange=0
ychange=0
xCord=750
yCord=750
xChange=0
yChange=0

def create_delay(delay):
    start = time.time()
    while time.time() - start < delay:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()

windowSurface.fill((255,0,0))
text='Cat And Mouse !!!White=Cat(arrow-keys) Black=Mouse(wasd)!!! White Wins By Catching Black But If Black Lasts A Minute Then Black Wins!!!'
windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 500))
pygame.display.flip()
create_delay(1)
text='Get Ready Game Starts In 15 Seconds'
windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 500))
clock.tick(60)
create_delay(1)

while not exit:

    start_ticks=pygame.time.get_ticks()
    seconds=(pygame.time.get_ticks()-start_ticks)/1000
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            exit=True
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                xChange-=10
                yChange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_LEFT:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_RIGHT:
                xChange+=10
                yChange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_RIGHT:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_UP:
                xChange+=0
                yChange-=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_UP:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_DOWN:
                xChange+=0
                yChange+=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_DOWN:
                xChange=0
                yChange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_a:
                xchange-=10
                ychange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_a:
                xchange=0
                ychange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_d:
                xchange+=10
                ychange+=0
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_d:
                xchange=0
                ychange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_w:
                xchange+=0
                ychange-=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_w:
                xchange=0
                ychange=0
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_s:
                xchange+=0
                ychange+=10
        elif event.type==pygame.KEYUP:
            if event.key==pygame.K_s:
                xchange=0
                ychange=0
    crashxCord1=xCord+10
    crashxCord2=xCord-10
    crashyCord1=yCord+10
    crashyCord2=yCord-10

    for e in pygame.event.get():
        if e.type==pygame.USEREVENT: 
            counter-=1
            text=str(counter).rjust(3) if counter > 0 else 'Black Wins'
        if e.type==pygame.QUIT: break
    else:
        if text=='Black Wins':
            windowSurface.fill(0,0,0)
            windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 100))
            pygame.display.flip()
            clock.tick(60)
            time.sleep(10)
            exit=True
        else:
            windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 100))
            pygame.display.flip()
            clock.tick(60)

    if crashxCord1<=xcord and crashxCord2>=xcord and crashyCord1<=ycord and crashyCord2>=ycord:
        text='White Wins'
        windowSurface.fill(255,255,255)
        windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 100))
        pygame.display.flip()
        clock.tick(60)
        time.sleep(10)
        exit=True

    pygame.display.update()
    xcord+=xchange
    ycord+=ychange
    xCord+=xChange
    yCord+=yChange
    windowSurface.fill(red)
    pygame.draw.rect(windowSurface, black, ([xcord,ycord,20,20]))
    pygame.draw.rect(windowSurface, white, ([xCord,yCord,20,20]))
    clock.tick(60)
    pygame.display.update()

第一次尝试很好! 希望这有帮助,祝Pygame好运

[编辑]

为了让用户在两个矩形接触时获胜,我对鼠标的每个角落都使用了collidepoint函数。此函数用于检测指定点是否位于矩形对象内

移动每个矩形后,此部分即开始:

windowSurface.fill(red)
cat = pygame.draw.rect(windowSurface, black, ([xcord,ycord,20,20]))
mouse = pygame.draw.rect(windowSurface, white, ([xCord,yCord,20,20]))

if cat.collidepoint(xCord, yCord) or cat.collidepoint(xCord + 20, yCord) or cat.collidepoint(xCord, yCord + 20) or cat.collidepoint(xCord+20, yCord+20):
    text='White Wins'
    windowSurface.fill((255,255,255))
    windowSurface.blit(font.render(text, True, (0, 255, 0)), (500, 100))
    pygame.display.flip()
    clock.tick(60)
    create_delay(10)
    exit=True
    continue

clock.tick(60)

如果你需要额外的帮助,请不要犹豫

相关问题 更多 >