|
|
|
|
@ -1,4 +1,3 @@
|
|
|
|
|
# 3a3
|
|
|
|
|
#pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame
|
|
|
|
|
import pygame, sys, time, random
|
|
|
|
|
from pygame.locals import *
|
|
|
|
|
@ -6,7 +5,7 @@ FPS = 60
|
|
|
|
|
winwidth = 1200
|
|
|
|
|
winheight = 800
|
|
|
|
|
maxhealth = 8
|
|
|
|
|
basicspeed = 10
|
|
|
|
|
basicspeed = 7
|
|
|
|
|
createenemytime = 2
|
|
|
|
|
createbullettime = 0.2
|
|
|
|
|
enemybreadth = 30
|
|
|
|
|
@ -15,7 +14,9 @@ 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)
|
|
|
|
|
@ -25,9 +26,10 @@ black = (0, 0, 0)
|
|
|
|
|
yellow = (255, 255, 0)
|
|
|
|
|
|
|
|
|
|
bgcolor = white
|
|
|
|
|
enemybulletcolor = black
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
global moveright,moveleft,moveup,movedown,dissurf,bulletlist,enemylist,basicfont,\
|
|
|
|
|
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))
|
|
|
|
|
@ -55,6 +57,7 @@ def main():
|
|
|
|
|
attackflag = False
|
|
|
|
|
enemylist = []
|
|
|
|
|
bulletlist = []
|
|
|
|
|
enemybulletlist = []
|
|
|
|
|
attackstarttime = time.time()
|
|
|
|
|
bulletcreatecishu = 0
|
|
|
|
|
score = 0
|
|
|
|
|
@ -109,8 +112,10 @@ createbullet(playerobj['x']+playerobj['width']/2-3,playerobj['y']-playerobj['hei
|
|
|
|
|
bulletcreatecishu += 1
|
|
|
|
|
|
|
|
|
|
if not enemylist:
|
|
|
|
|
updateenemylist(enemylist,number = 20)
|
|
|
|
|
createfleet(enemylist)
|
|
|
|
|
n = random.randint(1,5)
|
|
|
|
|
guanqia = Guanqia(20)
|
|
|
|
|
enemybulletlist.clear()
|
|
|
|
|
eval(f'guanqia.guanqia{n}')(0.6,10)
|
|
|
|
|
|
|
|
|
|
enemylistfu = enemylist[:]
|
|
|
|
|
|
|
|
|
|
@ -128,7 +133,16 @@ createbullet(playerobj['x']+playerobj['width']/2-3,playerobj['y']-playerobj['hei
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
@ -141,12 +155,129 @@ createbullet(playerobj['x']+playerobj['width']/2-3,playerobj['y']-playerobj['hei
|
|
|
|
|
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
|
|
|
|
|
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(enemy):
|
|
|
|
|
'''
|
|
|
|
|
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 = (lx**2 + ly**2) ** (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():
|
|
|
|
|
@ -155,6 +286,7 @@ def reset():
|
|
|
|
|
level = 0
|
|
|
|
|
bulletlist.clear()
|
|
|
|
|
enemylist.clear()
|
|
|
|
|
enemybulletlist.clear()
|
|
|
|
|
playerobj['x'] = winwidth / 2 - playerwidth / 2
|
|
|
|
|
playerobj['y'] = winheight - playerheight
|
|
|
|
|
playerobj['health'] = maxhealth
|
|
|
|
|
@ -304,7 +436,11 @@ def createenemy():
|
|
|
|
|
'moveleft':False,
|
|
|
|
|
'health':enemymaxhealth,
|
|
|
|
|
'surf':pygame.image.load('敌人飞船.jpg'),
|
|
|
|
|
'score':100,}
|
|
|
|
|
'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,
|
|
|
|
|
@ -382,14 +518,16 @@ def allattack(enemy,bulletlist,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):
|
|
|
|
|
@ -428,4 +566,3 @@ def terminate():
|
|
|
|
|
sys.exit()
|
|
|
|
|
|
|
|
|
|
main()
|
|
|
|
|
|
|
|
|
|
|