猫史档案馆


【pygame】跑酷游戏实例

用户:小鹿UUyM小鹿UUyM查看:1 回复:3 评论:1 创建时间:2023-03-30T19:00:55


--------------------------------------密封线-----------------------------------------------------------------------------------------------------------------------------------------

首先,你需要安装pygame库

在命令行中输入:

pip install pygame

然后在你的程序中写入一下代码:

import pygame
from pygame.locals import *
import sys

# 初始化pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("跑酷游戏")

# 颜色
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)

# 方块设置
PLAYER_SIZE = 50
player = pygame.Rect(WIDTH // 2, HEIGHT // 2, PLAYER_SIZE, PLAYER_SIZE)
gravity = 1
jump_force = -15
vertical_speed = 0

def check_collision(player, obstacles):
    for obstacle in obstacles:
        if player.colliderect(obstacle):
            return True
    return False

def check_side_collision(player, obstacles):
    side_collision = False
    for obstacle in obstacles:
        if player.colliderect(obstacle):
            if player.y < obstacle.y or player.y > obstacle.y + obstacle.height:
                continue
            side_collision = True
            break
    return side_collision

def switch_level(level):
    global player, obstacles
    player.x = 50
    player.y = HEIGHT - PLAYER_SIZE - 50
    obstacles = levels[level]
    gravity = 1
    jump_force = -15
    vertical_speed = 0
    return level + 1
def check_on_ground(player, obstacles):
    test_rect = player.copy()
    test_rect.y += 1  # 向下移动一个像素
    return test_rect.y >= HEIGHT - PLAYER_SIZE - 50 or check_collision(test_rect, obstacles)
# 关卡设计
#这里可以根据自己的想法添加关卡
levels = [
    [
        pygame.Rect(200, 400, 100, 20),
        pygame.Rect(400, 300, 100, 20),
        pygame.Rect(600, 200, 100, 20),
    ],
    [
        pygame.Rect(喵),
        pygame.Rect(400, 350, 300, 20),
    ],
    [
        pygame.Rect(100, 500, 600, 20),
    ],
    [
        pygame.Rect(300, 0, 20, 200),
        pygame.Rect(300, 300, 20, 200),
    ],
    [
        pygame.Rect(150, 200, 20, 200),
        pygame.Rect(450, 200, 20, 200),
    ],
    [
        pygame.Rect(200, 200, 100, 20),
        pygame.Rect(400, 400, 100, 20),
    ],
    [
        pygame.Rect(0, 300, 600, 20),
    ],
    [
        pygame.Rect(200, 400, 20, 100),
        pygame.Rect(400, 200, 20, 100),
    ],
    [
        pygame.Rect(100, 0, 20, 200),
        pygame.Rect(100, 300, 20, 200),
        pygame.Rect(600, 0, 20, 200),
        pygame.Rect(600, 300, 20, 200),
    ],
    [
        pygame.Rect(300, 200, 200, 20),
    ],
]
# 在游戏循环前定义一个简单的绘制文本的函数
def draw_text(text, font, color, surface, x, y):
    textobj = font.render(text, 1, color)
    textrect = textobj.get_rect()
    textrect.topleft = (x, y)
    surface.blit(textobj, textrect)

# 添加一个新函数用于显示主菜单
def show_menu():
    menu_font = pygame.font.Font(None, 36)
    selected_level = 0
    max_level = len(levels) - 1
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            if event.type == KEYDOWN:
                if event.key == K_UP:
                    selected_level -= 1
                    if selected_level < 0:
                        selected_level = max_level
                elif event.key == K_DOWN:
                    selected_level += 1
                    if selected_level > max_level:
                        selected_level = 0
                elif event.key == K_RETURN:
                    return selected_level

        screen.fill(WHITE)
        for index, level in enumerate(levels):
            color = BLUE if index == selected_level else (0, 0, 0)
            draw_text(f"关卡 {index + 1}", menu_font, color, screen, WIDTH // 2 - 50, HEIGHT // 2 + 50 * (index - len(levels) // 2))

        pygame.display.update()
        pygame.time.delay(50)

# 状态设置
current_level = 0
menu = True

# 游戏循环
while True:
    prev_x, prev_y = player.x, player.y
    obstacles = levels[current_level]

    # 在绘制障碍物和检查碰撞时,使用obstacles变量
    for obstacle in obstacles:
        pygame.draw.rect(screen, BLACK, obstacle)
    
    if check_collision(player, obstacles):
        player.x, player.y = prev_x, prev_y
    if menu:
        current_level = show_menu()
        menu = False
        player.x = 50
        player.y = HEIGHT - PLAYER_SIZE - 50
        obstacles = levels[current_level]
    else:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        vertical_speed += gravity

        # 在处理按键事件前,添加以下代码以检查玩家是否在地面上
        on_ground = check_on_ground(player, obstacles)
        side_collision = check_side_collision(player, obstacles)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w] and side_collision:
            player.y -= 5
        elif keys[pygame.K_w] and on_ground:
            vertical_speed = jump_force
        if keys[pygame.K_a]:
            player.x -= 5
        if keys[pygame.K_d]:
            player.x += 5
        if check_collision(player, levels[current_level]):
            player.x, player.y = prev_x, prev_y
        player.y += vertical_speed
        if check_collision(player, obstacles):
            player.y = prev_y
            vertical_speed = 0
        screen.fill(WHITE)

        # 绘制玩家
        pygame.draw.rect(screen, BLUE, player)

        # 检查是否到达关卡终点
        if player.x >= WIDTH - PLAYER_SIZE:
            current_level = switch_level(current_level)
            if current_level >= len(levels):
                # 游戏完成,返回主菜单
                menu = True
                current_level = 0
            else:
                # 载入新关卡
                pass

        # 绘制障碍物
        for obstacle in levels[current_level]:
            pygame.draw.rect(screen, BLACK, obstacle)

        # 更新屏幕
        pygame.display.flip()
        pygame.time.delay(50)

然后运行就可以玩了!

本程序可以当做一个跑酷模版增加更多玩法

 

 

*注 本程序原作者:GPT-4


回复

上一页1 页 / 共 1下一页
cly33cly33

代码有问题,chatgpt-4不靠谱

点赞0


评论


我食真爱粉我食真爱粉

有人跟我一样,用Aptana做吗

点赞0


评论


新手我新手我

《GPT-4》

点赞1


评论