带你用Python制作一个经典必收藏的游戏:地铁跑酷(含完整代码)

名字:阿玥的小东东

学习:Python、C/C++

主页链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主

目录

一、游戏简介

二、游戏设计

引入必要的库

初始化游戏

定义游戏元素

定义游戏循环

更新游戏元素

扫描二维码关注公众号,回复: 15483623 查看本文章

检测碰撞

生成新的道具

绘制游戏画面

结束游戏循环

下面是完整的游戏代码:

四、总结


(本文旨在帮助初学者熟悉Python语言的基本语法和常用功能,同时结合实例演示如何使用Python实现一个简单的地铁跑酷游戏)

一、游戏简介

地铁跑酷是一款非常流行的手机游戏,玩家需要在地铁隧道中奔跑,躲避障碍物,收集金币,不断向前挑战自己的极限。

在本篇文章中,我们将使用Python语言来实现一个简单的地铁跑酷游戏。通过这个实例,读者可以学习到Python语言的基本语法和常用功能,同时还可以深入了解游戏开发的一些基本概念和技术。

二、游戏设计

在设计游戏之前,我们需要确定游戏的基本元素和规则。以下是我们设计的地铁跑酷游戏的基本元素和规则:

  1. 玩家:玩家控制一个角色在地铁隧道中奔跑,可以向左或向右移动,跳跃或滑行躲避障碍物,收集金币得分。

  2. 道具:在地铁隧道中会出现各种道具,包括金币、磁铁、跳板等。玩家需要收集金币得分,使用道具帮助自己更好地挑战关卡。

  3. 障碍物:在地铁隧道中会出现障碍物,包括车辆、障碍物等。玩家需要躲避障碍物,否则会导致游戏失败。

  4. 关卡:游戏分为多个关卡,每个关卡难度逐渐增加。玩家需要不断挑战自己的极限,不断前进,闯关成功。

  5. 得分:玩家可以通过收集金币、使用道具等方式得分,同时每通过一个关卡也会得到相应的奖励得分。

在确定了游戏的基本元素和规则之后,我们就可以开始使用Python语言来实现这个游戏。

三、游戏开发

在开始游戏开发之前,我们需要安装Python语言的开发环境。Python语言的开发环境包括Python解释器和开发工具,可以在Python官方网站(https://www.python.org/)下载安装。

接下来,我们将分步骤讲解如何使用Python语言来实现地铁跑酷游戏。

  1. 引入必要的库

在开始编写游戏代码之前,我们需要引入必要的库来帮助我们完成游戏开发。在本例中,我们需要引入pygame库来实现游戏画面的显示和控制。

import pygame
import random

  1. 初始化游戏

在编写游戏代码之前,我们需要初始化游戏,并设置游戏窗口的基本属性、加载游戏资源等。以下是初始化游戏的代码:

# 初始化pygame
pygame.init()

# 设置窗口大小和标题
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Subway Surf")

# 加载游戏资源
player_image = pygame.image.load("player.png")
coin_image = pygame.image.load("coin.png")
obstacle_image = pygame.image.load("obstacle.png")

在上面的代码中,我们先使用pygame.init()初始化pygame,并设置游戏窗口的大小和标题。我们还需要加载游戏所需要的资源,包括玩家的图片、金币的图片和障碍物的图片。

  1. 定义游戏元素

在游戏中,我们需要定义游戏中出现的各种元素,包括玩家、金币和障碍物等。以下是游戏元素的定义代码:

# 定义玩家类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = player_image
        self.rect = self.image.get_rect()
        self.rect.x = 50
        self.rect.y = screen_height - 100
        self.speed_x = 0
        self.speed_y = 0

    def update(self):
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

# 定义金币类
class Coin(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = coin_image
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, screen_width - self.rect.width)
        self.rect.y = random.randint(-200, -50)
        self.speed_y = 5

    def update(self):
        self.rect.y += self.speed_y

# 定义障碍物类
class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = obstacle_image
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, screen_width - self.rect.width)
        self.rect.y = random.randint(-200, -50)
        self.speed_y = 5

    def update(self):
        self.rect.y += self.speed_y

在上面的代码中,我们定义了玩家、金币和障碍物三个游戏元素的类。每个类都包括元素的属性和方法,如位置、速度、更新等。其中,玩家类是我们需要控制的角色,金币和障碍物类是游戏中会出现的道具和障碍物。

  1. 定义游戏循环

在游戏中,我们需要定义一个游戏循环来不断更新游戏画面,检测玩家的操作,并处理游戏元素之间的碰撞等。以下是游戏循环的代码:

# 定义玩家和道具组
all_sprites_group = pygame.sprite.Group()
coin_group = pygame.sprite.Group()
obstacle_group = pygame.sprite.Group()

player = Player()
all_sprites_group.add(player)

# 定义游戏循环
clock = pygame.time.Clock()
score = 0
game_over = False

while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.speed_x = -5
            if event.key == pygame.K_RIGHT:
                player.speed_x = 5
            if event.key == pygame.K_UP:
                player.speed_y = -5
            if event.key == pygame.K_DOWN:
                player.speed_y = 5
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                player.speed_x = 0
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                player.speed_y = 0

    # 更新游戏元素
    all_sprites_group.update()

    # 检测碰撞
    coin_hit_list = pygame.sprite.spritecollide(player, coin_group, True)
    for coin in coin_hit_list:
        score += 10

    obstacle_hit_list = pygame.sprite.spritecollide(player, obstacle_group, False)
    if len(obstacle_hit_list) > 0:
        game_over = True

    # 生成新的道具
    if len(coin_group) < 3:
        coin = Coin()
        all_sprites_group.add(coin)
        coin_group.add(coin)

    if len(obstacle_group) < 3:
        obstacle = Obstacle()
        all_sprites_group.add(obstacle)
        obstacle_group.add(obstacle)

    # 绘制游戏画面
    screen.fill((255, 255, 255))
    all_sprites_group.draw(screen)

    font = pygame.font.Font(None, 30)
    score_text = font.render("Score: " + str(score), True, (0, 0, 0))
    screen.blit(score_text, (10, 10))

    pygame.display.update()
 # 限制游戏帧数
    clock.tick(60)

# 退出pygame
pygame.quit()

在上述代码中,我们首先定义了玩家和道具组,并且将玩家加入到道具组中。接着我们定义了游戏循环,使用while循环不断更新游戏尺寸,并使用pygame.event.get()获取用户输入。如果用户按下键盘上的方向键,则会更新玩家的速度。如果用户放开键盘上的方向键,则会停止玩家的移动。

在游戏的主循环中,我们还需要执行以下几个操作:

  1. 更新游戏元素

使用all_sprites_group.update()方法来更新所有的游戏元素,包括玩家、金币和障碍物等。

  1. 检测碰撞

使用pygame.sprite.spritecollide()方法检测玩家是否与金币或障碍物碰撞。如果玩家与金币碰撞,则可以得到相应的得分;如果玩家与障碍物碰撞,则游戏失败。

  1. 生成新的道具

如果当前场景中的金币或障碍物数量小于一定值,则需要生成新的道具。

  1. 绘制游戏画面

使用pygame.display.update()方法更新游戏画面,包括绘制所有的游戏元素和得分等信息。

  1. 结束游戏循环

如果游戏结束,则跳出循环并退出程序。

下面是完整的游戏代码:

import pygame
import random

# 初始化pygame
pygame.init()

# 设置游戏窗口大小
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
WINDOW_SIZE = (WINDOW_WIDTH, WINDOW_HEIGHT)

# 设置游戏帧率
FPS = 30

# 设置游戏难度级别
EASY = 1
MEDIUM = 2
HARD = 3

# 设置颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)

# 加载游戏素材
background_image = pygame.image.load("images/background.png")
player_image = pygame.image.load("images/player.png")
obstacle_image = pygame.image.load("images/obstacle.png")

# 创建游戏窗口
window = pygame.display.set_mode(WINDOW_SIZE)

# 创建游戏时钟
clock = pygame.time.Clock()

# 设置游戏难度级别,默认为EASY
difficulty = EASY

# 创建玩家对象类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = player_image
        self.rect = self.image.get_rect()
        self.rect.x = 50
        self.rect.y = 300
        self.speed = 5

    def move_up(self):
        self.rect.y -= self.speed

    def move_down(self):
        self.rect.y += self.speed

    def move_left(self):
        self.rect.x -= self.speed

    def move_right(self):
        self.rect.x += self.speed

# 创建障碍物对象类
class Obstacle(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = obstacle_image
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 5

    def move(self):
        self.rect.x -= self.speed

# 创建障碍物生成器类
class ObstacleGenerator():
    def __init__(self):
        self.obstacles = pygame.sprite.Group()

    def generate_obstacle(self):
        min_distance = 200
        max_distance = 400
        min_height = 100
        max_height = 400
        last_obstacle_x = 0 if len(self.obstacles) == 0 else self.obstacles.sprites()[-1].rect.x
        if difficulty == EASY:
            distance = random.randint(min_distance, max_distance)
        elif difficulty == MEDIUM:
            distance = random.randint(min_distance - 50, max_distance - 50)
        else:
            distance = random.randint(min_distance - 100, max_distance - 100)
        x = last_obstacle_x + distance
        y = random.randint(min_height, max_height)
        obstacle = Obstacle(x, y)
        self.obstacles.add(obstacle)

    def move_obstacles(self):
        for obstacle in self.obstacles:
            obstacle.move()
            if obstacle.rect.right < 0:
                self.obstacles.remove(obstacle)

    def draw_obstacles(self, surface):
        self.obstacles.draw(surface)

# 创建得分计数器类
class ScoreCounter():
    def __init__(self):
        self.score = 0
        self.font = pygame.font.Font(None, 30)

    def update(self, passed_obstacle):
        self.score = passed_obstacle * 10

    def draw(self, surface):
        score_text = f"Score: {self.score}"
        text = self.font.render(score_text, True, GREEN)
        surface.blit(text, (10, 10))

# 创建游戏对象
player = Player()
obstacle_generator = ObstacleGenerator()
score_counter = ScoreCounter()

# 定义游戏结束函数
def game_over():
    font = pygame.font.Font(None, 50)
    text = font.render("GAME OVER", True, WHITE)
    rect = text.get_rect()
    rect.center = window.get_rect().center
    window.blit(text, rect)
    pygame.display.flip()
    pygame.time.wait(2000)
    pygame.quit()
    quit()

# 游戏循环
def game_loop():
    # 初始化游戏状态
    game_over_flag = False
    passed_obstacle = 0
    obstacle_generator.generate_obstacle()

    # 游戏主循环
    while not game_over_flag:

        # 处理游戏事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over_flag = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    player.move_up()
                elif event.key == pygame.K_DOWN:
                    player.move_down()
                elif event.key == pygame.K_LEFT:
                    player.move_left()
                elif event.key == pygame.K_RIGHT:
                    player.move_right()

        # 移动障碍物
        obstacle_generator.move_obstacles()

        # 判断碰撞
        if pygame.sprite.spritecollide(player, obstacle_generator.obstacles, False):
            game_over()
            game_over_flag = True

        # 绘制游戏元素
        window.blit(background_image, (0, 0))
        player_group = pygame.sprite.Group()
        player_group.add(player)
        player_group.draw(window)
        obstacle_generator.draw_obstacles(window)
        score_counter.update(passed_obstacle)
        score_counter.draw(window)

        # 判断是否通过障碍物
        if obstacle_generator.obstacles and obstacle_generator.obstacles.sprites()[0].rect.right < player.rect.centerx:
            passed_obstacle += 1
            obstacle_generator.obstacles.remove(obstacle_generator.obstacles.sprites()[0])
            score_counter.update(passed_obstacle)
            if passed_obstacle % 5 == 0:
                if difficulty == EASY:
                    difficulty = MEDIUM
                elif difficulty == MEDIUM:
                    difficulty = HARD

        # 生成新的障碍物
        if len(obstacle_generator.obstacles) < 3:
            obstacle_generator.generate_obstacle()

        # 更新游戏画面
        pygame.display.update()

        # 设置游戏帧率
        clock.tick(FPS)

# 启动游戏
game_loop()

四、总结

本篇文章通过实现一个简单的地铁跑酷游戏,介绍了Python语言的基本语法和常用功能。读者可以通过这个实例深入了解游戏开发的一些基本概念和技术,同时也可以通过这个实例来锻炼自己的编程能力。

当然,这个地铁跑酷游戏还有很多需要完善的地方,比如增加更多的障碍物、道具和关卡,优化游戏体验等。读者可以在自己的代码中进行扩展和优化,不断挑战自己的编程技能。

猜你喜欢

转载自blog.csdn.net/m0_64122244/article/details/131486589