20212126张楷勤 2022-05-28 17:27 采纳率: 100%
浏览 66
已结题

如何在这个游戏中加入倒计时的功能

问题遇到的现象和发生背景

如何在这个游戏中加入倒计时的功能

问题相关代码,请勿粘贴截图

import pygame
import random
import math
import  sys
from dataclasses import  dataclass

pygame.init()#游戏初始化

bg_image = pygame.image.load("0.png")#设置游戏界面
bg_image = pygame.transform.scale(bg_image, (bg_image.get_width()/3, bg_image.get_height()/3))
screen = pygame.display.set_mode((bg_image.get_width(), bg_image.get_height()))

score_value = 0#设置分数
font = pygame.font.Font('freesansbold.ttf',32)

count_now = 60
font = pygame.font.Font('freesansbold.ttf',32)

textX = 10#分数位置
textY = 10

textx = 250
texty = 10

count = 0

enemies = []#设置地鼠

NUM_COL = 5#设置地鼠出现的位置
NUM_ROW = 5

possible_enemy_pos = [(5,52),(170,52),(85,52),(250,52),(330,52),(5,125),(85,125),(170,125),(250,125),(330,125),
                      (5,198),(85,198),(170,198),(250,198),(330,198),(5,270),(85,270),(170,270),(250,270),(330,270),
                      (5,345),(85,345),(170,345),(250,345),(330,345)]#设置地鼠的具体位置

enemy_image = pygame.image.load("3.jpg")#导入地鼠图片
#enemy_image = pygame.transform.scale(enemy_image, (enemy_image.get_width() // 2,enemy_image.get_height() // 2))
ENEMY_RADIUS = min(enemy_image.get_width(), enemy_image.get_height())// 2.5
enemybeated_image = pygame.image.load("4.jpg")

GENERATE_ENEMY, APPEAR_INTERVAL = pygame.USEREVENT + 2, 500
pygame.time.set_timer(GENERATE_ENEMY, APPEAR_INTERVAL)

ENEMY_LIFE_SPAN = 3*1000
AGE_ENEMY, AGE_INTERVAL = pygame.USEREVENT+2, ENEMY_LIFE_SPAN//7
pygame.time.set_timer(AGE_ENEMY, AGE_INTERVAL)



@dataclass
class Enemy:
    x: int
    y: int
    life: int = ENEMY_LIFE_SPAN

def check_exist(new_pos):
    for enemy in enemies:
        if new_pos == (enemy.x, enemy.y):
            return True
    return False

def generate_next_enemy_pos():#算出地鼠出现的位置
    new_pos=()
    while True:
        grid_index = random.randint(0, NUM_ROW*NUM_COL-1)
        new_pos = possible_enemy_pos[grid_index]
        if not check_exist(new_pos):
            break
    return new_pos


def draw_enemies():#画地鼠
    for enemy in enemies:
        screen.blit(enemy_image, (enemy.x, enemy.y))


def show_score(x,y):#显示分数
    global score_value
    score = font.render("Score: "+str(score_value), True, (255, 255, 255))
    screen.blit(score, (x, y))

def show_time(x,y):
    global time_value
    time = font.render("Time: "+str(count_now), True, (255, 255, 255))
    screen.blit(time, (x, y))

def check_enemy_collision(clickX, clickY, enemyX, enemyY):#检查鼠标和点击的位置相不相同
    enemyX,enemyY = enemyX + ENEMY_RADIUS, enemyY+ENEMY_RADIUS
    distance = math.sqrt(math.pow(enemyX - clickX,2)+(math.pow(enemyY-clickY,2)))
    return distance<ENEMY_RADIUS


def check_enemies_collision(click_pos, enemies):#检测鼠标点击的位置和地鼠的位置相不相同,并移除地鼠
    for enemy in enemies:
        if check_enemy_collision(click_pos[0], click_pos[1], enemy.x, enemy.y):
            global score_value
            score_value +=1
            enemies.remove(enemy)


def age_enemy():
    for enemy in enemies:
        enemy.life -= 1000

def remove_died_enemies():
    for enemy in enemies:
        if enemy.life == 0:
            enemies.remove(enemy)


cursor_image = pygame.image.load("1.png") # 设置鼠标图片
pygame.mouse.set_visible(False) # 隐藏鼠标

running = True#鼠标点击时发生的事情(关闭键和点地鼠
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONUP:
            click_pos = pygame.mouse.get_pos()
            check_enemies_collision(click_pos, enemies)
        if event.type == AGE_ENEMY:
            age_enemy()
            remove_died_enemies()
        if event.type == GENERATE_ENEMY:
            if len(enemies) < NUM_COL*NUM_ROW:
                new_pos = generate_next_enemy_pos()
                enemies.append(Enemy(new_pos[0], new_pos[1]))


    screen.blit(bg_image, (0, 0))#填充游戏背景
    draw_enemies()#显示地鼠
    show_score(textX, textY)#显示分数
    show_time(textx, texty)
    pointer_rect = cursor_image.get_rect()
    pointer_rect.center = pygame.mouse.get_pos()
    cursor_x = pointer_rect.x
    cursor_y = pointer_rect.y
    screen.blit(cursor_image, (cursor_x+20, cursor_y))
    pygame.display.update()#更新游戏界面




我想要达到的结果

这上面有显示时间的地方,但我不会让这个60秒进行倒计时

  • 写回答

1条回答 默认 最新

  • 请叫我问哥 Python领域新星创作者 2022-05-28 22:37
    关注

    先定义一个新的USEREVENT,设定计时器间隔为1秒

    clock_event = pygame.USEREVENT+3
    pygame.time.set_timer(clock_event, 1000)
    

    然后在事件监听里加上这个新事件的监听,倒计时到0的时候停止计时器。

            if event.type == clock_event:
                count_now -= 1
                font.render("Time: "+str(count_now), True, (255, 255, 255))
                if count_now == 0:
                    pygame.time.set_timer(clock_event, 0)         
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月6日
  • 已采纳回答 5月29日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试