加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

pygame squirrel

发布时间:2020-12-17 17:23:58 所属栏目:Python 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import pygame,sys,time,math,randomfrom pygame.locals import*FPS = 30winx = 640winy = 480halfx = winx/2halfy = winy/2grasscolor = (24,255,0)w

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

import pygame,sys,time,math,random
from pygame.locals import*

FPS = 30
winx = 640
winy = 480
halfx = winx/2
halfy = winy/2

grasscolor = (24,255,0)
white = (255,255)
red = (255,0)

startsize = 25
left = 'left'
right = 'right'
squirrelnum = 30
minspeed = 3
maxspeed = 7
directfreq = 2
maxhealth = 3
intime = 2
numgrass = 80
cameraslack = 90
bouncerate = 6
bounceheight = 30
moverate = 9
winsize = 300
gameovertime = 4


def main():
    global fpsclock,disp,basicfont,limg,rimg,grassimg
    
    pygame.init()
    fpsclock = pygame.time.Clock()
    pygame.display.set_icon(pygame.image.load('gameicon.png'))
    disp = pygame.display.set_mode((winx,winy))
    pygame.display.set_caption('squirrel')
    basicfont = pygame.font.Font('freesansbold.ttf',32)

    limg = pygame.image.load('squirrel.png')
    rimg = pygame.transform.flip(limg,True,False)
    grassimg = []
    for i in range(1,5):
        grassimg.append(pygame.image.load('grass%s.png'%i))
    while True:
        rungame()
        
def rungame():
    invulnerablemode = False
    invulnerablestarttime = 0
    gameovermode = False
    gameoverstarttime = 0
    winmode = False

    gameoversurf = basicfont.render('Game Over',white)
    gameoverrect = gameoversurf.get_rect()
    gameoverrect.center = (halfx,halfy)

    winsurf = basicfont.render('you have achieved omega squirrel.',white)
    winrect = winsurf.get_rect()
    winrect.center = (halfx,halfy)

    winsurf2 = basicfont.render('Press r to restart.',white)
    winrect2 = winsurf2.get_rect()
    winrect2.center = (halfx,halfy + 30)

    camerax = 0
    cameray = 0
    
    grassobj = []
    squirrelobj = []

    playerobj = {'surface': pygame.transform.scale(limg,(startsize,startsize)),'facing':left,'size':startsize,'x': halfx,'y': halfy,'bounce':0,'health':maxhealth}

    moveleft = False
    moveright = False
    moveup = False
    movedown = False

    for i in range(10):
        grassobj.append(makenewgrass(camerax,cameray))
        grassobj[i]['x'] = random.randint(0,winx)
        grassobj[i]['y'] = random.randint(0,winy)
    
    while True:
        if invulnerablemode and time.time()-invulnerablestarttime>intime:
            invulnerablemode = False

        for sobj in squirrelobj:
            sobj['x'] += sobj['movex']
            sobj['y'] +=sobj['movey']
            sobj['bounce'] +=1
            if sobj['bounce'] >sobj['bouncerate']:
                sobj['bounce'] = 0

            if random.randint(0,99)<directfreq:
                sobj['movex'] = getrandomvelocity()
                sobj['movey'] = getrandomvelocity()
                if sobj['movex'] > 0:
                    sobj['surface'] = pygame.transform.scale(rimg,(sobj['width'],sobj['height']))
                else:
                    sobj['surface'] = pygame.transform.scale(limg,sobj['height']))

        for i in range(len(grassobj)-1,-1,-1):
            if outsidearea(camerax,cameray,grassobj[i]):
                del grassobj[i]
        for i in range(len(squirrelobj)-1,squirrelobj[i]):
                del squirrelobj[i]

        while len(grassobj)<numgrass:
            grassobj.append(makenewgrass(camerax,cameray))
        while len(squirrelobj)<squirrelnum:
            squirrelobj.append(makenewsquirrel(camerax,cameray))

        playercenterx = playerobj['x']+int(playerobj['size']/2)
        playercentery = playerobj['y']+int(playerobj['size']/2)

        if (camerax+halfx) - playercenterx >cameraslack:
            camerax = playercenterx + cameraslack - halfx
        elif playercenterx - (camerax + halfx)>cameraslack:
            camerax = playercenterx - cameraslack - halfx
        if (cameray+halfy)-playercentery > cameraslack:
            cameray = playercentery + cameraslack-halfy
        elif playercentery-(cameray+halfy)>cameraslack:
            cameray = playercentery-cameraslack-halfy

        disp.fill(grasscolor)

        for gobj in grassobj:
            grect = pygame.Rect((gobj['x']-camerax,gobj['y']-cameray,gobj['width'],gobj['height']))
            disp.blit(grassimg[gobj['grassimage']],grect)

        for sobj in squirrelobj:
            sobj['rect'] = pygame.Rect((sobj['x']-camerax,sobj['y']-cameray-getbounceamount(sobj['bounce'],sobj['bouncerate'],sobj['bounceheight']),sobj['width'],sobj['height']))
            disp.blit(sobj['surface'],sobj['rect'])

        flashison = round(time.time(),1)*10%2 == 1
        if not gameovermode and not (invulnerablemode and flashison):
            playerobj['rect'] = pygame.Rect((playerobj['x']-camerax,playerobj['y']-cameray-getbounceamount(playerobj['bounce'],bouncerate,bounceheight),playerobj['size'],playerobj['size']))
            disp.blit(playerobj['surface'],playerobj['rect'])
            
        drawhealth(playerobj['health'])

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

            elif event.type ==KEYDOWN:
                if event.key in (K_UP,K_w):
                    movedown = False
                    moveup = True
                elif event.key in (K_DOWN,K_s):
                    moveup = False
                    movedown = True
                elif event.key in (K_LEFT,K_a):
                    moveright = False
                    moveleft = True
                    if playerobj['facing'] !=right:
                        playerobj['surface'] = pygame.transform.scale(limg,(playerobj['size'],playerobj['size']))
                    playerobj['facing'] = left                    
                elif event.key in (K_RIGHT,K_d):
                    moveleft = False
                    moveright = True
                    if playerobj['facing'] !=right:
                        playerobj['surface'] = pygame.transform.scale(rimg,playerobj['size']))
                    playerobj['facing'] = left
                elif winmode and event.key ==K_r:
                    return
            elif event.type ==KEYUP:
                if event.key in (K_LEFT,K_a):
                    moveleft = False
                elif event.key in (K_DOWN,K_s):
                    movedown = False       
                elif event.key in (K_UP,K_w):
                    moveup = False
                elif event.key in (K_RIGHT,K_d):
                    moveright = False
                elif event.key == K_ESCAPE:
                    terminal()
        if not gameovermode:
            if moveleft:
                playerobj['x'] -=moverate
            if moveright:
                playerobj['x'] +=moverate
            if moveup:
                playerobj['y'] -=moverate
            if movedown:
                playerobj['y'] +=moverate

            if (moveleft or moveright or moveup or movedown) or playerobj['bounce']!=0:
                playerobj['bounce'] +=1
            if playerobj['bounce'] >bouncerate:
                playerobj['bounce'] = 0

            for i in range(len(squirrelobj)-1,-1):
                sqobj = squirrelobj[i]
                if 'rect' in sqobj and playerobj['rect'].colliderect(sqobj['rect']):
                    
                    if sqobj['width']*sqobj['height']<=playerobj['size']**2:
                        playerobj['size'] +=int((sqobj['width']*sqobj['height'])**0.2)+1
                        del squirrelobj[i]

                        if playerobj['facing']==left:
                            playerobj['surface'] = pygame.transform.scale(limg,playerobj['size']))
                        if playerobj['facing']==right:
                            playerobj['surface'] = pygame.transform.scale(rimg,playerobj['size']))      
                        if playerobj['size']>winsize:
                            winmode = True
                            
                    elif not invulnerablemode:
                        invulnerablemode = True
                        invulnerablestarttime = time.time()
                        playerobj['health'] -= 1
                        if playerobj['health'] == 0:
                            gameovermode = True
                            gameoverstarttime = time.time()
        else:
            disp.blit(gameoversurf,gameoverrect)
            if time.time()-gameoverstarttime>gameovertime:
                return


        if winmode:
            disp.blit(winsurf,winrect)
            disp.blit(winsurf2,winrect2)
        pygame.display.update()
        fpsclock.tick(FPS)
            
def drawhealth(currenthealth):
    for i in range(currenthealth):
        pygame.draw.rect(disp,red,(15,5+(10*maxhealth)-i*10,20,10))
    for i in range(maxhealth):
        pygame.draw.rect(disp,white,10),1)
        
def terminal():
    pygame.quit()
    sys.exit()

def getbounceamount(currentbounce,bounceheight):
    return int(math.sin((math.pi/float(bouncerate))*currentbounce)*bounceheight)

def getrandompos(camerax,objwidth,objheight):
    camerarect = pygame.Rect(camerax,winx,winy)
    while True:
        x = random.randint(camerax - winx,camerax + 2*winx)
        y = random.randint(cameray - winy,cameray + 2*winy)

        objrect = pygame.Rect(x,y,objheight)
        if not objrect.colliderect(camerarect):
            return x,y
        
def makenewgrass(camerax,cameray):
    gr = {}
    gr['grassimage'] = random.randint(0,len(grassimg)-1)
    gr['width'] = grassimg[0].get_width()
    gr['height'] = grassimg[0].get_height()
    gr['x'],gr['y'] = getrandompos(camerax,gr['width'],gr['height'])
    gr['rect'] = pygame.Rect((gr['x'],gr['y'],gr['height']))
    return gr

def getrandomvelocity():
    speed = random.randint(minspeed,maxspeed)
    if random.randint(0,1)== 0:
        return speed
    else:
        return -speed
    
def makenewsquirrel(camerax,cameray):
    sq = {}
    generalsize = random.randint(5,25)
    multiplier = random.randint(1,3)
    sq['width'] = (generalsize +random.randint(0,10))*multiplier
    sq['height'] = (generalsize +random.randint(0,10))*multiplier
    sq['x'],sq['y'] = getrandompos(camerax,sq['width'],sq['height'])
    sq['movex'] = getrandomvelocity()
    sq['movey'] = getrandomvelocity()
    if sq['movex']<0:
        sq['surface'] = pygame.transform.scale(limg,(sq['width'],sq['height']))
    else:
        sq['surface'] = pygame.transform.scale(rimg,sq['height']))
    sq['bounce'] = 0
    sq['bouncerate'] = random.randint(10,18)
    sq['bounceheight'] = random.randint(10,50)
    return sq
def outsidearea(camerax,obj):
    leftedge = camerax - winx
    rightedge = cameray - winy
    boundrect = pygame.Rect(leftedge,rightedge,winx*3,winy*3)
    objrect = pygame.Rect(obj['x'],obj['y'],obj['width'],obj['height'])
    return not boundrect.colliderect(objrect)

if __name__ =='__main__':
    main()
    

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读