You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
m5tajiz6o cff1bd2d0d
Update README.md
8 months ago
README.md Update README.md 8 months ago

README.md

#pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame import pygame, sys, time, random from pygame.locals import * FPS = 60 winwidth = 1200 winheight = 800 maxhealth = 8 basicspeed = 7 createenemytime = 2 createbullettime = 0.2 enemybreadth = 30 enemywidth = 40 enemyheight = 40 playerwidth = 40 playerheight = 40 enemymaxhealth = 2 enemybulletspeed = 4 enemybulletsize = 6 enemybulletgailv = 10#每一秒产生一个子弹的概率 #R G B red = (255, 0, 0) green = (0, 255, 0) blue = (0, 0, 255) white = (255,255,255) black = (0, 0, 0) yellow = (255, 255, 0)

bgcolor = white enemybulletcolor = black

def main(): global moveright,moveleft,moveup,movedown,dissurf,bulletlist,enemybulletlist,enemylist,basicfont,
bigfont,biggerfont,biggestfont,score,level,clock,playerobj pygame.init() dissurf = pygame.display.set_mode((winwidth,winheight)) clock = pygame.time.Clock() playerobj = {'surf':pygame.image.load('玩家飞船.jpg'), 'x':winwidth / 2 - playerwidth / 2 , 'y':winheight - playerheight, 'health':maxhealth,
'speed':basicspeed, 'width':playerwidth, 'height':playerheight, } playerobj['surf'] = pygame.transform.scale(playerobj['surf'],(playerwidth,playerheight)) jindutiao = JinzhiJindutiao(110,20,200,15,green,yellow,playerobj['health'],maxhealth) playerobj['healthjindutiao'] = jindutiao

basicfont = pygame.font.Font('freesansbold.ttf',8)
bigfont = pygame.font.Font('freesansbold.ttf',16)
biggerfont = pygame.font.Font('freesansbold.ttf',24)
biggestfont = pygame.font.Font('freesansbold.ttf',64)
moveright = False
moveleft = False
moveup = False
movedown = False
attackflag = False
enemylist = []
bulletlist = []
enemybulletlist = []
attackstarttime = time.time()
bulletcreatecishu = 0
score = 0
level = 0
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
        elif event.type == KEYDOWN:
            if event.key in (K_LEFT, K_a):
                moveleft = True 
            elif event.key in (K_RIGHT, K_d):
                moveright = True
            elif event.key in (K_UP, K_w):
                moveup = True
            elif event.key in (K_DOWN, K_s):
                movedown = True

            elif event.key == K_SPACE:
                attackflag = True
                attackstarttime = time.time()
                

        elif event.type == KEYUP:
            if event.key in (K_LEFT, K_a):
                moveleft = False 
            elif event.key in (K_RIGHT, K_d):
                moveright = False 
                playerobj['x'] += playerobj['speed']
            elif event.key in (K_UP, K_w):
                moveup = False 
            elif event.key in (K_DOWN, K_s):
                movedown = False
            elif event.key == K_SPACE:
                attackflag = False
                bulletcreatecishu = 0

                
                
    updateplayerlocation(playerobj)

    updatebulletlocation(bulletlist)

    playerrect = (playerobj['x'], playerobj['y'],playerobj['width'] , playerobj['height'])

    dealxiaoshi(bulletlist,enemylist)

    if attackflag:
        if time.time() - attackstarttime > createbullettime * bulletcreatecishu:          
            updatebulletlist(bulletlist,\

createbullet(playerobj['x']+playerobj['width']/2-3,playerobj['y']-playerobj['height']/2,6,6,8,cishu=1),number=1) bulletcreatecishu += 1

    if not enemylist:
        n = random.randint(1,5)
        guanqia = Guanqia(20)
        enemybulletlist.clear()
    eval(f'guanqia.guanqia{n}')(0.6,10)         

    enemylistfu = enemylist[:]

    dissurf.fill(bgcolor)

    for enemy in enemylistfu:
        enemyrect = pygame.Rect(enemy['x'],enemy['y'],enemy['width'],enemy['height'])
        for enemy1 in enemylistfu:
            enemy1rect = pygame.Rect(enemy1['x'],enemy1['y'],enemy1['width'],enemy1['height'])
            if enemyrect.colliderect(enemy1rect):
                flipmovelr(enemy)
                flipmovelr(enemy1)
                break

        updatefleet(enemy)
        allattack(enemy,bulletlist,playerobj)
        drawenemyhealth(enemy)
        if random.randint(1,6000) <= enemybulletgailv:
            appendenemybullet(enemy,playerobj)



    if enemybulletlist:
        updateenemybulletlocation()
        drawenemybullet()
        beibulletattack(playerobj)
     
    drawplayerhealth(playerobj)
    drawscore()
    
    dissurf.blit(playerobj['surf'], playerrect)


    drawenemyfleet(enemylist)
    drawbullets(bulletlist)

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

class Guanqia: def init(self,number): self.allnumber = number self.starttime = 0 self.bubianstarttime = time.time() self.cishu = 0 if random.randint(0,1) == 0: self.moveflag = 1#设置为1或-11向右反之向左 else: self.moveflag = -1

def guanqia1(self,jiangetime,lasttime):#无规律x坐标间隔时间相同出现敌人
    if time.time() - self.bubianstarttime <= lasttime:
        if time.time() - self.starttime > jiangetime:
            enemy = createenemy()
            enemy['y'] = enemybreadth
            enemy['x'] = random.randint(enemybreadth, winwidth-enemy['width']-enemybreadth)
            enemylist.append(enemy)
            self.starttime = time.time()

def guanqia2(self,jiangetime,lasttime):#从左右两边界生成,间隔时间相同
    if time.time() - self.bubianstarttime <= lasttime:
        if time.time() - self.starttime > jiangetime:
            enemy0, enemy1 = createenemy(), createenemy()
            enemy0['y'], enemy1['y'] = enemybreadth, enemybreadth
            enemy0['x'], enemy1['x'] = enemybreadth, winwidth-enemy1['width']-enemybreadth
            enemylist.append(enemy0)
            enemylist.append(enemy1)
            self.starttime = time.time()
        
def guanqia3(self,jiangetime,lasttime):#从中间成对出现,间隔时间相同
    if time.time() - self.bubianstarttime <= lasttime:
        if time.time() - self.starttime > jiangetime:
            enemy0, enemy1 = createenemy(), createenemy()
            enemy0['y'], enemy1['y'] = enemybreadth, enemybreadth
            enemy0['x'], enemy1['x'] = winwidth/2 - enemy0['width'] - enemybreadth/2, winwidth/2 + enemybreadth/2
            enemy0['moveleft'],enemy0['moveright'] = True, False
            enemy1['moveleft'],enemy1['moveright'] = False, True
            enemylist.append(enemy0)
            enemylist.append(enemy1)
            self.starttime = time.time()
    
def guanqia4(self,jiangetime,lasttime):#不会移动快速左右生成形成s形曲线
    if time.time() - self.bubianstarttime <= lasttime:
        breadth = 200
        if time.time() - self.starttime > jiangetime:
            enemy = createenemy()
            enemy['y'] = enemybreadth
            enemy['x'] = enemybreadth + self.cishu * breadth
            enemy['moveleft'] = False
            enemy['moveright'] = False
            if enemy['x'] + enemy['width'] + enemybreadth > winwidth:
                self.moveflag = -1
            elif enemy['x'] - enemybreadth < 0:
                self.moveflag = 1

            if self.moveflag == 1:
                self.cishu += 1
            elif self.moveflag == -1:
                self.cishu -= 1
                                 
            enemylist.append(enemy)
            self.starttime = time.time()

def guanqia5(self,jiangetime,lasttime):#一次性创建舰队
    if not enemylist:
        updateenemylist(enemylist,number = self.allnumber)
        createfleet(enemylist)

''' def controllevel(): if '''

def beibulletattack(playerobj): playerrect = pygame.Rect(playerobj['x'],playerobj['y'],playerobj['width'],playerobj['height']) for bullet in enemybulletlist: bulletrect = pygame.Rect(bullet['x'],bullet['y'],bullet['width'],bullet['height']) if bulletrect.colliderect(playerrect): playerobj['health'] -= 1 enemybulletlist.remove(bullet) if playerobj['health'] <= 0: showgameover()

def drawenemybullet(): for bullet in enemybulletlist: dissurf.blit(bullet['surf'], (bullet['x'], bullet['y']))

def updateenemybulletlocation(): for bullet in enemybulletlist: bullet['x'] += bullet['xspeed'] bullet['y'] += bullet['yspeed']

def appendenemybullet(enemy,playerobj): lx = playerobj['x'] - enemy['x'] ly = playerobj['y'] - enemy['y'] ls = (lx2 + ly2) ** (1/2) xspeed = enemy['bulletspeed'] * lx / ls yspeed = enemy['bulletspeed'] * ly / ls bullet = createenemybullet(enemy['x']+enemy['width']/2-3,enemy['y']+enemy['height']/2*3, enemy['bulletsize'],enemy['bulletsize'],enemy['bulletspeed'],black) bullet['xspeed'] = xspeed bullet['yspeed'] = yspeed enemybulletlist.append(bullet)

def createenemybullet(x,y,width,height,speed,color): bullet = {'x':x, 'y':y, 'width':width, 'height':height, 'speed':speed, 'xspeed':0, 'yspeed':0, 'surf':pygame.Surface((width,height)),} bullet['surf'].fill(color) return bullet

def reset(): global score,level,moveright,moveleft,moveup,movedown score = 0 level = 0 bulletlist.clear() enemylist.clear() enemybulletlist.clear() playerobj['x'] = winwidth / 2 - playerwidth / 2 playerobj['y'] = winheight - playerheight playerobj['health'] = maxhealth moveright,moveleft,moveup,movedown = False,False,False,False

def showgameover(): s = 0 buttonwidth = 150 buttonheight = 50 buttonrect = pygame.Rect(winwidth/2 - buttonwidth/2, winheight/2+200,buttonwidth,buttonheight) buttonfont = biggerfont.render('try again',True,black) breakflag = False while True: s += 1 if s <= 80: surf = pygame.font.Font('freesansbold.ttf',s).render('G A M E O V E R !',True,black) dissurf.fill(bgcolor) dissurf.blit(surf,(255,300))

    if s > 80:
        pygame.draw.rect(dissurf,blue,buttonrect)
        dissurf.blit(buttonfont,(buttonrect.x+25, buttonrect.y+10))

    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
        if event.type == MOUSEBUTTONUP:
            x, y = event.pos
            if buttonrect.collidepoint((x,y)):
                breakflag = True
    if breakflag:
        break
              
    pygame.display.update()
    clock.tick(FPS)
reset()

def drawplayerhealth(playerobj): playerobj['healthjindutiao'].presentshu = playerobj['health'] playerobj['healthjindutiao'].drawjindutiao(110,20) fontsurf=bigfont.render(f"health : {playerobj['health']} / {maxhealth}",True,black) dissurf.blit(fontsurf,(62,5))

def drawscore(): scorestr = "{:0>8}".format(score) lst = list(scorestr) lst.insert(-3,',') lst.insert(-7,',') scorestr = ''.join(lst) fontsurf=biggerfont.render(scorestr,True,black) dissurf.blit(fontsurf,(winwidth-135,5))

def drawenemyhealth(enemy): enemy['healthjindutiao'].presentshu = enemy['health'] enemy['healthjindutiao'].drawjindutiao(enemy['x']+enemy['width']/2,enemy['y']- enemy['healthjindutiao'].height-4) fontsurf=basicfont.render(f"{enemy['health']} / {enemymaxhealth}",True,black) dissurf.blit(fontsurf,(enemy['x']+enemy['width']/3,enemy['y']- enemy['healthjindutiao'].height*2-4))

class TimeJindutiao: def init(self,x,y,width,height,color,outcolor,lasttime,starttime):#x是进度条中点y是最底边 self.x, self.y = x, y self.shuzhibreadth = 10 self.pointlist=[(self.x-width/2,self.y-height),(self.x+width/2,self.y-height), (self.x+width/2,self.y),(self.x-width/2,self.y)] self.zongcishu = lasttime * FPS #运行这么多次绘制完进度条

    self.rect = pygame.Rect(self.x-width/2+1,self.y-height+1,0,height-2)
    self.color = color
    self.outcolor = outcolor
    self.width = width
    self.height = height

def drawjindutiao(self,x,y):#x是进度条中点y是最底边
    self.rect.x = x
    self.rect.y = y
    self.rect.width += (self.width-2) / self.zongcishu
    self.pointlist=[(x-self.width/2,y-self.height),(x+self.width/2,y-self.height),
                    (x+self.width/2,y),(x-self.width/2,y)]
    pygame.draw.rect(dissurf,self.color,self.rect)
    pygame.draw.lines(dissurf, self.outcolor, True, self.pointlist, width=1)

class JinzhiJindutiao: def init(self,x,y,width,height,color,outcolor,presentshu,allshu):#x是进度条中点y是最底边 self.x, self.y = x, y self.pointlist=[(self.x-width/2,self.y-height),(self.x+width/2,self.y-height), (self.x+width/2,self.y),(self.x-width/2,self.y)]

    self.rect = pygame.Rect(self.x-width/2+1,self.y-height+1,0,height-2)
    self.color = color
    self.outcolor = outcolor
    self.width = width
    self.height = height
    self.presentshu = presentshu
    self.allshu = allshu

def drawjindutiao(self,x,y):#x是进度条中点y是最底边
    self.rect.x = x - self.width/2 + 1
    self.rect.y = y - self.height + 1
    self.rect.width = (self.presentshu / self.allshu) * (self.width-2)
    self.pointlist=[(x-self.width/2,y-self.height),(x+self.width/2,y-self.height),
                    (x+self.width/2,y),(x-self.width/2,y)]
    pygame.draw.rect(dissurf,self.color,self.rect)
    pygame.draw.lines(dissurf, self.outcolor, True, self.pointlist, width=1)

def flipmovelr(enemy): if enemy['moveright']: enemy['moveright'] = False enemy['moveleft'] = True elif enemy['moveleft']: enemy['moveleft'] = False enemy['moveright'] = True

def updateplayerlocation(playerobj): if moveright and not moveleft: playerobj['x'] += playerobj['speed'] elif moveleft and not moveright: playerobj['x'] -= playerobj['speed'] if moveup and not movedown: playerobj['y'] -= playerobj['speed'] elif movedown and not moveup: playerobj['y'] += playerobj['speed']

def updatebulletlocation(bulletlist): for bullet in bulletlist: bullet['y'] -= bullet['speed']

def createenemy(): enemy = {'x':0, 'y':0, 'width':enemywidth, 'height':enemyheight, 'xspeed':1, 'yspeed':1, 'moveright':False, 'moveleft':False, 'health':enemymaxhealth, 'surf':pygame.image.load('敌人飞船.jpg'), 'score':100, 'attack':1, 'bulletspeed':enemybulletspeed, 'bulletsize':enemybulletsize, 'bulletcolor':enemybulletcolor,} enemy['surf'] = pygame.transform.scale(enemy['surf'],(enemywidth,enemyheight)) enemy['surf'] = pygame.transform.flip(enemy['surf'],False,True) jindutiao = JinzhiJindutiao(enemy['x']+enemy['width']/2,enemy['y']-2,enemy['width']/3*2,8, green,red,enemy['health'],enemymaxhealth) enemy['healthjindutiao'] = jindutiao if random.randint(0,1) == 0: enemy['moveleft'] = True else: enemy['moveright'] = True

return enemy

def updateenemylist(enemylist,number = 1,delflag = False,delnumber = 0): if not delflag: for i in range(number): enemylist.append(createenemy()) else: for i in range(delnumber): del enemylist[-1]

def updatebulletlist(bulletlist,bullet,number = 1,delflag = False,delnumber = 0): if not delflag: for i in range(number): bulletlist.append(bullet) else: for i in range(delnumber): del bulletlist[-1]

def createfleet(enemylist):#只在每次舰队刚开始出现时调用 xcishu = 0 ycishu = 0 for enemy in enemylist:
if enemybreadth + (enemy['width']+enemybreadth) * (xcishu + 1)<= winwidth: enemy['x'] = enemybreadth + (enemy['width'] + enemybreadth) * xcishu enemy['y'] = enemybreadth + (enemy['height'] + enemybreadth) * ycishu xcishu += 1 else: xcishu = 0 ycishu += 1 enemy['x'] = enemybreadth enemy['y'] = enemybreadth + (enemy['height'] + enemybreadth) * ycishu xcishu = 1

def updatefleet(enemy): enemy['y'] += enemy['yspeed'] if enemybreadth + enemy['width'] + enemy['x'] > winwidth: enemy['moveright'],enemy['moveleft'] = False,True elif enemy['x'] - enemybreadth < 0: enemy['moveright'],enemy['moveleft'] = True,False
if enemy['moveright'] and not enemy['moveleft']: enemy['x'] += enemy['xspeed'] elif enemy['moveleft'] and not enemy['moveright']: enemy['x'] -= enemy['xspeed']

def allattack(enemy,bulletlist,playerobj): global score enemyrect = pygame.Rect(enemy['x'],enemy['y'],enemy['width'],enemy['height']) for bullet in bulletlist: bulletrect = pygame.Rect(bullet['x'],bullet['y'],bullet['width'],bullet['height']) if enemyrect.colliderect(bulletrect): bullet['cishu'] -= 1 enemy['health'] -= 1 if bullet['cishu'] <= 0: bulletlist.remove(bullet) if enemy['health'] <= 0: enemylist.remove(enemy) score += enemy['score'] beiattack(enemy,playerobj)

def beiattack(enemy,playerobj): global score enemyrect = pygame.Rect(enemy['x'],enemy['y'],enemy['width'],enemy['height']) playerrect = pygame.Rect(playerobj['x'],playerobj['y'],playerobj['width'],playerobj['height']) if enemyrect.colliderect(playerrect): enemylist.remove(enemy) playerobj['health'] -= 1 score += enemy['score'] if playerobj['health'] <= 0: showgameover()

def dealxiaoshi(bulletlist,enemylist): for bullet in bulletlist: if bullet['cishu'] <= 0 or bullet['x'] > winwidth or
bullet['y']-bullet['height'] < 0: bulletlist.remove(bullet) for enemy in enemylist: if enemy['y'] > winheight: enemylist.remove(enemy)

def createbullet(x,y,width,height,speed,cishu=1):#cishu为剩余穿透次数 bullet = {'x':x, 'y':y, 'width':width, 'height':height, 'speed':speed, 'cishu':cishu, 'surf':pygame.Surface((width,height))} bullet['surf'].fill(red) return bullet

def drawenemyfleet(enemylist): for enemy in enemylist: dissurf.blit(enemy['surf'], (enemy['x'], enemy['y']))

def drawbullets(bulletlist): for bullet in bulletlist: dissurf.blit(bullet['surf'], (bullet['x'], bullet['y']))

def terminate(): pygame.quit() sys.exit()

main()