首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快节奏射击(30秒)

快节奏射击(30秒)
EN

Code Review用户
提问于 2017-02-13 14:28:52
回答 1查看 150关注 0票数 6

一个快节奏的射手,计算和显示你的死亡。如果要复制和粘贴此代码,也要复制图像并将其保存为包含代码中名称的png文件。

代码语言:javascript
复制
import pygame
import time
import random
import timeit


pygame.init()

display_width = 1600
display_height = 850
speed = [1, -1]

black = (0,0,0)
white = (255,255,255)
red = (255, 0, 0)
grey = (177,177,177)
blue = (0,0,255)
green = (0,255,0)

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Kill hitler before he gets trump')

clock = pygame.time.Clock()

crosshairImg = pygame.image.load('crosshair.PNG')
hitlerImg = pygame.image.load('hitler.png')
donaldImg = pygame.image.load('donald.png')

def crosshair(x, y):
    gameDisplay.blit(crosshairImg, (x,y))

def enemy(x, y):
    gameDisplay.blit(hitlerImg, (x,y))

def friendly(x, y):
    gameDisplay.blit(donaldImg, (x,y))
def message_display(text):
    largeText = pygame.font.Font('freesansbold.ttf',45)
    TextSurf, TextRect = text_objects(text, largeText)
    TextRect.center = ((display_width/2),(display_height/2))
    gameDisplay.blit(TextSurf, TextRect)

    pygame.display.update()

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

def status(total, enemy_kills):
    if total == 0:
        status = 0
    else:
        status = round((enemy_kills/total)*100, 2)

    font = pygame.font.SysFont(None, 25)
    text = font.render('Status:'+str(status)+'%', True, blue)
    gameDisplay.blit(text,(0,30))

def score(count):
    font = pygame.font.SysFont(None,25)
    text = font.render('Confirmed Enemy Kills:'+str(count), True, blue)
    gameDisplay.blit(text,(0,0))

def timer(count):
    count = round(count, 1)
    font = pygame.font.SysFont(None,25)
    text = font.render('time left:'+str(count), True, blue)
    gameDisplay.blit(text,(0,45))

def friend_kill(count):
    font = pygame.font.SysFont(None,25)
    text = font.render('Confirmed Friendly Kills:'+str(count), True, blue)
    gameDisplay.blit(text,(0,15))

def gameloop():
    thing_startx = (display_width/2)
    thing_starty = (display_height/2)
    thing_xspeed = 0
    thing_yspeed = 0

    enemy_startx = random.randrange(0, (display_width-20))
    enemy_starty = random.randrange(0, (display_height-20))
    enemy_xspeed = 0
    enemy_yspeed = 0

    friend_startx = random.randrange(0, (display_width-40))
    friend_starty = random.randrange(0, (display_height-40))
    friend_width = 40
    friend_height = 40
    friend_xspeed = 0
    friend_yspeed = 0

    ammo = 5

    kills = 0

    total_kills = 0

    friendly_kills = 0

    gameExit = False

    start = time.time()

    elapsed = 0

    while not gameExit and elapsed < 30:

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

            if event.type == pygame.MOUSEMOTION:
                thing_startx = event.pos[0]-37
                thing_starty = event.pos[1]-37

        thing_startx += thing_xspeed
        thing_starty += thing_yspeed

        gameDisplay.fill (grey)
        score(kills)
        status(total_kills, kills)
        friend_kill(friendly_kills)
        timer((30-elapsed))

        enemy(enemy_startx, enemy_starty)
        friendly(friend_startx, friend_starty)
        crosshair(thing_startx, thing_starty)
        pygame.display.update()
        pygame.mouse.set_visible(0)

        if event.type == pygame.MOUSEBUTTONDOWN:
            if (event.pos[0] > enemy_startx and event.pos[0] < enemy_startx+45) and event.pos[1] > enemy_starty and event.pos[1] < enemy_starty+60:
                enemy_startx = random.randrange(0, (display_width-45))
                enemy_starty = random.randrange(0, (display_height-60))
                friend_startx = random.randrange(0,(display_width-40))
                friend_starty = random.randrange(0,(display_height-40))
                kills += 1
                total_kills += 1

        if event.type == pygame.MOUSEBUTTONDOWN:
            if (event.pos[0] > friend_startx and event.pos[0] < friend_startx+60) and event.pos[1] > friend_starty and event.pos[1] < friend_starty+80:
                friend_startx = random.randrange(0,(display_width-40))
                friend_starty = random.randrange(0,(display_height-40))
                enemy_startx = random.randrange(0, (display_width-45))
                enemy_starty = random.randrange(0, (display_height-60))
                friendly_kills += 1
                total_kills += 1
                message_display('you killed a friendly')
                time.sleep(1)

        if (kills>=5 and kills<10) or (kills>=15 and kills<20):
            if enemy_startx+45<display_width and enemy_xspeed not in (1, -1):
                enemy_xspeed += 1
            if friend_startx+60<display_width and friend_xspeed not in (1,-1):
                friend_xspeed += 1

            if enemy_startx>0 and enemy_xspeed not in (-1, 0):
                enemy_xspeed = 1
            if friend_startx>0 and friend_xspeed not in (-1, 0):
                friend_xspeed = 1

        elif kills>=10 and kills<20:
            if enemy_starty+60<display_height and enemy_yspeed not in (1, -1):
                enemy_yspeed += 1
            if friend_starty+80<display_width and friend_yspeed not in (1,-1):
                friend_yspeed += 1

            if enemy_starty>0 and enemy_yspeed not in (-1, 0):
                enemy_yspeed = 1
            if friend_starty>0 and friend_yspeed not in (-1, 0):
                friend_yspeed = 1

        elif kills>=20:
            if enemy_startx+45<display_height and enemy_xspeed not in (2, -2):
                enemy_xspeed = 2
            if friend_startx+60<display_height and friend_xspeed not in (2, -2):
                friend_xspeed = 2

            if enemy_starty>0 and enemy_yspeed not in (2, -2):
                enemy_yspeed = -2
            if friend_starty>0 and friend_yspeed not in (2, -2):
                friend_yspeed = -2

        else:
            enemy_xspeed = 0
            enemy_yspeed = 0
            friend_xspeed = 0
            friend_yspeed = 0

        if enemy_startx+45>display_width or enemy_startx<0:
            enemy_xspeed *= -1
        if enemy_starty+60>display_height or enemy_starty<0:
            enemy_yspeed *= -1

        if friend_startx+40>display_width or friend_startx<0:
            friend_xspeed *= -1
        if friend_starty+40>display_height or friend_starty<0:
            friend_yspeed *= -1            

        enemy_starty += enemy_yspeed        
        enemy_startx += enemy_xspeed
        friend_startx += friend_xspeed
        friend_starty += friend_yspeed

        pygame.display.update()
        clock.tick(100)
        elapsed = time.time() - start
        msg = 'you got',kills,'enemy kills amd',friendly_kills,'enemy kills'
    message_display('you got '+str(kills)+' enemy kills and '+str(friendly_kills)+' friendly kills')
    time.sleep(2)
    gameloop()

gameloop()
EN

回答 1

Code Review用户

发布于 2017-09-01 04:30:29

风格

PEP8要求在标识符中使用下划线,例如donald_img

friendly()message_display()之间引入一些垂直空间是有帮助的。PEP8要求2行空白行。

在一些冗长的条件词中,例如if (event.pos[0] > enemy_startx ...,您有机会利用打开的paren,因此您可以将条件分解为多行,每一行最多80个字符。

def ()

即使是在游戏中,也习惯于确保foo.py可以安全地导入(import foo),而不会产生不幸的副作用,并且不会污染全局命名空间。这通常是通过在if __name__ == '__main__':下调用的main()中的顶级语句来实现的。从pygame.init()到加载donald.png的语句将从移动到main()中受益。如果这些标识符确实需要在全局名称空间中,那么像DONALD_IMG这样的名称就更合适了。

提升常数

status()中,字体分配应该是一次性的全局赋值.哦,等等,我在几种方法中都看到了。我只是想说,也许评估SysFont()比您想要的更昂贵,而且您更愿意只做一次。

表示二维

对于朋友和敌人,有许多平行的X&Y量。这意味着将数量建模为(x,y)或(x_speed,y_speed)元组。

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

https://codereview.stackexchange.com/questions/155232

复制
相关文章

相似问题

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