def Introduction():
print("单人模式*")
print("w/s/a/d控制移动,点击鼠标发射子弹--")
print("双人模式*")
print("w/s/a/d控制移动player1,点击z键发射子弹--")
print("i/k/j/l控制移动player2,点击m键发射子弹--")
Introduction()
temp=int(input('请输入1或2进行你的选择:单人模式‘1’or双人模式‘2’'))
import pygame
import math
import random
from pygame.locals import *
if temp==1:
#装修游戏页面
pygame.init() #初始化pygame模块
pygame.mixer.init() #pygame中音乐模块
arial18 = pygame.font.SysFont('arial',18, False, False)
pygame.display.set_caption("小鸟的战争之单人模式") #标题设置
width, height = 900,540
screen=pygame.display.set_mode((width, height)) #设置窗口大小
keys = [False, False, False, False] #按键初始化
playerpos=[200,100] #小鸟角色坐标,注意左上角坐标为0,0
acc=[0,0] #记录射击判断得分
Bullets=[] #跟踪箭头
badtimer=100 #坏蛋数量更新时间
badtimer1=0
badguys=[[900,100]]
healthvalue=220
#素材图片以及音乐的加载
player = pygame.image.load("bird.png") #小鸟
background= pygame.image.load("bg_image.png").convert() #背景图片返回一个surface对象,这个对象有一个blit方法
home= pygame.image.load("home-image.png") #基地
tree=pygame.image.load("home-tree.png")
Bullet= pygame.image.load("bullet.png") #子弹
badguyimg1= pygame.image.load("bad.png") #蝙蝠
badguyimg=badguyimg1
health = pygame.image.load("health.png")
youwin= pygame.image.load("win.png")
gameover = pygame.image.load("over.jpg")
pygame.mixer.music.load("TroubleMaker.mp3")
pygame.mixer.music.play(-1, 45.0)
pygame.mixer.music.set_volume(0.25)
#运行时running=1
running = 1
exitcode = 0
while running:
badtimer-=1
screen.blit(background,(0,0))#两个参数分别代表加载完成的位图,绘制起始坐标。
screen.blit(tree,(0,10))
screen.blit(home,(0,60)) #在屏幕里放入四个基地
screen.blit(home,(0,200))
screen.blit(home,(0,390))
#通过鼠标事件触发让小鸟跟着鼠标旋转
position = pygame.mouse.get_pos() #函数返回两个值:鼠标的x[0]坐标和y[1]坐标
angle = math.atan2(position[1]-(playerpos[1]+40),position[0]-(playerpos[0]+30))
playerrot= pygame.transform.rotate(player,360-angle*57.3) #对player进行旋转
playerpos1= (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
screen.blit(playerrot, playerpos1) #旋转后更新的坐标
#实现发射子弹
for bullet in Bullets:
index=0
velx=math.cos(bullet[0])*10 #bullet[0]为子弹发射出的旋转角度,10为子弹发射速度
vely=math.sin(bullet[0])*10 #math.cos()返回一个弧度的余弦值
bullet[1]+=velx
bullet[2]+=vely
if bullet[1]<-64 or bullet[1]>900 or bullet[2]<-64 or bullet[2]>540:
Bullets.pop(index) #子弹超出屏幕范围则被移除
for projectile in Bullets:
Bullet1= pygame.transform.rotate(Bullet,360-projectile[0]*57.3)
screen.blit(Bullet1, (projectile[1], projectile[2]))
#蝙蝠出现
if badtimer==0:
badguys.append([900, random.randint(40,500)])
badtimer=100-(badtimer1*2)
if badtimer1>=35:
badtimer1=35
else:
badtimer1+=5
index=0
for badguy in badguys: #对蝙蝠的行为做出判断
badrect=pygame.Rect(badguyimg.get_rect())
badrect.left=badguy[0]
badrect.top=badguy[1] #得到badguy的位置坐标
if badrect.left<64: #如果蝙蝠进攻了家园
healthvalue -=10 #生命值降低
badguys.pop(index) #移除进攻后的蝙蝠
#子弹击中蝙蝠事件
index1=0
for bullet in Bullets:
bullrect=pygame.Rect(Bullet.get_rect())
bullrect.left=bullet[1]
bullrect.top=bullet[2] #得到子弹的位置坐标
if badrect.colliderect(bullrect): #colliderect()方法检测两个矩形是否相交并返回布尔值
acc[0]+=1 #击中的数量+1
badguys.pop(index) #移除蝙蝠
Bullets.pop(index1) #移除子弹
index1+=1
if badguy[0]<-64:
badguys.pop(index) #蝙蝠超出屏幕范围,则移除
badguy[0]-=7 #否则向左移动7个单位
index+=1
for badguy in badguys:
screen.blit(badguyimg, badguy) #循环获取显示每个蝙蝠的位置
#倒计时和生命条的设置
font = pygame.font.SysFont('隶书', 24)#pygame.time.get_ticks()获取以毫秒为单位的时间
timetext = font.render(str((90000-pygame.time.get_ticks())//60000)+":"+str((90000-pygame.time.get_ticks())//1000%60).zfill(2), True, (0,0,0))
textRect = timetext.get_rect()
timetext2=font.render('游戏倒计时:',True, (255,0,0))
textRect2 = timetext2.get_rect()
healtext=font.render('生命值:',True, (255,0,0))
healRect= healtext.get_rect()
screen.blit(timetext, [845,5])#获取倒计时文字范围
screen.blit(timetext2, [700,5])
screen.blit(healtext, [5,5])
for health1 in range(healthvalue):
screen.blit(health, (health1+21,30))
pygame.display.flip() #更新显示屏幕
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
exit(0)
if event.type == pygame.KEYDOWN:
if event.key==K_w:
keys[0]=True
elif event.key==K_a:
keys[1]=True
elif event.key==K_s:
keys[2]=True
elif event.key==K_d:
keys[3]=True
if event.type == pygame.KEYUP:
if event.key==pygame.K_w:
keys[0]=False
elif event.key==pygame.K_a:
keys[1]=False
elif event.key==pygame.K_s:
keys[2]=False
elif event.key==pygame.K_d:
keys[3]=False
if event.type==pygame.MOUSEBUTTONDOWN: #触发鼠标点击事件
position=pygame.mouse.get_pos()
acc[1]+=1 #子弹数量+1
Bullets.append([math.atan2(position[1]-(playerpos1[1]+40),position[0]-(playerpos1[0]+30)),playerpos1[0]+40,playerpos1[1]+40])
#小鸟的移动设置
if keys[0]:
playerpos[1]-=5
elif keys[2]:
playerpos[1]+=5
if keys[1]:
playerpos[0]-=5
elif keys[3]:
playerpos[0]+=5
#游戏的退出以及分数设置
if pygame.time.get_ticks()>=90000:
running=0
exitcode=1
if healthvalue<=0:
running=0
exitcode=0
#结束页面显示的设置
if exitcode==0:
pygame.font.init()
font = pygame.font.SysFont('隶书', 50)
text = font.render("很遗憾你输了!得分是: "+str(acc[0])+'分', True, (255,0,0))
textRect=text.get_rect()
textRect.centerx = screen.get_rect().centerx
textRect.centery = screen.get_rect().centery+34
screen.blit(gameover, (0,0))
screen.blit(text, textRect)
else:
pygame.font.init()
font = pygame.font.