大家好,我是小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 ···
发表评论