Pygame小游戏别踩钢琴块

发布于:2022-10-21 ⋅ 阅读:(383) ⋅ 点赞:(0)

源代码:

import random
import sys

import pygame
from pygame.sprite import Group, Sprite

pygame.init()
pygame.mixer.init()
photo1 = pygame.image.load("photo1.png")
tryto = 35
now_block = []
flag1 = [False, 0]


class Music:
    music1 = pygame.mixer.Sound("music1.mp3")
    music2 = pygame.mixer.Sound("music2.mp3")
    music2.set_volume(0.6)
    music3 = pygame.mixer.Sound("music3.mp3")
    music3.set_volume(0.6)
    music4 = pygame.mixer.Sound("music4.mp3")
    music4.set_volume(0.6)
    music5 = pygame.mixer.Sound("music5.mp3")
    music5.set_volume(0.8)


class Color:
    color1 = (196, 197, 202)
    render_color = (72, 95, 249)
    screen_color = (157, 159, 164)


def game_over(screen, score):
    pygame.time.wait(1000)
    gamefont = pygame.font.SysFont("宋体", 40)
    scorerender = gamefont.render(f"score:{score}", True, Color.render_color)

    screen.fill(Color.screen_color)
    gameover_Render = gamefont.render("Game Over", True, Color.render_color)
    att = gamefont.render("66666!", True, "pink")
    screen.blit(att, [screen.get_rect().width / 3 - 20 + 30, screen.get_rect().centery - 150])
    screen.blit(gameover_Render, [screen.get_rect().width / 3 - 20, screen.get_rect().centery])
    screen.blit(scorerender, [screen.get_rect().width / 3 - 20, screen.get_rect().centery + 36])
    pygame.display.flip()
    pygame.time.wait(4000)
    pygame.quit()
    sys.exit()


def draw_lines(screen):
    for i in range(100, 400, 100):
        pygame.draw.line(screen, Color.color1, (i, 0), (i, 650), 4)


class Block(Sprite):
    def __init__(self, screen, score):
        Sprite.__init__(self)
        global now_block
        self.score = score
        self.screen = screen
        self.screen_rect = self.screen.get_rect()
        self.speed = 5
        self.a = random.choice(["photo2(1).png", "photo3(1).png"])
        self.image = pygame.image.load(self.a)
        self.rect = self.image.get_rect()
        self.rect.y = 0
        self.b = random.choice([[10, 1], [110, 2], [210, 3], [310, 4]])
        self.number = self.b[1]
        self.rect.x = self.b[0]
        now_block.append(self.b[1])

    def update(self):
        global flag1
        self.rect.top += self.speed
        if flag1[0]:
            if flag1[1] == self.number:
                Music.music1.play()
                self.kill()
                flag1 = [False, 0]
        if self.rect.bottom > self.screen_rect.height:
            game_over(self.screen, self.score)


def main_start():
    global flag1, tryto
    pygame.display.set_caption("Tom 的别踩钢琴块")  # 设置窗口名字
    blocks = Group()
    n_200 = n_500 = n_1000 = True
    pygame.mixer.music.set_volume(0.6)
    Music.music2.play(-1)
    gamefont = pygame.font.SysFont("宋体", 40)
    score = 0
    count = 0
    screen = pygame.display.set_mode((400, 650))
    screen_rect = screen.get_rect()
    clock = pygame.time.Clock()
    while True:
        if score >= 1000 and n_1000:
            n_1000 = False
            tryto = 10
            Music.music4.stop()
            Music.music5.play(-1)
        if score >= 500 and n_500:
            n_500 = False
            Music.music3.stop()
            tryto = 18
            Music.music4.play(-1)
        if score >= 200 and n_200:
            n_200 = False
            Music.music2.stop()
            tryto = 24
            Music.music3.play(-1)
        count += 1
        screen.blit(photo1, screen_rect)
        if count % tryto == 0:
            block = Block(screen, score)
            blocks.add(block)
        blocks.draw(screen)

        clock.tick(20)

        draw_lines(screen)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_1:
                    if 1 in now_block:
                        now_block.remove(1)
                        flag1 = [True, 1]
                        score += 10
                    else:
                        game_over(screen, score)
                elif event.key == pygame.K_2:
                    if 2 in now_block:
                        now_block.remove(2)
                        flag1 = [True, 2]
                        score += 10
                    else:
                        game_over(screen, score)
                if event.key == pygame.K_3:
                    if 3 in now_block:
                        now_block.remove(3)
                        flag1 = [True, 3]
                        score += 10
                    else:
                        game_over(screen, score)
                if event.key == pygame.K_4:
                    if 4 in now_block:
                        now_block.remove(4)
                        flag1 = [True, 4]
                        score += 10
                    else:
                        game_over(screen, score)
        blocks.update()
        scorerender = gamefont.render(f"score:{score}", True, (72, 95, 249))
        screen.blit(scorerender, scorerender.get_rect())
        pygame.display.flip()


if __name__ == '__main__':
    main_start()