python编写小游戏详细教程,用python做简单的小游戏
admin 阅读: 2024-03-26
后台-插件-广告管理-内容页头部广告(手机) |
大家好,我是小F~
经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对?
比方说,你有没有想过,可以通过打游戏来学编程?
今天我想跟大家分享30个Python小游戏,教你如何通过边打游戏边学编程!
相关文件及代码都已上传,公众号回复【游戏】即可获取用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、俄罗斯方块
相关文件及代码都已上传,公众号回复【游戏】即可获取。
万水千山总是情,点个
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |