import pygame
import math
import random
from pygame.locals import *
#载入字典
pygame.init()
keys=[False,False,False,False]
playerpos=[100,100]
acc=[0,0]
pygame.display.set_caption(r'哇咔咔')
#该变量跟踪玩家的精度,本质是数字组成的列表
#记录射出的箭头数和被击中灌的数量
arrows=[]
badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194
#定义一个定时器一段时间出现一只灌
width, height = 640, 480
pygame.mixer.init()
#预设画面的大小
screen=pygame.display.set_mode((width, height))
pygame.display.set_caption(r"by Mr.Drizzt")
arrow=pygame.image.load("resources/images/bullet.png")
badguyimg1=pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1
player = pygame.image.load("resources/images/dude.png")
grass=pygame.image.load("resources/images/grass.png")
castle=pygame.image.load("resources/images/castle.png")
healthbar=pygame.image.load("resources/images/healthbar.png")
health=pygame.image.load("resources/images/health.png")
gameover=pygame.image.load("resources/images/gameover.png")
youwin=pygame.image.load("resources/images/youwin.png")
hit=pygame.mixer.Sound("resources/audio/explode.wav")
enemy=pygame.mixer.Sound("resources/audio/enemy.wav")
shoot=pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1,0.0)
pygame.mixer.music.set_volume(0.25)
#定义图片
running=1
exitcode=0
while running:
badtimer-=1
screen.fill(0)
#在给屏幕画东西之前用黑色填充
for x in range(width/grass.get_width()+1):
for y in range(height/grass.get_height()+1):
screen.blit(grass,(x*100,y*100))
#循环让草布满窗口,作为背景
screen.blit(castle,(0,30))
screen.blit(castle,(0,135))
screen.blit(castle,(0,240))
screen.blit(castle,(0,345))
#定义兔子的城堡位置
position=pygame.mouse.get_pos()
#定义位置这个变量到鼠标所指的位置
angle=math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
playerrot=pygame.transform.rotate(player,360-angle*57.29)
#乘以57.29是将弧度转为度数
playerpos1=(playerpos[0]-playerrot.get_rect().width/2,playerpos[1]-playerrot.get_rect().height/2)
screen.blit(playerrot, playerpos1)
#设置玩家的初始位置
for bullet in arrows:
index=0
velx=math.cos(bullet[0])*10
vely=math.sin(bullet[0])*10
#其中10为发射的箭的速度
bullet[1]+=velx
bullet[2]+=vely
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
arrows.pop(index)
#在箭离开屏幕后删除它们
index+=1
for projectile in arrows:
arrow1=pygame.transform.rotate(arrow,360-projectile[0]*57.29)
screen.blit(arrow1,(projectile[1],projectile[2]))
if badtimer==0:
badguys.append([640,random.randint(50,430)])
badtimer=100-(badtimer1*2)
if badtimer1>=35:
badtimer1=35
else:
badtimer1+=5
index=0
for badguy in badguys:
if badguy[0]<-64:
badguys.pop(index)
badguy[0]-=7
#控制灌的速度
badrect=pygame.Rect(badguyimg.get_rect())
badrect.top=badguy[1]
badrect.left=badguy[0]
if badrect.left<64:
hit.play()
healthvalue-=random.randint(5,20)
badguys.pop(index)
index1=0
for bullet in arrows:
bullrect=pygame.Rect(arrow.get_rect())
bullrect.left=bullet[1]
bullrect.top=bullet[2]
if badrect.colliderect(bullrect):
enemy.play()
acc[0]+=1
badguys.pop(index)
arrows.pop(index1)
index1+=1
index+=1
for badguy in badguys:
screen.blit(badguyimg,badguy)
font=pygame.font.Font(None,24)
survivedtext=font.render(str((90000-pygame.time.get_ticks())/60000)+":"+str((90000-pygame.time.get_ticks())/1000%60).zfill(2),True,(0,0,0))
textRect=survivedtext.get_rect()
textRect.topright=[635,5]
screen.blit(survivedtext,textRect)
screen.blit(healthbar,(5,5))
for health1 in range(healthvalue):
screen.blit(health,(health1+8,8))
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:
shoot.play()
position=pygame.mouse.get_pos()
acc[1]+=1
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
#根据光标位置和玩家位置的关系计算出箭头旋转角度,并存在arrow数组里
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 acc[1]!=0:
accuracy=acc[0]*1.0/acc[1]*100
else:
accuracy=0
if exitcode==0:
pygame.font.init()
font=pygame.font.Font(None,24)
text=font.render("Accuracy: "+str(accuracy)+"%",True,(255,0,0))
textRect=text.get_rect()
textRect.centerx=screen.get_rect().centerx
textRect.centery=screen.get_rect().centery+24
screen.blit(gameover,(0,0))
screen.blit(text,textRect)
else:
pygame.font.init()
font=pygame.font.Font(None,24)
text=font.render("Accuracy: "+str(accuracy)+"%",True,(255,0,0))
textRect=text.get_rect()
textRect.centerx=screen.get_rect().centerx
textRect.centery=screen.get_rect().centery+24
screen.blit(youwin,(0,0))
screen.blit(text,textRect)
while 1:
for event in pygame.event.get():
pygame.quit()
exit(0)
pygame.display.flip()
import math
import random
from pygame.locals import *
#载入字典
pygame.init()
keys=[False,False,False,False]
playerpos=[100,100]
acc=[0,0]
pygame.display.set_caption(r'哇咔咔')
#该变量跟踪玩家的精度,本质是数字组成的列表
#记录射出的箭头数和被击中灌的数量
arrows=[]
badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194
#定义一个定时器一段时间出现一只灌
width, height = 640, 480
pygame.mixer.init()
#预设画面的大小
screen=pygame.display.set_mode((width, height))
pygame.display.set_caption(r"by Mr.Drizzt")
arrow=pygame.image.load("resources/images/bullet.png")
badguyimg1=pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1
player = pygame.image.load("resources/images/dude.png")
grass=pygame.image.load("resources/images/grass.png")
castle=pygame.image.load("resources/images/castle.png")
healthbar=pygame.image.load("resources/images/healthbar.png")
health=pygame.image.load("resources/images/health.png")
gameover=pygame.image.load("resources/images/gameover.png")
youwin=pygame.image.load("resources/images/youwin.png")
hit=pygame.mixer.Sound("resources/audio/explode.wav")
enemy=pygame.mixer.Sound("resources/audio/enemy.wav")
shoot=pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1,0.0)
pygame.mixer.music.set_volume(0.25)
#定义图片
running=1
exitcode=0
while running:
badtimer-=1
screen.fill(0)
#在给屏幕画东西之前用黑色填充
for x in range(width/grass.get_width()+1):
for y in range(height/grass.get_height()+1):
screen.blit(grass,(x*100,y*100))
#循环让草布满窗口,作为背景
screen.blit(castle,(0,30))
screen.blit(castle,(0,135))
screen.blit(castle,(0,240))
screen.blit(castle,(0,345))
#定义兔子的城堡位置
position=pygame.mouse.get_pos()
#定义位置这个变量到鼠标所指的位置
angle=math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
playerrot=pygame.transform.rotate(player,360-angle*57.29)
#乘以57.29是将弧度转为度数
playerpos1=(playerpos[0]-playerrot.get_rect().width/2,playerpos[1]-playerrot.get_rect().height/2)
screen.blit(playerrot, playerpos1)
#设置玩家的初始位置
for bullet in arrows:
index=0
velx=math.cos(bullet[0])*10
vely=math.sin(bullet[0])*10
#其中10为发射的箭的速度
bullet[1]+=velx
bullet[2]+=vely
if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
arrows.pop(index)
#在箭离开屏幕后删除它们
index+=1
for projectile in arrows:
arrow1=pygame.transform.rotate(arrow,360-projectile[0]*57.29)
screen.blit(arrow1,(projectile[1],projectile[2]))
if badtimer==0:
badguys.append([640,random.randint(50,430)])
badtimer=100-(badtimer1*2)
if badtimer1>=35:
badtimer1=35
else:
badtimer1+=5
index=0
for badguy in badguys:
if badguy[0]<-64:
badguys.pop(index)
badguy[0]-=7
#控制灌的速度
badrect=pygame.Rect(badguyimg.get_rect())
badrect.top=badguy[1]
badrect.left=badguy[0]
if badrect.left<64:
hit.play()
healthvalue-=random.randint(5,20)
badguys.pop(index)
index1=0
for bullet in arrows:
bullrect=pygame.Rect(arrow.get_rect())
bullrect.left=bullet[1]
bullrect.top=bullet[2]
if badrect.colliderect(bullrect):
enemy.play()
acc[0]+=1
badguys.pop(index)
arrows.pop(index1)
index1+=1
index+=1
for badguy in badguys:
screen.blit(badguyimg,badguy)
font=pygame.font.Font(None,24)
survivedtext=font.render(str((90000-pygame.time.get_ticks())/60000)+":"+str((90000-pygame.time.get_ticks())/1000%60).zfill(2),True,(0,0,0))
textRect=survivedtext.get_rect()
textRect.topright=[635,5]
screen.blit(survivedtext,textRect)
screen.blit(healthbar,(5,5))
for health1 in range(healthvalue):
screen.blit(health,(health1+8,8))
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:
shoot.play()
position=pygame.mouse.get_pos()
acc[1]+=1
arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])
#根据光标位置和玩家位置的关系计算出箭头旋转角度,并存在arrow数组里
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 acc[1]!=0:
accuracy=acc[0]*1.0/acc[1]*100
else:
accuracy=0
if exitcode==0:
pygame.font.init()
font=pygame.font.Font(None,24)
text=font.render("Accuracy: "+str(accuracy)+"%",True,(255,0,0))
textRect=text.get_rect()
textRect.centerx=screen.get_rect().centerx
textRect.centery=screen.get_rect().centery+24
screen.blit(gameover,(0,0))
screen.blit(text,textRect)
else:
pygame.font.init()
font=pygame.font.Font(None,24)
text=font.render("Accuracy: "+str(accuracy)+"%",True,(255,0,0))
textRect=text.get_rect()
textRect.centerx=screen.get_rect().centerx
textRect.centery=screen.get_rect().centery+24
screen.blit(youwin,(0,0))
screen.blit(text,textRect)
while 1:
for event in pygame.event.get():
pygame.quit()
exit(0)
pygame.display.flip()