首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python游戏在打开代码时崩溃

Python游戏在打开代码时崩溃
EN

Stack Overflow用户
提问于 2017-11-25 03:26:42
回答 1查看 76关注 0票数 0

因此,这是我的第一个问题,但我有点迷失了我的代码,所以我想知道是否有人可以告诉我,为什么它崩溃。我对python相当陌生(虽然我用其他语言编写了很多代码)。所以我的游戏基本上是猫和老鼠的游戏,白色是猫,黑色是老鼠.你明白了。唯一的问题是,当我打开它时,我看到blit文本大约一秒,然后它崩溃了,我试着查看了很多代码,但是都没有用,所以如果有人帮我查看它,我会非常感激的。(我可能漏掉了一些愚蠢的东西,比如错误的缩进)。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-25 04:39:18

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

代码语言:javascript
复制
import time

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

下一个问题是,您在每个帧中导致了一个time.sleep。当你打开一个游戏窗口时,你永远不想要一个time.sleep调用。如果在这段时间内,用户与窗口进行任何交互,程序将变得没有响应,并崩溃。我创建了一个小函数,并将其替换为延迟,这样用户就可以在暂停时与屏幕交互。

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

我建议把这本书读一读:http://www.apress.com/gp/book/9781590598726

它解释了所有的游戏惯例和标准。这是我以前开始玩游戏开发的书。

你的碰撞检测很难击中。这只猫一定是在老鼠的顶端才能赢。如果这是您想要的,这是您的工作代码。如果你只想触碰一下,说句话,我就教你怎么做。

以下是代码:

代码语言:javascript
复制
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()

好的,先试试吧!希望这能帮上忙,祝你玩游戏好运!

编辑

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

在移动每个矩形之后,这个部分就会出现:

代码语言:javascript
复制
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)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47482331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档