Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么If语句不能用于Python和Pygame_Python_If Statement_Pygame_Logic - Fatal编程技术网

为什么If语句不能用于Python和Pygame

为什么If语句不能用于Python和Pygame,python,if-statement,pygame,logic,Python,If Statement,Pygame,Logic,所以我创造了我的第一场比赛,我想用shelve追踪高分。我的逻辑是我有一个名为highscore的全局变量。在游戏开始时,在game_menu()中为其分配了highscore文件中的值。逻辑是,如果当前分数(道奇)大于highscore,则highscore文件将被分配道奇值,并显示在游戏菜单中。这在大多数情况下确实有效,但即使减淡变量小于highscore,它仍然会被分配给文件。就像游戏没有看到If语句一样。下面是游戏代码的重要部分 d = shelve.open("highscore.tx

所以我创造了我的第一场比赛,我想用shelve追踪高分。我的逻辑是我有一个名为highscore的全局变量。在游戏开始时,在game_menu()中为其分配了highscore文件中的值。逻辑是,如果当前分数(道奇)大于highscore,则highscore文件将被分配道奇值,并显示在游戏菜单中。这在大多数情况下确实有效,但即使减淡变量小于highscore,它仍然会被分配给文件。就像游戏没有看到If语句一样。下面是游戏代码的重要部分

d = shelve.open("highscore.txt")
highscore = d["highscore"]
d.close()

best_score(highscore)
在上面,我们将文件中的值分配给全局变量,并通过best_score显示

if dodged > highscore:
    d = shelve.open("highscore.txt")
    d["highscore"] = dodged
    d.close
这就是我认为问题所在。它清楚地说明了dodged是否更大,但即使它等于或更小,文件也会被dodged变量替换。我甚至试着加入ifesle,但没有任何效果

下面是游戏的完整代码

import pygame
import time
import random
import shelve

pygame.init()

display_width = 800
display_height = 600

black = (0,0,0)
red = (255,0,0)
dark_red = (200,0,0)
green = (0,255,0)
dark_green = (0,200,0)

awing_width = 95

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("Lonely ship")
clock = pygame.time.Clock()

background = pygame.image.load("space.jpg")

awingImg = pygame.image.load("A-wing.png")
awingImg = pygame.transform.scale(awingImg, (95,119))

asteroidImg  = pygame.image.load("AsteroidPNG.png")
asteroidImg = pygame.transform.scale(asteroidImg, (100,100))

def score(score):
    scoreFont = pygame.font.Font("freesansbold.ttf", 30)
    text = scoreFont.render("Dodged: "+str(score), True, red)
    gameDisplay.blit(text, (10,10))

def best_score(best_score):
    scoreFont = pygame.font.Font("freesansbold.ttf", 30)
    text = scoreFont.render("Highscore: "+str(best_score), True, red)
    gameDisplay.blit(text, (10,10))

def asteroid(asteroidx, asteroidy, asteroidw, asteroidh):
    gameDisplay.blit(asteroidImg, (asteroidx, asteroidy, asteroidw, asteroidh))

def awing(x,y):
    gameDisplay.blit(awingImg, (x,y))

def text_objects(text, font):
    textSurface = font.render(text, True, red)
    return textSurface, textSurface.get_rect()

def button_text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def message_display(text):
    largeText = pygame.font.Font("freesansbold.ttf", 50)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width/2), (display_height/2))
    gameDisplay.blit(TextSurf, TextRect)
    pygame.display.update()
    time.sleep(2)
    pygame.event.clear()
    game_menu()

def outOfBounds():
    message_display("You flew out of bounds!")

def crash():
    message_display("You crashed!")

def win():
    message_display("YOU WIN!!!")

def button(message,x,y,w,h,dc,bc,action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y+h > mouse [1] > y:
        pygame.draw.rect(gameDisplay, bc, (x,y,w,h))
        if click[0] == 1 and action != None:
            if action == "play":
                game_loop()
            elif action == "quit":
                pygame.quit()
                quit()
    else:     
        pygame.draw.rect(gameDisplay, dc, (x,y,w,h))

    smallText = pygame.font.Font("freesansbold.ttf", 20)
    textSurf, textRect = button_text_objects(message, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    gameDisplay.blit(textSurf, textRect)

global highscore

def game_menu():

    intro = True

    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()


        gameDisplay.blit(background, (0,0))


        d = shelve.open("highscore.txt")
        highscore = d["highscore"]
        d.close()

        best_score(highscore)

        largeText = pygame.font.Font("freesansbold.ttf", 50)
        TextSurf, TextRect = text_objects("Lonely Ship", largeText)
        TextRect.center = ((display_width/2), (display_height/2))
        gameDisplay.blit(TextSurf, TextRect)

        button("Play", 200, 400, 100, 50, dark_green,green, "play")
        button("Quit", 500, 400, 100, 50, dark_red,red, "quit")


        pygame.display.update()
        clock.tick(15)

def game_loop():
    x = (display_width * 0.425)
    y = (display_height * 0.75)

    x_change = 0

    asteroid_startx = random.randrange(0, display_width)
    asteroid_starty = -600
    asteroid_speed = 5
    asteroid_width = 100
    asteroid_height = 100

    dodged = 0
    gameExit = False

    while not gameExit:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_change += -10
                elif event.key == pygame.K_RIGHT:
                    x_change += 10

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:   
                    x_change += 10
                elif event.key == pygame.K_RIGHT:
                    x_change += -10

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    game_menu()

        x += x_change


        gameDisplay.blit(background, (0,0))

        asteroid(asteroid_startx, asteroid_starty, asteroid_width, asteroid_height)
        asteroid_starty += asteroid_speed
        awing(x,y)
        score(dodged)

        if x > display_width - awing_width or x < 0:
            outOfBounds()

        if asteroid_starty > display_height:
           asteroid_starty = 0 - asteroid_height
           asteroid_startx = random.randrange(0, display_width)
           dodged += 1
           asteroid_speed += 0.5

        if dodged > highscore:
           d = shelve.open("highscore.txt")
           d["highscore"] = dodged
           d.close



        if y < asteroid_starty + asteroid_height:
            print("y crossover")

            if x > asteroid_startx and x < asteroid_startx + asteroid_width or x + awing_width > asteroid_startx and x + awing_width < asteroid_startx + asteroid_width:
                print("x crossover")
                crash()

            if dodged >= 50:
               d = shelve.open("highscore.txt")
               d["highscore"] = 0
               d.close
               win()

        pygame.display.update()
        clock.tick(60)

game_menu()
game_loop()
pygame.quit()
quit()
导入pygame
导入时间
随机输入
进口货架
pygame.init()
显示宽度=800
显示高度=600
黑色=(0,0,0)
红色=(255,0,0)
深红色=(200,0,0)
绿色=(0255,0)
深绿色=(0200,0)
awing_宽度=95
gameDisplay=pygame.display.set_模式((显示宽度、显示高度))
pygame.display.set_标题(“孤独的船”)
clock=pygame.time.clock()
background=pygame.image.load(“space.jpg”)
awingImg=pygame.image.load(“A-wing.png”)
awingImg=pygame.transform.scale(awingImg,(95119))
asteroidImg=pygame.image.load(“AsteroidPNG.png”)
asteroidImg=pygame.transform.scale(asteroidImg,(100100))
def分数(分数):
scoreFont=pygame.font.font(“freesansbold.ttf”,30)
text=scoreFont.render(“减淡:+str(分数),真,红色)
blit(文本,(10,10))
def最佳评分(最佳评分):
scoreFont=pygame.font.font(“freesansbold.ttf”,30)
text=scoreFont.render(“高分:+str(最佳分数),真,红色)
blit(文本,(10,10))
def小行星(小行星X、小行星Y、小行星W、小行星H):
blit(asteroidImg,(asteroidx,asteroidy,asteroidw,asteroidh))
def awing(x,y):
游戏显示.blit(awingImg,(x,y))
def text_对象(文本、字体):
textSurface=font.render(文本,真,红色)
返回textSurface,textSurface.get_rect()
def按钮\文本\对象(文本、字体):
textSurface=font.render(文本,真,黑色)
返回textSurface,textSurface.get_rect()
def信息_显示(文本):
largeText=pygame.font.font(“freesansbold.ttf”,50)
TextSurf,TextRect=text\u对象(text,largeText)
text rect.center=((显示宽度/2),(显示高度/2))
blit(TextSurf,TextRect)
pygame.display.update()
时间。睡眠(2)
pygame.event.clear()
游戏菜单()
def outOfBounds():
信息显示(“你飞出了边界!”)
def crash():
显示消息(“您崩溃了!”)
def win():
信息显示(“您赢了!!!”)
def按钮(消息,x,y,w,h,dc,bc,操作=无):
mouse=pygame.mouse.get_pos()
click=pygame.mouse.get_pressed()
如果x+w>鼠标[0]>x和y+h>鼠标[1]>y:
pygame.draw.rect(游戏显示,bc,(x,y,w,h))
如果单击[0]==1并执行操作!=无:
如果动作==“播放”:
博弈(循环)
elif操作==“退出”:
pygame.quit()
退出
其他:
pygame.draw.rect(游戏显示,dc,(x,y,w,h))
smallText=pygame.font.font(“freesansbold.ttf”,20)
textSurf,textRect=按钮\文本\对象(消息,smallText)
textRect.center=((x+(w/2)),(y+(h/2)))
blit(textSurf,textRect)
全球高分
def game_菜单():
简介=正确
而简介:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
退出
游戏显示.blit(背景,(0,0))
d=搁置.open(“highscore.txt”)
highscore=d[“highscore”]
d、 关闭()
最佳成绩(高分)
largeText=pygame.font.font(“freesansbold.ttf”,50)
TextSurf,TextRect=text_对象(“孤独的船”,largeText)
text rect.center=((显示宽度/2),(显示高度/2))
blit(TextSurf,TextRect)
按钮(“播放”,200,400,100,50,深绿色,绿色,“播放”)
按钮(“退出”,500,400,100,50,深红色,红色,“退出”)
pygame.display.update()
时钟滴答(15)
def game_loop():
x=(显示宽度*0.425)
y=(显示高度*0.75)
x_变化=0
小行星_startx=随机。随机范围(0,显示宽度)
小行星_星体=-600
小行星速度=5
小行星宽度=100
小行星高度=100
减淡=0
gameExit=False
不退出游戏时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
退出
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
x_变化+=-10
elif event.key==pygame.K_RIGHT:
x_变化+=10
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_左:
x_变化+=10
elif event.key==pygame.K_RIGHT:
x_变化+=-10
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_退出:
游戏菜单()
x+=x_变化
游戏显示.blit(背景,(0,0))
小行星(小行星星体X、小行星星体Y、小行星宽度、小行星高度)
小行星星体+=小行星速度
awing(x,y)
得分(闪避)
如果x>display_width-awing_width或x<0:
边界外()
如果小行星>显示高度:
小行星星体=0-小行星高度
小行星_startx=随机。随机范围(0,显示宽度)
减淡+=1
ast
0 > '0' // false
highscore = int(d["highscore"])