一次简单的python游戏编写

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()
    
        
               
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值