大家好,我是小F~

经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对?

比方说,你有没有想过,可以通过打游戏来学编程?

今天我想跟大家分享30个Python小游戏,教你如何通过边打游戏边学编程!

相关文件及代码都已上传,公众号回复【游戏】即可获取。

接下来就一起来看看吧~

1、飞机大战

源码分享:

import random

import pygame

from objects import Background, Player, Enemy, Bullet, Explosion, Fuel, \

                    Powerup, Button, Message, BlinkingText

pygame.init()

SCREEN = WIDTH, HEIGHT = 288, 512

info = pygame.display.Info()

width = info.current_w

height = info.current_h

if width >= height:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME)

else:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME | pygame.SCALED | pygame.FULLSCREEN)

clock = pygame.time.Clock()

FPS = 60

# COLORS **********************************************************************

WHITE = (255, 255, 255)

BLUE = (30, 144,255)

RED = (255, 0, 0)

GREEN = (0, 255, 0)

BLACK = (0, 0, 20)

# IMAGES **********************************************************************

plane_img = pygame.image.load('Assets/plane.png')

logo_img = pygame.image.load('Assets/logo.png')

fighter_img = pygame.image.load('Assets/fighter.png')

clouds_img = pygame.image.load('Assets/clouds.png')

clouds_img = pygame.transform.scale(clouds_img, (WIDTH, 350))

home_img = pygame.image.load('Assets/Buttons/homeBtn.png')

replay_img = pygame.image.load('Assets/Buttons/replay.png')

sound_off_img = pygame.image.load("Assets/Buttons/soundOffBtn.png")

sound_on_img = pygame.image.load("Assets/Buttons/soundOnBtn.png")

# BUTTONS *********************************************************************

home_btn = Button(home_img, (24, 24), WIDTH // 4 - 18, HEIGHT//2 + 120)

replay_btn = Button(replay_img, (36,36), WIDTH // 2  - 18, HEIGHT//2 + 115)

sound_btn = Button(sound_on_img, (24, 24), WIDTH - WIDTH // 4 - 18, HEIGHT//2 + 120)

# FONTS ***********************************************************************

game_over_font = 'Fonts/ghostclan.ttf'

tap_to_play_font = 'Fonts/BubblegumSans-Regular.ttf'

score_font = 'Fonts/DalelandsUncialBold-82zA.ttf'

final_score_font = 'Fonts/DroneflyRegular-K78LA.ttf'

game_over_msg = Message(WIDTH//2, 230, 30, 'Game Over', game_over_font, WHITE, win)

score_msg = Message(WIDTH-50, 28, 30, '0', final_score_font, RED, win)

final_score_msg = Message(WIDTH//2, 280, 30, '0', final_score_font, RED, win)

tap_to_play_msg = tap_to_play = BlinkingText(WIDTH//2, HEIGHT-60, 25, "Tap To Play",

                 tap_to_play_font, WHITE, win)

# SOUNDS **********************************************************************

player_bullet_fx = pygame.mixer.Sound('Sounds/gunshot.wav')

click_fx = pygame.mixer.Sound('Sounds/click.mp3')

collision_fx = pygame.mixer.Sound('Sounds/mini_exp.mp3')

blast_fx = pygame.mixer.Sound('Sounds/blast.wav')

fuel_fx = pygame.mixer.Sound('Sounds/fuel.wav')

pygame.mixer.music.load('Sounds/Defrini - Spookie.mp3')

pygame.mixer.music.play(loops=-1)

pygame.mixer.music.set_volume(0.1)

# GROUPS & OBJECTS ************************************************************

bg = Background(win)

p = Player(144, HEIGHT - 100)

enemy_group = pygame.sprite.Group()

player_bullet_group = pygame.sprite.Group()

enemy_bullet_group = pygame.sprite.Group()

explosion_group = pygame.sprite.Group()

fuel_group = pygame.sprite.Group()

powerup_group = pygame.sprite.Group()

# FUNCTIONS *******************************************************************

def shoot_bullet():

    x, y = p.rect.center[0], p.rect.y

    if p.powerup > 0:

        for dx in range(-3, 4):

            b = Bullet(x, y, 4, dx)

            player_bullet_group.add(b)

        p.powerup -= 1

    else:

        b = Bullet(x-30, y, 6)

        player_bullet_group.add(b)

        b = Bullet(x+30, y, 6)

        player_bullet_group.add(b)

    player_bullet_fx.play()

def reset():

    enemy_group.empty()

    player_bullet_group.empty()

    enemy_bullet_group.empty()

    explosion_group.empty()

    fuel_group.empty()

    powerup_group.empty()

    p.reset(p.x, p.y)

# VARIABLES *******************************************************************

level = 1

plane_destroy_count = 0

plane_frequency = 5000

start_time = pygame.time.get_ticks()

moving_left = False

moving_right = False

home_page = True

game_page = False

score_page = False

score = 0

sound_on = True

running = True

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE or event.key == pygame.K_q:

                running = False

        if event.type == pygame.KEYDOWN and game_page:

            if event.key == pygame.K_LEFT:

                moving_left = True

            if event.key == pygame.K_RIGHT:

                moving_right = True

            if event.key == pygame.K_SPACE:

                shoot_bullet()

        if event.type == pygame.MOUSEBUTTONDOWN:

            if home_page:

                home_page = False

                game_page = True

                click_fx.play()

            elif game_page:

                x, y = event.pos

                if p.rect.collidepoint((x,y)):

                    shoot_bullet()

                elif x <= WIDTH // 2:

                    moving_left = True

                elif x > WIDTH // 2:

                    moving_right = True

        if event.type == pygame.KEYUP:

            moving_left = False

            moving_right = False

        if event.type == pygame.MOUSEBUTTONUP:

            moving_left = False

            moving_right = False

    if home_page:

        win.fill(BLACK)

        win.blit(logo_img, (30, 80))

        win.blit(fighter_img, (WIDTH//2 - 50, HEIGHT//2))

        pygame.draw.circle(win, WHITE, (WIDTH//2, HEIGHT//2 + 50), 50, 4)

        tap_to_play_msg.update()

    if score_page:

        win.fill(BLACK)

        win.blit(logo_img, (30, 50))

        game_over_msg.update()

        final_score_msg.update(score)

        if home_btn.draw(win):

            home_page = True

            game_page = False

            score_page = False

            reset()

            click_fx.play()

            plane_destroy_count = 0

            level = 1

            score = 0

        if replay_btn.draw(win):

            score_page = False

            game_page = True

            reset()

            click_fx.play()

            plane_destroy_count = 0

            score = 0

        if sound_btn.draw(win):

            sound_on = not sound_on

            if sound_on:

                sound_btn.update_image(sound_on_img)

                pygame.mixer.music.play(loops=-1)

            else:

                sound_btn.update_image(sound_off_img)

                pygame.mixer.music.stop()

    if game_page:

        current_time = pygame.time.get_ticks()

        delta_time = current_time - start_time

        if delta_time >= plane_frequency:

            if level == 1:

                type = 1

            elif level == 2:

                type = 2

            elif level == 3:

                type = 3

            elif level == 4:

                type = random.randint(4, 5)

            elif level == 5:

                type = random.randint(1, 5)

            x = random.randint(10, WIDTH - 100)

            e = Enemy(x, -150, type)

            enemy_group.add(e)

            start_time = current_time

        if plane_destroy_count:

            if plane_destroy_count % 5 == 0 and level < 5:

                level += 1

                plane_destroy_count = 0

        p.fuel -= 0.05

        bg.update(1)

        win.blit(clouds_img, (0, 70))

        p.update(moving_left, moving_right, explosion_group)

        p.draw(win)

        player_bullet_group.update()

        player_bullet_group.draw(win)

        enemy_bullet_group.update()

        enemy_bullet_group.draw(win)

        explosion_group.update()

        explosion_group.draw(win)

        fuel_group.update()

        fuel_group.draw(win)

        powerup_group.update()

        powerup_group.draw(win)

        enemy_group.update(enemy_bullet_group, explosion_group)

        enemy_group.draw(win)

        if p.alive:

            player_hit = pygame.sprite.spritecollide(p, enemy_bullet_group, False)

            for bullet in player_hit:

                p.health -= bullet.damage

                x, y = bullet.rect.center

                explosion = Explosion(x, y, 1)

                explosion_group.add(explosion)

                bullet.kill()

                collision_fx.play()

            for bullet in player_bullet_group:

                planes_hit = pygame.sprite.spritecollide(bullet, enemy_group, False)

                for plane in planes_hit:

                    plane.health -= bullet.damage

                    if plane.health <= 0:

                        x, y = plane.rect.center

                        rand = random.random()

                        if rand >= 0.9:

                            power = Powerup(x, y)

                            powerup_group.add(power)

                        elif rand >= 0.3:

                            fuel = Fuel(x, y)

                            fuel_group.add(fuel)

                        plane_destroy_count += 1

                        blast_fx.play()

                    x, y = bullet.rect.center

                    explosion = Explosion(x, y, 1)

                    explosion_group.add(explosion)

                    bullet.kill()

                    collision_fx.play()

            player_collide = pygame.sprite.spritecollide(p, enemy_group, True)

            if player_collide:

                x, y = p.rect.center

                explosion = Explosion(x, y, 2)

                explosion_group.add(explosion)

                x, y = player_collide[0].rect.center

                explosion = Explosion(x, y, 2)

                explosion_group.add(explosion)

                p.health = 0

                p.alive = False

            if pygame.sprite.spritecollide(p, fuel_group, True):

                p.fuel += 25

                if p.fuel >= 100:

                    p.fuel = 100

                fuel_fx.play()

            if pygame.sprite.spritecollide(p, powerup_group, True):

                p.powerup += 2

                fuel_fx.play()

        if not p.alive or p.fuel <= -10:

            if len(explosion_group) == 0:

                game_page = False

                score_page = True

                reset()

        score += 1

        score_msg.update(score)

        fuel_color = RED if p.fuel <= 40 else GREEN

        pygame.draw.rect(win, fuel_color, (30, 20, p.fuel, 10), border_radius=4)

        pygame.draw.rect(win, WHITE, (30, 20, 100, 10), 2, border_radius=4)

        pygame.draw.rect(win, BLUE, (30, 32, p.health, 10), border_radius=4)

        pygame.draw.rect(win, WHITE, (30, 32, 100, 10), 2, border_radius=4)

        win.blit(plane_img, (10, 15))

    pygame.draw.rect(win, WHITE, (0,0, WIDTH, HEIGHT), 5, border_radius=4)

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

2、愤怒的墙

源码分享:

import pygame

import random

from objects import Player, Bar, Ball, Block, ScoreCard, Message, Particle, generate_particles

pygame.init()

SCREEN = WIDTH, HEIGHT = 288, 512

info = pygame.display.Info()

width = info.current_w

height = info.current_h

if width >= height:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME)

else:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME | pygame.SCALED | pygame.FULLSCREEN)

clock = pygame.time.Clock()

FPS = 45

# COLORS

RED = (255, 0, 0)

WHITE = (255, 255, 255)

BLACK = (0, 0, 0)

GRAY = (54, 69, 79)

c_list = [RED, BLACK, WHITE]

# Fonts

pygame.font.init()

score_font = pygame.font.Font('Fonts/BubblegumSans-Regular.ttf', 50)

# Sounds

coin_fx = pygame.mixer.Sound('Sounds/coin.mp3')

death_fx = pygame.mixer.Sound('Sounds/death.mp3')

move_fx = pygame.mixer.Sound('Sounds/move.mp3')

# backgrounds

bg_list = []

for i in range(1,5):

    if i == 2:

        ext = "jpeg"

    else:

        ext = "jpg"

    img = pygame.image.load(f"Assets/Backgrounds/bg{i}.{ext}")

    img = pygame.transform.scale(img, (WIDTH, HEIGHT))

    bg_list.append(img)

home_bg = pygame.image.load(f"Assets/Backgrounds/home.jpeg")

bg = home_bg

# objects

bar_group = pygame.sprite.Group()

ball_group = pygame.sprite.Group()

block_group = pygame.sprite.Group()

destruct_group = pygame.sprite.Group()

win_particle_group = pygame.sprite.Group()

bar_gap = 120

particles = []

p = Player(win)

score_card = ScoreCard(140, 40, win)

# Functions

def destroy_bird():

    x, y = p.rect.center

    for i in range (50):

        c = random.choice(c_list)

        particle = Particle(x,y, 1,c, win)

        destruct_group.add(particle)

def win_particles():

    for x,y in [(40, 120), (WIDTH - 20, 240), (15, HEIGHT - 30)]:

        for i in range(10):

            particle = Particle (x,y, 2, WHITE, win)

            win_particle_group.add(particle)

# Messages

title_font = "Fonts/Robus-BWqOd.otf"

dodgy = Message(134, 90, 100, "Angry",title_font, WHITE, win)

walls = Message(164, 145, 80, "Walls",title_font, WHITE, win)

tap_to_play_font = "Fonts/DebugFreeTrial-MVdYB.otf"

tap_to_play = Message(144, 400, 32, "TAP TO PLAY",tap_to_play_font, WHITE, win)

tap_to_replay = Message(144, 400, 30, "Tap to Replay",tap_to_play_font, WHITE, win)

# Variables

bar_width_list = [i for i in range (40,150,10)]

bar_frequency = 1200

bar_speed = 4

touched = False

pos = None

home_page = True

score_page = False

bird_dead = False

score = 0

high_score = 0

move_left = False

move_right = True

prev_x = 0

p_count = 0

running = True

while running:

    win.blit(bg, (0,0))

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE:

                running = False

        if event.type == pygame.MOUSEBUTTONDOWN and (home_page or score_page):

            home_page = False

            score_page = False

            win_particle_group.empty()

            bg = random.choice(bg_list)

            particles = []

            last_bar = pygame.time.get_ticks() - bar_frequency

            next_bar = 0

            bar_speed = 4

            bar_frequency = 1200

            bird_dead = False

            score = 0

            p_count = 0

            score_list = []

            for _ in range(15):

                x = random.randint(30, WIDTH - 30)

                y = random.randint(60, HEIGHT - 60)

                max = random.randint(8,16)

                b = Block(x,y,max, win)

                block_group.add(b)

        if event.type == pygame.MOUSEBUTTONDOWN and not home_page:

            if p.rect.collidepoint(event.pos):

                touched = True

                x, y = event.pos

                offset_x = p.rect.x - x

        if event.type == pygame.MOUSEBUTTONUP and not home_page:

            touched = False

        if event.type == pygame.MOUSEMOTION and not home_page:

            if touched:

                x, y = event.pos

                if move_right and prev_x > x:

                    move_right = False

                    move_left = True

                    move_fx.play()

                if move_left and  prev_x < x:

                    move_right = True

                    move_left = False

                    move_fx.play()

                prev_x = x

                p.rect.x =  x + offset_x

    if home_page:

        bg = home_bg

        particles = generate_particles(p, particles, WHITE, win)

        dodgy.update()

        walls.update()

        tap_to_play.update()

        p.update()

    elif score_page:

        bg = home_bg

        particles = generate_particles(p, particles, WHITE, win)

        tap_to_replay.update()

        p.update()

        score_msg.update()

        score_point.update()

        if p_count % 5 == 0:

            win_particles()

        p_count += 1

        win_particle_group.update()

    else:

        next_bar = pygame.time.get_ticks()

        if next_bar - last_bar >= bar_frequency and not bird_dead:

            bwidth = random.choice(bar_width_list)

            b1prime = Bar(0,0,bwidth+3,GRAY, win)

            b1 = Bar(0,-3,bwidth,WHITE,win)

            b2prime = Bar(bwidth+bar_gap+3, 0, WIDTH - bwidth - bar_gap, GRAY, win)

            b2 = Bar(bwidth+bar_gap, -3, WIDTH - bwidth - bar_gap, WHITE, win)

            bar_group.add(b1prime)

            bar_group.add(b1)

            bar_group.add(b2prime)

            bar_group.add(b2)

            color = random.choice(["red", "white"])

            pos = random.choice([0,1])

            if pos == 0:

                x = bwidth + 12

            elif pos == 1:

                x = bwidth + bar_gap - 12

            ball = Ball(x, 10, 1, color, win)

            ball_group.add(ball)

            last_bar = next_bar

        for ball in ball_group:

            if ball.rect.colliderect(p):

                if ball.color == "white":

                    ball.kill()

                    coin_fx.play()

                    score += 1

                    if score > high_score:

                        high_score += 1

                    score_card.animate = True

                elif ball.color == "red":

                    if not bird_dead:

                        death_fx.play()

                        destroy_bird()

                    bird_dead = True

                    bar_speed = 0

        if pygame.sprite.spritecollide(p, bar_group, False):

            if not bird_dead:

                death_fx.play()

                destroy_bird()

            bird_dead = True

            bar_speed = 0

        block_group.update()

        bar_group.update(bar_speed)

        ball_group.update(bar_speed)

        if bird_dead:

                destruct_group.update()

        score_card.update(score)

        if not bird_dead:

            particles = generate_particles(p, particles, WHITE, win)

            p.update()

        if score and score % 10 == 0:

            rem = score // 10

            if rem not in score_list:

                score_list.append(rem)

                bar_speed += 1

                bar_frequency -= 200

        if bird_dead and len(destruct_group) == 0:

            score_page = True

            font =  "Fonts/BubblegumSans-Regular.ttf"

            if score < high_score:

                score_msg = Message(144, 60, 55, "Score",font, WHITE, win)

            else:

                score_msg = Message(144, 60, 55, "New High",font, WHITE, win)

            score_point = Message(144, 110, 45, f"{score}", font, WHITE, win)

        if score_page:

            block_group.empty()

            bar_group.empty()

            ball_group.empty()

            p.reset()

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

3、圆弧冲刺

源码分享:

import random

import pygame

from objects import Player, Balls, Dot, Shadow, Particle, Message, BlinkingText, Button

pygame.init()

SCREEN = WIDTH, HEIGHT = 288, 512

CENTER = WIDTH //2, HEIGHT // 2

info = pygame.display.Info()

width = info.current_w

height = info.current_h

if width >= height:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME)

else:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME | pygame.SCALED | pygame.FULLSCREEN)

clock = pygame.time.Clock()

FPS = 60

# COLORS **********************************************************************

RED = (255,0,0)

GREEN = (0,177,64)

BLUE = (30, 144,255)

ORANGE = (252,76,2)

YELLOW = (254,221,0)

PURPLE = (155,38,182)

AQUA = (0,103,127)

WHITE = (255,255,255)

BLACK = (0,0,0)

color_list = [RED, GREEN, BLUE, ORANGE, YELLOW, PURPLE]

color_index = 0

color = color_list[color_index]

# FONTS ***********************************************************************

title_font = "Fonts/Aladin-Regular.ttf"

tap_to_play_font = "Fonts/BubblegumSans-Regular.ttf"

score_font = "Fonts/DalelandsUncialBold-82zA.ttf"

game_over_font = "Fonts/ghostclan.ttf"

# MESSAGES ********************************************************************

arc = Message(WIDTH-90, 200, 80, "Arc", title_font, WHITE, win)

dash = Message(80, 300, 60, "Dash", title_font, WHITE, win)

tap_to_play = BlinkingText(WIDTH//2, HEIGHT-60, 20, "Tap To Play", tap_to_play_font, WHITE, win)

game_msg = Message(80, 150, 40, "GAME", game_over_font, BLACK, win)

over_msg = Message(210, 150, 40, "OVER!", game_over_font, WHITE, win)

score_text = Message(90, 230, 20, "SCORE", None, BLACK, win)

best_text = Message(200, 230, 20, "BEST", None, BLACK, win)

score_msg = Message(WIDTH-60, 50, 50, "0", score_font, WHITE, win)

final_score_msg = Message(90, 280, 40, "0", tap_to_play_font, BLACK, win)

high_score_msg = Message(200, 280, 40, "0", tap_to_play_font, BLACK, win)

# SOUNDS **********************************************************************

score_fx = pygame.mixer.Sound('Sounds/point.mp3')

death_fx = pygame.mixer.Sound('Sounds/dead.mp3')

score_page_fx = pygame.mixer.Sound('Sounds/score_page.mp3')

pygame.mixer.music.load('Sounds/hk.mp3')

pygame.mixer.music.play(loops=-1)

pygame.mixer.music.set_volume(0.5)

# Button images

home_img = pygame.image.load('Assets/homeBtn.png')

replay_img = pygame.image.load('Assets/replay.png')

sound_off_img = pygame.image.load("Assets/soundOffBtn.png")

sound_on_img = pygame.image.load("Assets/soundOnBtn.png")

# Buttons

home_btn = Button(home_img, (24, 24), WIDTH // 4 - 18, 390)

replay_btn = Button(replay_img, (36,36), WIDTH // 2  - 18, 382)

sound_btn = Button(sound_on_img, (24, 24), WIDTH - WIDTH // 4 - 18, 390)

# GAME VARIABLES **************************************************************

MAX_RAD = 120

rad_delta = 50

# OBJECTS *********************************************************************

ball_group = pygame.sprite.Group()

dot_group = pygame.sprite.Group()

shadow_group = pygame.sprite.Group()

particle_group = pygame.sprite.Group()

p = Player(win)

ball_positions = [(CENTER[0]-105, CENTER[1]), (CENTER[0]+105, CENTER[1]),

                    (CENTER[0]-45, CENTER[1]), (CENTER[0]+45, CENTER[1]),

                    (CENTER[0], CENTER[1]-75), (CENTER[0], CENTER[1]+75)]

for index, pos in enumerate(ball_positions):

    if index in (0,1):

        type_ = 1

        inverter = 5

    if index in (2,3):

        type_ = 1

        inverter = 3

    if index in (4,5):

        type_ = 2

        inverter = 1

    ball = Balls(pos, type_, inverter, win)

    ball_group.add(ball)

dot_list = [(CENTER[0], CENTER[1]-MAX_RAD+3), (CENTER[0]+MAX_RAD-3, CENTER[1]),

            (CENTER[0], CENTER[1]+MAX_RAD-3), (CENTER[0]-MAX_RAD+3, CENTER[1])]

dot_index = random.choice([1,2,3,4])

dot_pos = dot_list[dot_index-1]

dot = Dot(*dot_pos, win)

dot_group.add(dot)

shadow = Shadow(dot_index, win)

shadow_group.add(shadow)

# VARIABLES *******************************************************************

clicked = False

num_clicks = 0

player_alive = True

sound_on = True

score = 0

highscore = 0

home_page = True

game_page = False

score_page = False

running = True

while running:

    win.fill(color)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE or \

                event.key == pygame.K_q:

                running = False

        if event.type == pygame.MOUSEBUTTONDOWN and home_page:

            home_page = False

            game_page = True

            score_page = False

            rad_delta = 50

            clicked = True

            score = 0

            num_clicks = 0

            player_alive = True

        if event.type == pygame.MOUSEBUTTONDOWN and game_page:

            if not clicked:

                clicked = True

                for ball in ball_group:

                    if num_clicks % ball.inverter == 0:

                        ball.dtheta *= -1

                p.set_move(dot_index)

                num_clicks += 1

                if num_clicks % 5 == 0:

                    color_index += 1

                    if color_index > len(color_list) - 1:

                        color_index = 0

                    color = color_list[color_index]

        if event.type == pygame.MOUSEBUTTONDOWN and game_page:

            clicked = False

    if home_page:

        for radius in [30, 60, 90, 120]:

            pygame.draw.circle(win, (0,0,0), CENTER, radius, 8)

            pygame.draw.circle(win, (255,255,255), CENTER, radius, 5)

        pygame.draw.rect(win, color, [CENTER[0]-10, CENTER[1]-MAX_RAD, MAX_RAD+50, MAX_RAD])

        pygame.draw.rect(win, color, [CENTER[0]-MAX_RAD, CENTER[1]-10, MAX_RAD, MAX_RAD+50])

        arc.update()

        dash.update()

        tap_to_play.update()

    if score_page:

        game_msg.update()

        over_msg.update()

        score_text.update(shadow=False)

        best_text.update(shadow=False)

        final_score_msg.update(score, shadow=False)

        high_score_msg.update(highscore, shadow=False)

        if home_btn.draw(win):

            home_page = True

            score_page = False

            game_page = False

            score = 0

            score_msg = Message(WIDTH-60, 50, 50, "0", score_font, WHITE, win)

        if replay_btn.draw(win):

            home_page = False

            score_page = False

            game_page = True

            player_alive = True

            score = 0

            score_msg = Message(WIDTH-60, 50, 50, "0", score_font, WHITE, win)

            p = Player(win)

        if sound_btn.draw(win):

            sound_on = not sound_on

            if sound_on:

                sound_btn.update_image(sound_on_img)

                pygame.mixer.music.play(loops=-1)

            else:

                sound_btn.update_image(sound_off_img)

                pygame.mixer.music.stop()

    if game_page:

        for radius in [30 + rad_delta, 60 + rad_delta, 90 + rad_delta, 120 + rad_delta]:

            if rad_delta > 0:

                radius -= 1

                rad_delta -= 1

            pygame.draw.circle(win, (0,0,0), CENTER, radius, 5)

        pygame.draw.rect(win, color, [CENTER[0]-10, CENTER[1]-MAX_RAD, 20, MAX_RAD*2])

        pygame.draw.rect(win, color, [CENTER[0]-MAX_RAD, CENTER[1]-10, MAX_RAD*2, 20])

        if rad_delta <= 0:

            p.update(player_alive, color, shadow_group)

            shadow_group.update()

            ball_group.update()

            dot_group.update()

            particle_group.update()

            score_msg.update(score)

            for dot in dot_group:

                if dot.rect.colliderect(p):

                    dot.kill()

                    score_fx.play()

                    score += 1

                    if highscore <= score:

                        highscore = score

            if pygame.sprite.spritecollide(p, ball_group, False) and player_alive:

                death_fx.play()

                x, y = p.rect.center

                for i in range(20):

                    particle = Particle(x, y, WHITE, win)

                    particle_group.add(particle)

                player_alive = False

                p.reset()

            if p.can_move and len(dot_group) == 0 and player_alive:

                dot_index = random.randint(1,4)

                dot_pos = dot_list[dot_index-1]

                dot = Dot(*dot_pos, win)

                dot_group.add(dot)

                shadow_group.empty()

                shadow = Shadow(dot_index, win)

                shadow_group.add(shadow)

            if not player_alive and len(particle_group) == 0:

                game_page = False

                score_page = True

                dot_group.empty()

                shadow_group.empty()

                for ball in ball_group:

                    ball.reset()

                score_page_fx.play()

    pygame.draw.rect(win, WHITE, (0, 0, WIDTH, HEIGHT), 5, border_radius=10)

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

4、行星游戏

源码分享:

import random

import pygame

from pygame.locals import KEYDOWN, QUIT, K_ESCAPE, K_SPACE, K_q, K_e

from objects import Rocket, Asteroid, Bullet, Explosion

### SETUP *********************************************************************

SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 500, 500

pygame.mixer.init()

pygame.init()

clock = pygame.time.Clock()

win = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

pygame.display.set_caption('Asteroids')

gunshot_sound = pygame.mixer.Sound("music/laser.wav")

explosion_sound = pygame.mixer.Sound("music/explosion.mp3")

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

# text = font.render('', True, green, blue)

### Objects & Events **********************************************************

ADDAST1 = pygame.USEREVENT + 1

ADDAST2 = pygame.USEREVENT + 2

ADDAST3 = pygame.USEREVENT + 3

ADDAST4 = pygame.USEREVENT + 4

ADDAST5 = pygame.USEREVENT + 5

pygame.time.set_timer(ADDAST1, 2000)

pygame.time.set_timer(ADDAST2, 6000)

pygame.time.set_timer(ADDAST3, 10000)

pygame.time.set_timer(ADDAST4, 15000)

pygame.time.set_timer(ADDAST5, 20000)

rocket = Rocket(SIZE)

asteroids = pygame.sprite.Group()

bullets = pygame.sprite.Group()

explosions = pygame.sprite.Group()

all_sprites = pygame.sprite.Group()

all_sprites.add(rocket)

backgrounds = [f'assets/background/bg{i}s.png' for i in range(1,5)]

bg = pygame.image.load(random.choice(backgrounds))

startbg = pygame.image.load('assets/start.jpg')

### Game **********************************************************************

if __name__ == '__main__':

    score = 0

    running = True

    gameStarted = False

    musicStarted = False

    while running:

        if not gameStarted:

            if not musicStarted:

                pygame.mixer.music.load('music/Apoxode_-_Electric_1.mp3')

                pygame.mixer.music.play(loops=-1)

                musicStarted = True

            for event in pygame.event.get():

                if event.type == QUIT:

                    running = False

                if event.type == KEYDOWN:

                    if event.key == K_SPACE:

                        gameStarted = True

                        musicStarted = False

                win.blit(startbg, (0,0))        

        else:

            if not musicStarted:

                pygame.mixer.music.load('music/rpg_ambience_-_exploration.ogg')

                pygame.mixer.music.play(loops=-1)

                musicStarted = True

            for event in pygame.event.get():

                if event.type == QUIT:

                    running = False

                if event.type == KEYDOWN:

                    if event.key == K_ESCAPE:

                        running = False

                    if event.key == K_SPACE:

                        pos = rocket.rect[:2]

                        bullet = Bullet(pos, rocket.dir, SIZE)

                        bullets.add(bullet)

                        all_sprites.add(bullet)

                        gunshot_sound.play()

                    if event.key == K_q:

                        rocket.rotate_left()

                    if event.key == K_e:

                        rocket.rotate_right()

                elif event.type == ADDAST1:

                    ast = Asteroid(1, SIZE)

                    asteroids.add(ast)

                    all_sprites.add(ast)

                elif event.type == ADDAST2:

                    ast = Asteroid(2, SIZE)

                    asteroids.add(ast)

                    all_sprites.add(ast)

                elif event.type == ADDAST3:

                    ast = Asteroid(3, SIZE)

                    asteroids.add(ast)

                    all_sprites.add(ast)

                elif event.type == ADDAST4:

                    ast = Asteroid(4, SIZE)

                    asteroids.add(ast)

                    all_sprites.add(ast)

                elif event.type == ADDAST5:

                    ast = Asteroid(5, SIZE)

                    asteroids.add(ast)

                    all_sprites.add(ast)

            pressed_keys = pygame.key.get_pressed()

            rocket.update(pressed_keys)

            asteroids.update()

            bullets.update()

            explosions.update()

            win.blit(bg, (0,0))

            explosions.draw(win)

            for sprite in all_sprites:

                win.blit(sprite.surf, sprite.rect)

            win.blit(rocket.surf, rocket.rect)

            if pygame.sprite.spritecollideany(rocket, asteroids):

                rocket.kill()

                score = 0

                for sprite in all_sprites:

                    sprite.kill()

                all_sprites.empty()

                rocket = Rocket(SIZE)

                all_sprites.add(rocket)

                gameStarted = False

                musicStarted = False

            for bullet in bullets:

                collision = pygame.sprite.spritecollide(bullet, asteroids, True)

                if collision:

                    pos = bullet.rect[:2]

                    explosion = Explosion(pos)

                    explosions.add(explosion)

                    score += 1

                    explosion_sound.play()

                    bullet.kill()

                    bullets.remove(bullet)

            text = font.render('Score : ' + str(score), 1, (200,255,0))

            win.blit(text, (340, 10))

        pygame.display.flip()

        clock.tick(30)

    pygame.quit()

5、弹跳的球

源码分享:

import os

import pygame

from player import Ball

from world import World, load_level

from texts import Text, Message

from button import Button, LevelButton

pygame.init()

WIDTH, HEIGHT = 192, 212

win = pygame.display.set_mode((WIDTH, HEIGHT), pygame.NOFRAME)

pygame.display.set_caption('Bounce')

clock = pygame.time.Clock()

FPS = 30

# GAME VARIABLES **************************************************************

ROWS = 12

MAX_COLS = 150

TILE_SIZE = 16

MAX_LEVEL = 8

# COLORS **********************************************************************

BLUE = (175, 207, 240)

BLUE2 = (0, 0, 255)

WHITE = (255, 255, 255)

# FONTS ***********************************************************************

health_font = "Fonts/ARCADECLASSIC.TTF"

level_text = Text(health_font, 24)

health_text = Message(40, WIDTH + 10, 19, "x3", health_font, WHITE, win)

select_level_text = Message(WIDTH//2, 20, 24, "Select  Level", health_font, BLUE2, win)

current_level_text = Message(WIDTH - 40, WIDTH + 10, 20, "Level 1", health_font, WHITE, win)

you_win = Message(WIDTH //2, HEIGHT//2, 40, "You  Win", health_font, BLUE2, win)

# SOUNDS **********************************************************************

click_fx = pygame.mixer.Sound('Sounds/click.mp3')

life_fx = pygame.mixer.Sound('Sounds/gate.mp3')

checkpoint_fx = pygame.mixer.Sound('Sounds/checkpoint.mp3')

pygame.mixer.music.load('Sounds/track1.wav')

pygame.mixer.music.play(loops=-1)

pygame.mixer.music.set_volume(0.4)

# LOADING IMAGES **************************************************************

ball_image = pygame.image.load('Assets/ball.png')

splash_img = pygame.transform.scale(pygame.image.load('Assets/splash_logo.png'),

             (2*WIDTH, HEIGHT))

bounce_img = pygame.image.load('Assets/menu_logo.png')

game_lost_img = pygame.image.load('Assets/lose.png')

game_lost_img = pygame.transform.scale(game_lost_img, (WIDTH//2, 80))

level_locked_img = pygame.image.load('Assets/level_locked.png')

level_locked_img = pygame.transform.scale(level_locked_img, (40, 40))

level_unlocked_img = pygame.image.load('Assets/level_unlocked.png')

level_unlocked_img = pygame.transform.scale(level_unlocked_img, (40, 40))

play_img = pygame.image.load('Assets/play.png')

restart_img = pygame.image.load('Assets/restart.png')

menu_img = pygame.image.load('Assets/menu.png')

sound_on_img = pygame.image.load('Assets/SoundOnBtn.png')

sound_off_img = pygame.image.load('Assets/SoundOffBtn.png')

game_won_img = pygame.image.load('Assets/game won.png')

# BUTTONS *********************************************************************

play_btn = Button(play_img, False, 45, 130)

sound_btn = Button(sound_on_img, False, 45, 170)

restart_btn = Button(restart_img, False, 45, 130)

menu_btn = Button(menu_img, False, 45, 170)

# LEVEL TEXT & BUTTONS ********************************************************

level_btns = []

for level in range(MAX_LEVEL):

    text = level_text.render(f'{level+1}', (255, 255, 255))

    r = level // 3

    c = level % 3

    btn = LevelButton(level_locked_img, (40, 40), 20 + c * 55, 50 + r * 55, text)

    level_btns.append(btn)

# GROUPS **********************************************************************

spikes_group = pygame.sprite.Group()

inflator_group = pygame.sprite.Group()

deflator_group = pygame.sprite.Group()

enemy_group = pygame.sprite.Group()

exit_group = pygame.sprite.Group()

checkpoint_group = pygame.sprite.Group()

health_group = pygame.sprite.Group()

objects_groups = [spikes_group, inflator_group, deflator_group, enemy_group, exit_group, 

                    checkpoint_group, health_group]

collision_groups = [inflator_group, deflator_group]

# RESET ***********************************************************************

def reset_level_data(level):

    for group in objects_groups:

        group.empty()

    # LOAD LEVEL WORLD

    world_data, level_length = load_level(level)

    w = World(objects_groups)

    w.generate_world(world_data, win)

    return world_data, level_length, w

def reset_player_data(level):

    if level == 1:

        x, y = 64, 50

    if level == 2:

        x, y = 65, 50

    if level == 3:

        x, y = 64, 50

    if level == 4:

        x, y = 63, 50

    if level == 5:

        x, y = 64, 50

    if level == 6:

        x, y = 48, 50

    if level == 7:

        x, y = 78, 80

    if level == 8:

        x, y = 112,100

    p = Ball(x, y)

    moving_left = False

    moving_right = False

    return p, moving_left, moving_right

# VARIABLES *******************************************************************

moving_left = False

moving_right = False

SCROLL_THRES = 80

screen_scroll = 0

level_scroll = 0

level = 1

next_level = False

reset_level = False

checkpoint = None

health = 3

splash_count = 0

sound_on = True

logo_page = True

home_page = False

level_page = False

game_page = False

restart_page = False

win_page = False

running = True

while running:

    win.fill(BLUE)

    pygame.draw.rect(win, (255, 255,255), (0, 0, WIDTH, HEIGHT), 1, border_radius=5)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE or \

                event.key == pygame.K_q:

                running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_LEFT:

                moving_left = True

            if event.key == pygame.K_RIGHT:

                moving_right = True

            if event.key == pygame.K_UP:

                if not p.jump:

                    p.jump = True

        if event.type == pygame.KEYUP:

            if event.key == pygame.K_LEFT:

                moving_left = False

            if event.key == pygame.K_RIGHT:

                moving_right = False

    if logo_page:

        win.blit(splash_img, (-100,0))

        splash_count += 1

        if splash_count % 50 == 0:

            logo_page = False

            home_page = True

    if home_page:

        win.blit(bounce_img, (10,10))

        if play_btn.draw(win):

            click_fx.play()

            home_page = False

            level_page = True

        if sound_btn.draw(win):

            click_fx.play()

            sound_on = not sound_on

            if sound_on:

                sound_btn.update_image(sound_on_img)

                pygame.mixer.music.play(loops=-1)

            else:

                sound_btn.update_image(sound_off_img)

                pygame.mixer.music.stop()

    if level_page:

        select_level_text.update(shadow=False)

        for index, btn in enumerate(level_btns):

            if index < level:

                if not btn.unlocked:

                    btn.unlocked = True

                    btn.update_image(level_unlocked_img)

            if btn.draw(win):

                if index < level:

                    click_fx.play()

                    level_page = False

                    game_page = True

                    level = index + 1

                    screen_scroll = 0

                    level_scroll = 0

                    health = 3

                    world_data, level_length, w = reset_level_data(level)

                    p, moving_left, moving_right = reset_player_data(level)

    if restart_page:

        win.blit(game_lost_img, (45,20))

        if restart_btn.draw(win):

            click_fx.play()

            world_data, level_length, w = reset_level_data(level)

            p, moving_left, moving_right = reset_player_data(level)

            level_scroll = 0

            screen_scroll = 0

            health = 3

            checkpoint = None

            restart_page = False

            game_page = True

        if menu_btn.draw(win):

            click_fx.play()

            home_page = True

            restart_page = False

    if win_page:

        win.blit(game_won_img, (45, 20))

        you_win.update()

        if menu_btn.draw(win):

            click_fx.play()

            home_page = True

            win_page = False

            restart_page = False

    if game_page:

        w.update(screen_scroll)

        w.draw(win)

        spikes_group.update(screen_scroll)

        spikes_group.draw(win)

        health_group.update(screen_scroll)

        health_group.draw(win)

        inflator_group.update(screen_scroll)

        inflator_group.draw(win)

        deflator_group.update(screen_scroll)

        deflator_group.draw(win)

        exit_group.update(screen_scroll)

        exit_group.draw(win)

        checkpoint_group.update(screen_scroll)

        checkpoint_group.draw(win)

        enemy_group.update(screen_scroll)

        enemy_group.draw(win)

        screen_scroll = 0

        p.update(moving_left, moving_right, w, collision_groups)

        p.draw(win)

        if ((p.rect.right >= WIDTH - SCROLL_THRES) and level_scroll < (level_length * 16) - WIDTH) \

                or ((p.rect.left <= SCROLL_THRES) and level_scroll > 0):

                dx = p.dx

                p.rect.x -= dx

                screen_scroll = -dx

                level_scroll += dx

        if len(exit_group) > 0:

            exit = exit_group.sprites()[0]

            if not exit.open:

                if abs(p.rect.x - exit.rect.x) <= 80 and len(health_group) == 0:

                    exit.open = True

            if p.rect.colliderect(exit.rect) and exit.index == 11:

                checkpoint = None

                checkpoint_fx.play()

                level += 1

                if level < MAX_LEVEL:

                    checkpoint = False

                    reset_level = True

                    next_level = True

                else:

                    checkpoint = None

                    win_page = True

        cp = pygame.sprite.spritecollide(p, checkpoint_group, False)

        if cp:

            checkpoint = cp[0]

            if not checkpoint.catched:

                checkpoint_fx.play()

                checkpoint.catched = True

                checkpoint_pos = p.rect.center

                checkpoint_screen_scroll = screen_scroll

                checkpoint_level_scroll = level_scroll

        if pygame.sprite.spritecollide(p, spikes_group, False):

            reset_level = True

        if pygame.sprite.spritecollide(p, health_group, True):

            health += 1

            life_fx.play()

        if pygame.sprite.spritecollide(p, enemy_group, False):

            reset_level = True

        if reset_level:

            if health > 0:

                if next_level:

                    world_data, level_length, w = reset_level_data(level)

                    p, moving_left, moving_right = reset_player_data(level)

                    level_scroll = 0

                    health = 3

                    checkpoint = None

                    next_level = False

                elif checkpoint:

                    checkpoint_dx = level_scroll - checkpoint_level_scroll

                    w.update(checkpoint_dx)

                    for group in objects_groups:

                        group.update(checkpoint_dx)

                    p.rect.center = checkpoint_pos

                    level_scroll = checkpoint_level_scroll

                else:

                    w.update(level_scroll)

                    for group in objects_groups:

                        group.update(level_scroll)

                    p, moving_left, moving_right = reset_player_data(level)

                    level_scroll = 0

                screen_scroll = 0

                reset_level = False

                health -= 1

            else:

                restart_page = True

                game_page = False

                reset_level = False

        # Drawing info bar

        pygame.draw.rect(win, (25, 25, 25), (0, HEIGHT-20, WIDTH, 20))

        pygame.draw.rect(win, (255, 255,255), (0, 0, WIDTH, WIDTH), 2, border_radius=5)

        win.blit(ball_image, (5, WIDTH + 2))

        health_text.update(f'x{health}', shadow=False)

        current_level_text.update(f'Level {level}', shadow=False)

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

6、汽车避障

源码分享:

import pygame

import random

from objects import Road, Player, Nitro, Tree, Button, \

                    Obstacle, Coins, Fuel

pygame.init()

SCREEN = WIDTH, HEIGHT = 288, 512

info = pygame.display.Info()

width = info.current_w

height = info.current_h

if width >= height:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME)

else:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME | pygame.SCALED | pygame.FULLSCREEN)

clock = pygame.time.Clock()

FPS = 30

lane_pos = [50, 95, 142, 190]

# COLORS **********************************************************************

WHITE = (255, 255, 255)

BLUE = (30, 144,255)

RED = (255, 0, 0)

GREEN = (0, 255, 0)

BLACK = (0, 0, 20)

# FONTS ***********************************************************************

font = pygame.font.SysFont('cursive', 32)

select_car = font.render('Select Car', True, WHITE)

# IMAGES **********************************************************************

bg = pygame.image.load('Assets/bg.png')

home_img = pygame.image.load('Assets/home.png')

play_img = pygame.image.load('Assets/buttons/play.png')

end_img = pygame.image.load('Assets/end.jpg')

end_img = pygame.transform.scale(end_img, (WIDTH, HEIGHT))

game_over_img = pygame.image.load('Assets/game_over.png')

game_over_img = pygame.transform.scale(game_over_img, (220, 220))

coin_img = pygame.image.load('Assets/coins/1.png')

dodge_img = pygame.image.load('Assets/car_dodge.png')

left_arrow = pygame.image.load('Assets/buttons/arrow.png')

right_arrow = pygame.transform.flip(left_arrow, True, False)

home_btn_img = pygame.image.load('Assets/buttons/home.png')

replay_img = pygame.image.load('Assets/buttons/replay.png')

sound_off_img = pygame.image.load("Assets/buttons/soundOff.png")

sound_on_img = pygame.image.load("Assets/buttons/soundOn.png")

cars = []

car_type = 0

for i in range(1, 9):

    img = pygame.image.load(f'Assets/cars/{i}.png')

    img = pygame.transform.scale(img, (59, 101))

    cars.append(img)

nitro_frames = []

nitro_counter = 0

for i in range(6):

    img = pygame.image.load(f'Assets/nitro/{i}.gif')

    img = pygame.transform.flip(img, False, True)

    img = pygame.transform.scale(img, (18, 36))

    nitro_frames.append(img)

# FUNCTIONS *******************************************************************

def center(image):

    return (WIDTH // 2) - image.get_width() // 2

# BUTTONS *********************************************************************

play_btn = Button(play_img, (100, 34), center(play_img)+10, HEIGHT-80)

la_btn = Button(left_arrow, (32, 42), 40, 180)

ra_btn = Button(right_arrow, (32, 42), WIDTH-60, 180)

home_btn = Button(home_btn_img, (24, 24), WIDTH // 4 - 18, HEIGHT - 80)

replay_btn = Button(replay_img, (36,36), WIDTH // 2  - 18, HEIGHT - 86)

sound_btn = Button(sound_on_img, (24, 24), WIDTH - WIDTH // 4 - 18, HEIGHT - 80)

# SOUNDS **********************************************************************

click_fx = pygame.mixer.Sound('Sounds/click.mp3')

fuel_fx = pygame.mixer.Sound('Sounds/fuel.wav')

start_fx = pygame.mixer.Sound('Sounds/start.mp3')

restart_fx = pygame.mixer.Sound('Sounds/restart.mp3')

coin_fx = pygame.mixer.Sound('Sounds/coin.mp3')

pygame.mixer.music.load('Sounds/mixkit-tech-house-vibes-130.mp3')

pygame.mixer.music.play(loops=-1)

pygame.mixer.music.set_volume(0.6)

# OBJECTS *********************************************************************

road = Road()

nitro = Nitro(WIDTH-80, HEIGHT-80)

p = Player(100, HEIGHT-120, car_type)

tree_group = pygame.sprite.Group()

coin_group = pygame.sprite.Group()

fuel_group = pygame.sprite.Group()

obstacle_group = pygame.sprite.Group()

# VARIABLES *******************************************************************

home_page = True

car_page = False

game_page = False

over_page = False

move_left = False

move_right = False

nitro_on = False

sound_on = True

counter = 0

counter_inc = 1

# speed = 3

speed = 10

dodged = 0

coins = 0

cfuel = 100

endx, enddx = 0, 0.5

gameovery = -50

running = True

while running:

    win.fill(BLACK)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE or event.key == pygame.K_q:

                running = False

            if event.key == pygame.K_LEFT:

                move_left = True

            if event.key == pygame.K_RIGHT:

                move_right = True

            if event.key == pygame.K_n:

                nitro_on = True

        if event.type == pygame.KEYUP:

            if event.key == pygame.K_LEFT:

                move_left = False

            if event.key == pygame.K_RIGHT:

                move_right = False

            if event.key == pygame.K_n:

                nitro_on = False

                speed = 3

                counter_inc = 1

        if event.type == pygame.MOUSEBUTTONDOWN:

            x, y = event.pos

            if nitro.rect.collidepoint((x, y)):

                nitro_on = True

            else:

                if x <= WIDTH // 2:

                    move_left = True

                else:

                    move_right = True

        if event.type == pygame.MOUSEBUTTONUP:

            move_left = False

            move_right = False

            nitro_on = False

            speed = 3

            counter_inc = 1

    if home_page:

        win.blit(home_img, (0,0))

        counter += 1

        if counter % 60 == 0:

            home_page = False

            car_page = True

    if car_page:

        win.blit(select_car, (center(select_car), 80))

        win.blit(cars[car_type], (WIDTH//2-30, 150))

        if la_btn.draw(win):

            car_type -= 1

            click_fx.play()

            if car_type < 0:

                car_type = len(cars) - 1

        if ra_btn.draw(win):

            car_type += 1

            click_fx.play()

            if car_type >= len(cars):

                car_type = 0

        if play_btn.draw(win):

            car_page = False

            game_page = True

            start_fx.play()

            p = Player(100, HEIGHT-120, car_type)

            counter = 0

    if over_page:

        win.blit(end_img, (endx, 0))

        endx += enddx

        if endx >= 10 or endx<=-10:

            enddx *= -1

        win.blit(game_over_img, (center(game_over_img), gameovery))

        if gameovery < 16:

            gameovery += 1

        num_coin_img = font.render(f'{coins}', True, WHITE)

        num_dodge_img = font.render(f'{dodged}', True, WHITE)

        distance_img = font.render(f'Distance : {counter/1000:.2f} km', True, WHITE)

        win.blit(coin_img, (80, 240))

        win.blit(dodge_img, (50, 280))

        win.blit(num_coin_img, (180, 250))

        win.blit(num_dodge_img, (180, 300))

        win.blit(distance_img, (center(distance_img), (350)))

        if home_btn.draw(win):

            over_page = False

            home_page = True

            coins = 0

            dodged = 0

            counter = 0

            nitro.gas = 0

            cfuel = 100

            endx, enddx = 0, 0.5

            gameovery = -50

        if replay_btn.draw(win):

            over_page = False

            game_page = True

            coins = 0

            dodged = 0

            counter = 0

            nitro.gas = 0

            cfuel = 100

            endx, enddx = 0, 0.5

            gameovery = -50

            restart_fx.play()

        if sound_btn.draw(win):

            sound_on = not sound_on

            if sound_on:

                sound_btn.update_image(sound_on_img)

                pygame.mixer.music.play(loops=-1)

            else:

                sound_btn.update_image(sound_off_img)

                pygame.mixer.music.stop()

    if game_page:

        win.blit(bg, (0,0))

        road.update(speed)

        road.draw(win)

        counter += counter_inc

        if counter % 60 == 0:

            tree = Tree(random.choice([-5, WIDTH-35]), -20)

            tree_group.add(tree)

        if counter % 270 == 0:

            type = random.choices([1, 2], weights=[6, 4], k=1)[0]

            x = random.choice(lane_pos)+10

            if type == 1:

                count = random.randint(1, 3)

                for i in range(count):

                    coin = Coins(x,-100 - (25 * i))

                    coin_group.add(coin)

            elif type == 2:

                fuel = Fuel(x, -100)

                fuel_group.add(fuel)

        elif counter % 90 == 0:

            obs = random.choices([1, 2, 3], weights=[6,2,2], k=1)[0]

            obstacle = Obstacle(obs)

            obstacle_group.add(obstacle)

        if nitro_on and nitro.gas > 0:

            x, y = p.rect.centerx - 8, p.rect.bottom - 10

            win.blit(nitro_frames[nitro_counter], (x, y))

            nitro_counter = (nitro_counter + 1) % len(nitro_frames)

            speed = 10

            if counter_inc == 1:

                counter = 0

                counter_inc = 5

        if nitro.gas <= 0:

            speed = 3

            counter_inc = 1

        nitro.update(nitro_on)

        nitro.draw(win)

        obstacle_group.update(speed)

        obstacle_group.draw(win)

        tree_group.update(speed)

        tree_group.draw(win)

        coin_group.update(speed)

        coin_group.draw(win)

        fuel_group.update(speed)

        fuel_group.draw(win)

        p.update(move_left, move_right)

        p.draw(win)

        if cfuel > 0:

            pygame.draw.rect(win, GREEN, (20, 20, cfuel, 15), border_radius=5)

        pygame.draw.rect(win, WHITE, (20, 20, 100, 15), 2, border_radius=5)

        cfuel -= 0.05

        # COLLISION DETECTION & KILLS

        for obstacle in obstacle_group:

            if obstacle.rect.y >= HEIGHT:

                if obstacle.type == 1:

                    dodged += 1

                obstacle.kill() 

            if pygame.sprite.collide_mask(p, obstacle):

                pygame.draw.rect(win, RED, p.rect, 1)

                speed = 0

                game_page = False

                over_page = True

                tree_group.empty()

                coin_group.empty()

                fuel_group.empty()

                obstacle_group.empty()

        if pygame.sprite.spritecollide(p, coin_group, True):

            coins += 1

            coin_fx.play()

        if pygame.sprite.spritecollide(p, fuel_group, True):

            cfuel += 25

            fuel_fx.play()

            if cfuel >= 100:

                cfuel = 100

    pygame.draw.rect(win, BLUE, (0, 0, WIDTH, HEIGHT), 3)

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

# 今天给大家介绍一款Python制作的汽车避障小游戏

# 主要通过Pygame实现的,运行代码,选择车型,进入游戏

# 可以控制左右移动,点击右下角可以进行加速

# 金币可以增加积分,撞到障碍物则游戏介绍

7、洞窟物语

源码分享:

import pygame

import pickle

from objects import World, load_level, Button, Player, Portal, game_data

pygame.init()

SCREEN = WIDTH, HEIGHT = 288, 512

win = pygame.display.set_mode(SCREEN, pygame.SCALED | pygame.FULLSCREEN)

clock = pygame.time.Clock()

FPS = 45

tile_size = 16

# Images

bg = pygame.image.load("Assets/bg.png")

cave_story = pygame.transform.rotate(pygame.image.load("Assets/cave_story.png"), 90)

cave_story = pygame.transform.scale(cave_story, (150,300))

game_won_img = pygame.transform.rotate(pygame.image.load("Assets/win.png"), -90)

game_won_img = pygame.transform.scale(game_won_img, (150,300))

# Sounds

pygame.mixer.music.load('Sounds/goodbyte_sad-rpg-town.mp3')

pygame.mixer.music.play(loops=-1)

replay_fx =  pygame.mixer.Sound('Sounds/replay.wav')

# Buttons

move_btn = pygame.image.load("Assets/movement.jpeg")

move_btn = pygame.transform.rotate(move_btn, -90)

move_btn = pygame.transform.scale(move_btn, (42, HEIGHT))

play_img = pygame.transform.rotate(pygame.image.load("Assets/play.png"), -90)

play_btn = Button(play_img, (60, 150), 30, 170)

quit_img = pygame.transform.rotate(pygame.image.load("Assets/quit.png"), -90)

quit_btn = Button(quit_img, (60, 150), 140, 170)

replay_img = pygame.transform.rotate(pygame.image.load("Assets/replay.png"), -90)

replay_btn = Button(replay_img, (40, 40), 100, 190)

sound_off_img = pygame.transform.rotate(pygame.image.load("Assets/sound_off.png"), -90)

sound_on_img = pygame.transform.rotate(pygame.image.load("Assets/sound_on.png"), -90)

sound_btn = Button(sound_on_img, (40, 40), 100, 260)

# Variables

current_level = 1

MAX_LEVEL = 3

show_keys = True

pressed_keys = [False, False, False, False]

dir_dict = {

    'Up' : pygame.Rect(5, 27, 35, 50),

    'Down' : pygame.Rect(5, 160, 35, 50),

    'Left' :  pygame.Rect(5, 320, 35, 50),

    'Right' : pygame.Rect(5, 450, 35, 50)

}

# groups 

diamond_group = pygame.sprite.Group()

spike_group = pygame.sprite.Group()

plant_group = pygame.sprite.Group()

board_group = pygame.sprite.Group()

chain_group = pygame.sprite.Group()

groups = [diamond_group, spike_group, plant_group, board_group, chain_group]

data = load_level(current_level)

(player_x, player_y), (portal_x, portal_y) = game_data(current_level)

world = World(win, data, groups)

player = Player(win, (player_x,player_y), world, groups)

portal = Portal(portal_x, portal_y, win)

game_started = False

game_over = False

game_won = False

replay_menu = False

sound_on = True

bgx = 0

bgcounter = 0

bgdx = 1

running = True

while running:

    win.blit(bg, (bgx, 0))

    for group in groups:

        group.draw(win)

    world.draw()

    if not game_started:

        win.blit(cave_story, (100,100))

        if play_btn.draw(win):

            game_started = True

    elif game_won:

        win.blit(game_won_img, (100,100))

    else:

        if show_keys:

            win.blit(move_btn, (0,0))

            bgcounter += 1

            if bgcounter >= 15:

                bgcounter = 0

                bgx += bgdx

                if bgx < 0 or bgx >5 :

                    bgdx *= -1

    #   for rect in dir_dict:

    #       pygame.draw.rect(win, (255, 0, 0), dir_dict[rect])

        for event in pygame.event.get():

            if event.type == pygame.QUIT:

                running = False

            if event.type == pygame.MOUSEBUTTONDOWN:

                pos = event.pos

                if show_keys:

                    if dir_dict["Up"].collidepoint(pos):

                        pressed_keys[0] = True

                    if dir_dict["Down"].collidepoint(pos):

                        pressed_keys[1] = True

                    if dir_dict["Left"].collidepoint(pos):

                        pressed_keys[2] = True

                    if dir_dict["Right"].collidepoint(pos):

                        pressed_keys[3] = True

            if event.type == pygame.MOUSEBUTTONUP:

                pressed_keys = [False, False, False, False]

        portal.update()

        if not game_over:

            game_over = player.update(pressed_keys, game_over)

            if game_over:

                show_keys = False

                replay_menu = True

        if player.rect.colliderect(portal) and player.rect.top > portal.rect.top and player.rect.bottom < portal.rect.bottom:

            if current_level < MAX_LEVEL:

                current_level += 1

                for group in groups:

                    group.empty()

                data = load_level(current_level)

                (player_x, player_y), (portal_x, portal_y) = game_data(current_level)

                world = World(win, data, groups)

                player = Player(win, (player_x,player_y), world, groups)

                portal = Portal(portal_x, portal_y, win)

            else:

                show_keys = False

                game_won = True

        if replay_menu:

            if quit_btn.draw(win):

                running = False

            if sound_btn.draw(win):

                sound_on = not sound_on

                if sound_on:

                    sound_btn.update_image(sound_on_img)

                    pygame.mixer.music.play(loops=-1)

                else:

                    sound_btn.update_image(sound_off_img)

                    pygame.mixer.music.stop()

            if replay_btn.draw(win):

                show_keys = True

                replay_menu = False

                game_over = False

                replay_fx.play()

                for group in groups:

                    group.empty()

                data = load_level(current_level)

                (player_x, player_y), (portal_x, portal_y) = game_data(current_level)

                world = World(win, data, groups)

                player = Player(win, (player_x,player_y), world, groups)

                portal = Portal(portal_x, portal_y, win)

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

8、联系

源码分享:

# Connected

# Author : Prajjwal Pathak (pyguru)

# Date : Thursday, 8 August, 2021

import random

import pygame

from objects import Balls, Coins, Tiles, Particle, Message, Button

pygame.init()

SCREEN = WIDTH, HEIGHT = 288, 512

CENTER = WIDTH //2, HEIGHT // 2

info = pygame.display.Info()

width = info.current_w

height = info.current_h

if width >= height:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME)

else:

    win = pygame.display.set_mode(SCREEN, pygame.NOFRAME | pygame.SCALED | pygame.FULLSCREEN)

pygame.display.set_caption('Connected')

clock = pygame.time.Clock()

FPS = 90

# COLORS **********************************************************************

RED = (255,0,0)

GREEN = (0,177,64)

BLUE = (30, 144,255)

ORANGE = (252,76,2)

YELLOW = (254,221,0)

PURPLE = (155,38,182)

AQUA = (0,103,127)

WHITE = (255,255,255)

BLACK = (0,0,0)

GRAY = (25, 25, 25)

color_list = [PURPLE, GREEN, BLUE, ORANGE, YELLOW, RED]

color_index = 0

color = color_list[color_index]

# SOUNDS **********************************************************************

flip_fx = pygame.mixer.Sound('Sounds/flip.mp3')

score_fx = pygame.mixer.Sound('Sounds/point.mp3')

dead_fx = pygame.mixer.Sound('Sounds/dead.mp3')

score_page_fx = pygame.mixer.Sound('Sounds/score_page.mp3')

pygame.mixer.music.load('Sounds/bgm.mp3')

pygame.mixer.music.play(loops=-1)

pygame.mixer.music.set_volume(0.5)

# FONTS ***********************************************************************

title_font = "Fonts/Aladin-Regular.ttf"

score_font = "Fonts/DroneflyRegular-K78LA.ttf"

game_over_font = "Fonts/ghostclan.ttf"

final_score_font = "Fonts/DalelandsUncialBold-82zA.ttf"

new_high_font = "Fonts/BubblegumSans-Regular.ttf"

connected = Message(WIDTH//2, 120, 55, "ConnecteD", title_font, WHITE, win)

score_msg = Message(WIDTH//2, 100, 60, "0", score_font, (150, 150, 150), win)

game_msg = Message(80, 150, 40, "GAME", game_over_font, BLACK, win)

over_msg = Message(210, 150, 40, "OVER!", game_over_font, WHITE, win)

final_score = Message(WIDTH//2, HEIGHT//2, 90, "0", final_score_font, RED, win)

new_high_msg = Message(WIDTH//2, HEIGHT//2+60, 20, "New High", None, GREEN, win)

# Button images

home_img = pygame.image.load('Assets/homeBtn.png')

replay_img = pygame.image.load('Assets/replay.png')

sound_off_img = pygame.image.load("Assets/soundOffBtn.png")

sound_on_img = pygame.image.load("Assets/soundOnBtn.png")

easy_img = pygame.image.load("Assets/easy.jpg")

hard_img = pygame.image.load("Assets/hard.jpg")

# Buttons

easy_btn = Button(easy_img, (70, 24), WIDTH//4-10, HEIGHT-100)

hard_btn = Button(hard_img, (70, 24), WIDTH//2 + 10, HEIGHT-100)

home_btn = Button(home_img, (24, 24), WIDTH // 4 - 18, HEIGHT//2 + 120)

replay_btn = Button(replay_img, (36,36), WIDTH // 2  - 18, HEIGHT//2 + 115)

sound_btn = Button(sound_on_img, (24, 24), WIDTH - WIDTH // 4 - 18, HEIGHT//2 + 120)

# Groups **********************************************************************

RADIUS = 70

ball_group = pygame.sprite.Group()

coin_group = pygame.sprite.Group()

tile_group = pygame.sprite.Group()

particle_group = pygame.sprite.Group()

ball = Balls((CENTER[0], CENTER[1]+RADIUS), RADIUS, 90, win)

ball_group.add(ball)

ball = Balls((CENTER[0], CENTER[1]-RADIUS), RADIUS, 270, win)

ball_group.add(ball)

# TIME ************************************************************************

start_time = pygame.time.get_ticks()

current_time = 0

coin_delta = 850

tile_delta = 2000

# VARIABLES *******************************************************************

clicked = False

new_coin = True

num_clicks = 0

score = 0

player_alive = True

score = 0

highscore = 0

sound_on = True

easy_level = True

home_page = True

game_page = False

score_page = False

running = True

while running:

    win.fill(GRAY)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False

        if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_ESCAPE or \

                event.key == pygame.K_q:

                running = False

        if event.type == pygame.MOUSEBUTTONDOWN and game_page:

            if not clicked:

                clicked = True

                for ball in ball_group:

                    ball.dtheta *= -1

                    flip_fx.play()

                num_clicks += 1

                if num_clicks % 5 == 0:

                    color_index += 1

                    if color_index > len(color_list) - 1:

                        color_index = 0

                    color = color_list[color_index]

        if event.type == pygame.MOUSEBUTTONDOWN and game_page:

            clicked = False

    if home_page:

        connected.update()

        pygame.draw.circle(win, BLACK, CENTER, 80, 20)

        ball_group.update(color)

        if easy_btn.draw(win):

            ball_group.empty()

            ball = Balls((CENTER[0], CENTER[1]+RADIUS), RADIUS, 90, win)

            ball_group.add(ball)

            home_page = False

            game_page = True

            easy_level = True

        if hard_btn.draw(win):

            ball_group.empty()

            ball = Balls((CENTER[0], CENTER[1]+RADIUS), RADIUS, 90, win)

            ball_group.add(ball)

            ball = Balls((CENTER[0], CENTER[1]-RADIUS), RADIUS, 270, win)

            ball_group.add(ball)

            home_page = False

            game_page = True

            easy_level = False

    if score_page:

        game_msg.update()

        over_msg.update()

        if score:

            final_score.update(score, color)

        else:

            final_score.update("0", color)

        if score and (score >= highscore):

            new_high_msg.update(shadow=False)

        if home_btn.draw(win):

            home_page = True

            score_page = False

            game_page = False

            player_alive = True

            score = 0

            score_msg = Message(WIDTH//2, 100, 60, "0", score_font, (150, 150, 150), win)

        if replay_btn.draw(win):

            home_page = False

            score_page = False

            game_page = True

            score = 0

            score_msg = Message(WIDTH//2, 100, 60, "0", score_font, (150, 150, 150), win)

            if easy_level:

                ball = Balls((CENTER[0], CENTER[1]+RADIUS), RADIUS, 90, win)

                ball_group.add(ball)

            else:

                ball = Balls((CENTER[0], CENTER[1]+RADIUS), RADIUS, 90, win)

                ball_group.add(ball)

                ball = Balls((CENTER[0], CENTER[1]-RADIUS), RADIUS, 270, win)

                ball_group.add(ball)

            player_alive = True

        if sound_btn.draw(win):

            sound_on = not sound_on

            if sound_on:

                sound_btn.update_image(sound_on_img)

                pygame.mixer.music.play(loops=-1)

            else:

                sound_btn.update_image(sound_off_img)

                pygame.mixer.music.stop()

    if game_page:

        pygame.draw.circle(win, BLACK, CENTER, 80, 20)

        ball_group.update(color)

        coin_group.update(color)

        tile_group.update()

        score_msg.update(score)

        particle_group.update()

        if player_alive:

            for ball in ball_group:

                if pygame.sprite.spritecollide(ball, coin_group, True):

                    score_fx.play()

                    score += 1

                    if highscore <= score:

                            highscore = score

                    x, y = ball.rect.center

                    for i in range(10):

                        particle = Particle(x, y, color, win)

                        particle_group.add(particle)

                if pygame.sprite.spritecollide(ball, tile_group, True):

                    x, y = ball.rect.center

                    for i in range(30):

                        particle = Particle(x, y, color, win)

                        particle_group.add(particle)

                    player_alive = False

                    dead_fx.play()

            current_time = pygame.time.get_ticks()

            delta = current_time- start_time

            if  coin_delta < delta < coin_delta + 100 and new_coin:

                y = random.randint(CENTER[1]-RADIUS, CENTER[1]+RADIUS)

                coin = Coins(y, win)

                coin_group.add(coin)

                new_coin = False

            if current_time- start_time >= tile_delta:

                y = random.choice([CENTER[1]-80, CENTER[1], CENTER[1]+80])

                type_ = random.randint(1,3)

                t = Tiles(y, type_, win)

                tile_group.add(t)

                start_time = current_time

                new_coin = True

        if not player_alive and len(particle_group) == 0:

            score_page = True

            game_page = False

            score_page_fx.play()

            ball_group.empty()

            tile_group.empty()

            coin_group.empty()

    pygame.draw.rect(win, BLUE, (0, 0, WIDTH, HEIGHT), 5, border_radius=10)

    clock.tick(FPS)

    pygame.display.update()

pygame.quit()

9、恐龙避障

代码太多了,接下来就简单介绍下,有兴趣的在公众号内回复【游戏】即可获取所有的游戏源码。

10、狡猾的墙

11、点和盒子

12、捉蛋游戏

13、愤怒的小鸟

14、捉鬼特工队

15、绞刑吏

16、六角冲

17、匹配选择

18、丛林探险

19、关卡设计

20、记忆拼图

21、扫雷

22、钢琴砖

23、图片滑动拼图

24、乒乓球

25、冲刺

26、石头剪刀布

27、旋转冲击

28、贪吃蛇

29、剪刀

30、俄罗斯方块

相关文件及代码都已上传,公众号回复【游戏】即可获取。

万水千山总是情,点个  行不行。

推荐阅读

 

···  END  ···

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: