|
|
8 months ago | |
|---|---|---|
| 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或-1,1向右,反之向左 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()