边玩边学,30个Python小游戏(含源码)

avatar
作者
筋斗云
阅读量:6

e89e28975f5d25088ec4795f49fa9e5d.gif

大家好,我是小F~

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

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

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

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

接下来就一起来看看吧~

1、飞机大战

42eafd0d93328ca02763f59f398701ac.png

源码分享:

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、愤怒的墙

7d7c9eaa34401b50ca051a06b15d0a5b.png

源码分享:

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、圆弧冲刺

86f717c40518946ebaf62710004defa1.png

源码分享:

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、行星游戏

bf8f4cedab9e0b8358b3815b54f75343.png

源码分享:

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、弹跳的球

b64cce1c70ece4bcf927fd2d0f755ae5.png

源码分享:

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、汽车避障

80e18062fd663585128e3071b72ebfb4.png

源码分享:

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、洞窟物语

d06e091f98705592b39171cb91854292.jpeg

源码分享:

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、联系

7ec4e247ac6a38b936ccaed2fde70ca3.png

源码分享:

# 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、恐龙避障

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

bdb8284f1276606975cd07c6a395f428.png

10、狡猾的墙

7ba8f83cf6a4b136e7197d86cca4c6e7.png

11、点和盒子

14e19b00380d3f13e80b41bb636d0359.png

12、捉蛋游戏

5f8e4bb8741de73fd5dcadce2d123b32.png

13、愤怒的小鸟

ab1c3f0d79e4f6ddf40b24f8c4dd6282.png

14、捉鬼特工队

22c56fc6b9a4b4ef4d49c4f4de40c161.png

15、绞刑吏

f0a5e453961395d574ae8489266c2fb0.png

16、六角冲

9b1987e5d6d54edefcd6e8db694b676d.png

17、匹配选择

6ad0920678ffe9a60d280db02acd431d.png

18、丛林探险

ca0529194c59c2cddaa7ed0a9deffef2.png

19、关卡设计

d74d13aacf8881999a2834a42f00747c.png

20、记忆拼图

9e3113efdbc45c501af0f8ec31806866.png

21、扫雷

4cde00396ba36ff63b15cae24e96e595.png

22、钢琴砖

f0caa0fd45aa5bba01ee8f0d313c22e8.png

23、图片滑动拼图

2c7911e0304267417fbd368b7e174a80.png

24、乒乓球

2819d5f826ccc562451907ea0409eb50.png

25、冲刺

a57d82cccb3f582fb507d27b87bf1c75.png

26、石头剪刀布

dc740fa6b1b062586e75f0d3f20cd0e1.png

27、旋转冲击

9d5c744eba36fd1415503d6588a906ff.png

28、贪吃蛇

6ef7c818f394a98181d18ef7072788a9.png

29、剪刀

acc09de593d0cd83edd7c7bd67dcdeec.png

30、俄罗斯方块

348bb1d0dabaef400e813af366728909.png

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

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

推荐阅读     ···  END  ···

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!