zoukankan      html  css  js  c++  java
  • python制作一个塔防射箭游戏

    import pygame
    import math
    import random
    
    pygame.init()
    W, H = 640, 480
    screen = pygame.display.set_mode((W, H))
    # keys用来记录按键情况:WASD依次对应
    keys = [False, False, False, False]
    # playerpos表示玩家位置
    playerpos = [100, 100]
    acc = [0, 0]  # 记录射出的箭数和命中的箭数
    arrows = []  # 跟踪箭头变量,存放箭头旋转角度值(弧度),箭头起始位置坐标
    # 坏人相关变量或列表
    badtimer = 100  # 定义一个定时器,使得游戏里过一段时间后就产生一只新的獾(坏人)
    badtimer1 = 0
    badguys = [[640, 100]]  # 坏人产生位置列表,第一个坏人位置为(640,100)
    healthvalue = 194  # 城堡健康值等于194
    
    # 加载图片
    player = pygame.image.load("resources/images/dude.png")  # 兔子
    grass = pygame.image.load("resources/images/grass.png")  #
    castle = pygame.image.load("resources/images/castle.png")  # 城堡
    arrow = pygame.image.load("resources/images/bullet.png")  #
    badguyimg1 = pygame.image.load("resources/images/badguy.png")  # 加载坏人
    badguyimg = badguyimg1  # 设置坏人图像副本,可以更流畅地为坏人设置动画
    healthbar=pygame.image.load("resources/images/healthbar.png") #生命值条
    health=pygame.image.load("resources/images/health.png") #剩余生命值图片
    while True:
        screen.fill(0)  # 屏幕填充黑色
        for x in range(W // grass.get_width() + 1):
            for y in range(H // 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))
        # 首先获取鼠标和玩家的位置,然后,获取atan2函数得出的角度和弧度。
        # 当兔子被旋转时,它的位置将会改变
        # 所以你需要计算兔子新的位置,然后将其在屏幕上显示出来
        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)  # 玩家旋转图片
        playerpos1 = (playerpos[0] - playerrot
                      .get_rect().width // 2, playerpos[1] - playerrot.get_rect().height // 2)
        screen.blit(playerrot, playerpos1)
    
        # 在屏幕上画出箭头来
        # vely和velx的值是根据三角定理算出来的
        # 10是箭头的速度,if 是检查箭头是否超出了屏幕范围,如果超出解除这个箭头
        # 第二个for 循环把箭头根据相应的旋转画出来
        for bullet in arrows:  # 对每一支箭在箭头列表里
            index = 0
            velx = math.cos(bullet[0]) * 10
            vely = math.sin(bullet[0]) * 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]))
    
    
        # 更新并显示坏人
        # 检查badtimer是否为0,如果为0,创建一个獾然后重新设置badtimer
        # 第一个循环更新獾的x坐标,检查獾是否超出屏幕范围,如果超出,将獾删掉
        # 第二个循环是来画出所有的獾
        if badtimer == 0:
            badguys.append([640, random.randint(50, 430)])
            badtimer = 100 - (badtimer1 * 2)
            if badtimer1 >= 20:
                badtimer1 =20
            else:
                badtimer1 += 5
        index_badguy = 0
        for badguy in badguys:  # 对坏人列表里的每个坏人显示
            if badguy[0] < -64:
                badguys.pop(index_badguy)
            badguy[0] -= 1
            # 獾可以炸掉城堡
            # 如果獾的x坐标离左边小于64,就删除獾,并随机减少5-20之间的健康值
            badrect = pygame.Rect(badguyimg.get_rect())
            badrect.top = badguy[1]
            badrect.left = badguy[0]
            if badrect.left < 64:
                healthvalue -= random.randint(5, 20)
                badguys.pop(index_badguy)
            # 循环所有的坏蛋和箭头来检查是否有碰撞
            # 如果碰撞上,删除獾删除箭头,并且命中数变量里+1
            # 使用了pygame的内建功能来检查两个矩形是否交叉
            #'''
            index_arrow = 0
            for bullet in arrows:
                bulletrect = pygame.Rect(arrow.get_rect())
                bulletrect.left = bullet[1]
                bulletrect.top = bullet[2]
                if badrect.colliderect(bulletrect):
                    acc[0] += 1
                    badguys.pop(index_badguy)
                    arrows.pop(index_arrow)
                index_arrow += 1
              #'''
            index_badguy += 1
    
        for badguy in badguys:
            screen.blit(badguyimg, badguy)
        #添加一个计时
        font=pygame.font.Font('Arial.ttf',24)
        survivedtext=font.render(str((120-pygame.time.get_ticks()//1000)//60)+":"+
                                 str((120-pygame.time.get_ticks()//1000)%60).zfill(2),True,(255,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))
    
        badtimer -= 1  # 每更新一帧,计时-1
        pygame.display.flip()  # 更新屏幕
        # 事件检测
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                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])
            if event.type == pygame.QUIT:
                pygame.quit()
                exit(0)
            # 根据按下的键来更新按键记录数组
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_w:
                    keys[0] = True
                elif event.key == pygame.K_a:
                    keys[1] = True
                elif event.key == pygame.K_s:
                    keys[2] = True
                elif event.key == pygame.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 keys[0]:
            playerpos[1] -= 1
        elif keys[2]:
            playerpos[1] += 1
        if keys[1]:
            playerpos[0] -= 1
        elif keys[3]:
            playerpos[0] += 1
  • 相关阅读:
    【Prometheus学习笔记】主机监控 -node_exporter
    【Django学习笔记】-环境搭建
    【Python学习笔记】-虚拟环境virtualenv
    对象存储服务-Minio
    网络流各算法超详细带源码解析
    做题记录节选
    日常
    板刷NOI
    题解 宝石
    题解 矩阵游戏
  • 原文地址:https://www.cnblogs.com/yanglike111/p/14610955.html
Copyright © 2011-2022 走看看