破解游戏设计:AI助你从视频中快速获取玩法规则

305 阅读17分钟

通过之前的文章《从创意到上线:用ChatGPT + Winsurf 快速开发HTML5小游戏的实战指南》,大家已经了解了如何通过AI工作流快速开发一个小游戏。然而,实际操作中我们常常遇到这样的情况:某款网上火爆的小游戏吸引了我们的注意,我们想要快速复制它的模式,但要深入分析其玩法设计,花费不少时间。有没有什么方法能快速提取出这款游戏的设计规则呢?今天,我就来分享一个思路,帮助你通过游戏解说视频快速获取游戏玩法设计规则。

方案构思

一款游戏火起来时,网上通常会有大量的玩法解说视频。我第一想到的方案就是利用AI的多模态能力,理解这些解说视频中的内容,然后总结出游戏的设计规则。经过查阅资料,我发现微软在2023年发布了一篇论文《MM-VID: Advancing Video Understanding with GPT-4V(ision)》。[1]这篇论文的核心思想是结合GPT-4V的能力,利用视觉、音频和语音等多方面工具,实现高级的视频理解。具体流程可以分为以下几步:

  1. 场景识别:检测视频中的视觉场景变化,把完整的视频切分成多个场景(每个场景有开始和结束的时间点)。
  2. 场景切割:根据每个场景的时间范围,将视频分割成多个子视频,便于后续处理。
  3. 语音识别:将视频中的语音转换成文本,作为多模态识别的补充。
  4. 子视频描述生成:使用GPT-4V逐个理解每个子视频,并生成描述。
  5. 视频描述生成:整合音频文本和所有子视频描述,再用GPT生成连贯的视频描述文本。

这个思路看起来比较适用于我们的需求:通过游戏解说视频快速生成游戏玩法设计规则。接下来,我们就按照论文中的思路一步步实现,看看最终的效果如何。

以下所有的实践代码,我已在github上开源:github.com/skindhu/AI-…,欢迎star。

工具选择

为了实现上述方案,我们需要以下几个工具:

1. scenedetect库

scenedetect 是一个用于视频场景检测的 Python 库,主要功能是自动识别视频中的场景切换点(即不同镜头之间的过渡)。它通过分析视频帧之间的视觉差异,利用多种算法检测场景变化。我们可以用这个库来识别游戏视频中的不同场景。

2. Whisper

Whisper 是 OpenAI 的语音识别系统,能够准确高效地将语音内容转换为文本。我们可以用它将游戏视频中的解说语音转成文本,辅助完善最终的游戏规则。

3. ffmpeg

ffmpeg 是一个强大的视频处理工具,大家应该都不陌生。我们可以用它将识别出的场景分割成一系列视频片段。

4. gpt-4o-mini

gpt-4o-mini 是 OpenAI GPT-4o 模型的简化版,选择mini版是为了在效果和成本之间取得平衡。我们将利用它的多模态能力来生成子视频描述和最终的视频描述。

方案实现

1. 场景识别

首先,使用 scenedetect 库对解说视频进行场景识别。

def detect_scenes(video_path):
    """
    Detect scene changes in the video
    
    Args:
        video_path (str): Path to the video file
        
    Returns:
        list: List of scenes with start and end times
    """
    video_manager = VideoManager([video_path])
    scene_manager = SceneManager()
    scene_manager.add_detector(ContentDetector())

    video_manager.start()
    scene_manager.detect_scenes(frame_source=video_manager)
    scenes = scene_manager.get_scene_list()
    
    return scenes

返回的场景片段包括时间偏移和视频帧起始偏移,例如:

0 = (00:00:00.000 [frame=0, fps=30.000], 00:00:00.667 [frame=20, fps=30.000])
1 = (00:00:00.667 [frame=20, fps=30.000], 00:01:31.100 [frame=2733, fps=30.000])
...

2. 场景切割

根据识别出的场景,将原始视频分割成多个子视频。

def split_video(video_path, scene_list, output_dir):
    """
    Split video into multiple clips based on scene list
    
    Args:
        video_path (str): Path to the input video
        scene_list (list): List of scenes with start and end times
        output_dir (str): Directory to save the output clips
        
    Returns:
        list: List of paths to the created clips
    """
    clip_paths = []
    for i, scene in enumerate(scene_list):
        start, end = scene[0].get_seconds(), scene[1].get_seconds()
        duration = end - start
        clip_path = os.path.join(output_dir, f"clip_{i+1}.mp4")
        try:
            command = [
                'ffmpeg''-y',
                '-i', video_path,
                '-ss'f"{start:.2f}",
                '-t'f"{duration:.2f}",
                '-map'"0",
                '-vcodec''libx264',  # 重编码
                '-acodec''aac',
                '-avoid_negative_ts''make_zero',
                clip_path
            ]
            subprocess_call(command, logger="bar")
            clip_paths.append(clip_path)            
        except Exception as e:
            print(f"Error processing clip {i+1}{e}")
            continue
            
    return clip_paths

3. 语音识别

接着,使用 Whisper 将解说视频中的语音转换成文本。

def recognize_speech(video_path):
    """
    Perform speech recognition on video using WhisperX
    
    Args:
        video_path (str): Path to the video file
        
    Returns:
        str: Transcribed text from the video
    """
    try:
        logger.debug(f"Loading WhisperX model for {video_path}")
        model = whisperx.load_model("large", device='cpu', compute_type="float32")
        
        logger.debug("Starting transcription")
        result = model.transcribe(video_path)
        
        logger.debug("Processing segments")
        segments = result["segments"]
        
        # 合并所有文本片段,保留时间戳信息
        transcription = []
        for segment in segments:
            time_start = segment.get("start"0)
            time_end = segment.get("end"0)
            text = segment.get("text""").strip()
            if text:
                transcription.append(f"[{time_start:.2f}-{time_end:.2f}{text}")
        
        text = "\n".join(transcription)
        logger.debug(f"Transcription completed, generated {len(transcription)} segments")
        
        return text
        
    except Exception as e:
        logger.error(f"Error during speech recognition: {str(e)}")
        logger.debug("Returning empty transcription due to error")
        return "No transcription available."

4. 生成子视频描述

利用 gpt-4o-mini 理解每个子视频片段,生成详细的描述。为了节省成本和时间,我们不会提取所有帧,而是抽取10帧进行分析。同时,在prompt设计中我们需要让模型在理解视频帧时专注于游戏规则的提取。

def generate_clip_descriptions(clip_paths, scenes, num_frames=10):
    """
    Generate descriptions for video clips using GPT-4V
    
    Args:
        clip_paths (list): List of paths to video clips
        scenes (list): List of scenes with timing information
        num_frames (int): Number of frames to sample from each clip
        
    Returns:
        str: Combined descriptions of all clips
    """
    # 检查缓存
    if DEBUG_MODE and os.path.exists(DESCRIPTIONS_CACHE_FILE):
        with open(DESCRIPTIONS_CACHE_FILE, 'r', encoding='utf-8') as f:
            return f.read()

    descriptions = []
    for clip_path, scene in zip(clip_paths, scenes):
        clip = VideoFileClip(clip_path)
        frames = sample_frames(clip, num_frames)
        images = [Image.fromarray(frame) for frame in frames]
        image_files = [convert_to_base64(image) for image in images]
        content = []
        prompt = (
            "你是一位资深的游戏分析师,擅长记录详细的游戏机制和规则。"
            "根据以下游戏画面,提供非常详细的分析,重点关注:\n\n"
            "1. 玩家操作与控制:\n"
            "   - 所有可能的玩家交互\n"
            "   - 具体的按钮组合或手势\n"
            "   - 移动机制及限制\n"
            "   - 操作时机和冷却时间\n\n"
            "2. 游戏界面元素:\n"
            "   - 所有UI组件及其功能\n"
            "   - 状态指示器和计量器\n"
            "   - 菜单系统和导航\n"
            "   - 视觉反馈机制\n\n"
            "3. 游戏玩法机制:\n"
            "   - 详细的互动系统\n"
            "   - 战斗或竞争机制\n"
            "   - 资源管理系统\n"
            "   - 增强道具和特殊能力\n\n"
            "4. 得分与进度:\n"
            "   - 积分计算方法\n"
            "   - 成就条件\n"
            "   - 关卡进度标准\n"
            "   - 排名或评分系统\n\n"
            "5. 环境互动:\n"
            "   - 物体交互\n"
            "   - 地形影响\n"
            "   - 环境危害\n"
            "   - 互动元素\n\n"
            "请描述你观察到的每一个细节,无论多么微小。\n"
            f"时间范围:{scene}"
        )

        content.append({"type""text""text": prompt})
        for image_file in image_files:
            content.append({
                "type""image_url",
                "image_url": {"url": f"data:image/jpeg;base64,{image_file}"},
            })

        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role""user",
                    "content": content
                }
            ],
            max_tokens=2000,
        )
        descriptions.append(response.choices[0].message.content)
        
    result = "".join(descriptions)
    if DEBUG_MODE:
        with open(DESCRIPTIONS_CACHE_FILE, 'w', encoding='utf-8') as f:
            f.write(result)
    return result

5. 生成最终游戏规则

结合所有子视频描述、语音转文本以及人工编辑的游戏背景信息,使用 gpt-4o-mini 生成最终的游戏规则。在设计提示时,需让模型专注于从视频描述中提取游戏规则。

def generate_rules(clip_descriptions):
    """
    Generate game rules based on clip descriptions and background information
    
    Args:
        clip_descriptions (str): Combined descriptions of all video clips
        
    Returns:
        str: Generated game rules document
    """
    try:
        # 删除已有的规则文件
        if os.path.exists(GAME_RULES_FILE):
            os.remove(GAME_RULES_FILE)

        # 读取背景信息
        background_info = read_background()
        
        # 构建提示
        prompt = (
            "你是一位顶级游戏设计师,任务是创建最全面、详细的游戏文档。"
            "根据以下的游戏画面分析和背景信息,生成详尽的游戏规则文档,确保与游戏的设定和设计理念一致。\n\n"
        )
        
        if background_info:
            prompt += "游戏背景信息:\n" + background_info + "\n\n"
        
        prompt += (
            "请创建一个详细的游戏规则文档,涵盖游戏的各个方面:\n\n"
            "1. 核心游戏机制:\n"
            "   - 基本的游戏循环\n"
            "   - 玩家动作及其影响\n"
            "   - 控制方案和输入方法\n"
            "   - 时间机制和动作顺序\n"
            "   - 移动系统和物理交互\n\n"
            "2. 游戏系统:\n"
            "   - 积分机制说明\n"
            "   - 进度跟踪系统\n"
            "   - 资源管理规则\n"
            "   - 经验和升级系统\n"
            "   - 经济和货币系统\n\n"
            "3. 战斗与互动:\n"
            "   - 战斗机制详解\n"
            "   - 伤害计算系统\n"
            "   - 角色或单位互动\n"
            "   - 状态效果及其持续时间\n"
            "   - 连击系统和特殊动作\n\n"
            "4. 特殊机制:\n"
            "   - 所有增强道具及其效果\n"
            "   - 特殊能力和冷却时间\n"
            "   - 独特的玩法元素\n"
            "   - 环境互动\n"
            "   - 隐藏机制和秘密\n\n"
            "5. 游戏流程:\n"
            "   - 详细的回合/比赛结构\n"
            "   - 完整的胜负条件\n"
            "   - 关卡进度要求\n"
            "   - 游戏模式和变体\n"
            "   - 竞赛或比赛规则\n\n"
            "6. 用户界面:\n"
            "   - 完整的HUD元素描述\n"
            "   - 菜单系统导航\n"
            "   - 状态指示器及其含义\n"
            "   - 视觉和音频反馈系统\n\n"
            "7. 高级机制:\n"
            "   - 专家级技巧\n"
            "   - 策略考量\n"
            "   - 元游戏元素\n"
            "   - 高级积分策略\n\n"
            "请将其格式化为专业的游戏设计文档,包含清晰的章节、小节和示例。"
            "尽可能包含具体的数字、时间和条件。详细解释基础和高级概念,确保所有规则和机制与提供的背景信息一致。\n\n"
            "游戏画面分析:\n"
        )
        prompt += clip_descriptions
        
        logger.debug("Sending prompt to GPT-4")
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {
                    "role""user",
                    "content": prompt
                }
            ],
            max_tokens=4000,
        )
        
        result = response.choices[0].message.content
        
        # 保存结果到文件
        with open(GAME_RULES_FILE, 'w', encoding='utf-8') as f:
            f.write(result)
        
        logger.debug("Successfully generated and saved game rules")
        return result
        
    except Exception as e:
        logger.error(f"Error generating game rules: {str(e)}")
        raise

效果展示

根据论文中的思路在游戏规则提取这个场景进行尝试后,效果到底如何呢,我们来通过一个游戏解说视频尝试一下。

解说视频

wechat-account-1251781786.cos.ap-guangzhou.myqcloud.com/ai-game-rul…

提取出的游戏规则

# 开心消消乐游戏设计文档

## 游戏标题:
开心消消乐

## 游戏类型:
三消游戏

## 游戏背景:
游戏设定在一个充满活力、色彩缤纷的世界中,有可爱的角色和神奇的生物。环境特色是一系列奇幻的背景,每个关卡都呈现与这些角色相关的独特挑战。玩家需要通过匹配和消除网格中的物品来帮助这些生物,从而在游戏关卡中取得进展。

## 核心理念:
主要玩法围绕经典的三消机制展开,玩家通过交换相邻的角色或物品来创建三个或更多相同物品的连线。这样做可以将它们从棋盘上清除,获得积分,并触发连锁效应,从而获得更高的分数。玩家需要在管理有限资源的同时制定策略。

## 目标玩家:
游戏吸引广泛的人群,特别是休闲游戏玩家、益智游戏爱好者和喜欢视觉上吸引人、有趣和轻松游戏的玩家。它适合所有年龄段,但主要针对年轻受众和寻求休闲游戏体验的玩家。

## 游戏角色:
1. **魔法鸟**:游戏玩法的基石,在升级和达成连击方面起着关键作用。
2. **电力宝宝**:一个有用的伙伴,匹配时可以清除行或列。
3. **向日葵**:一个特殊物品,正确使用时可以产生奖励机制。

## 特色功能:
- **道具**:各种道具帮助玩家一次消除更多物品。
- **奖励关卡**:达成特定条件的关卡会获得更多奖励(例如,在规定步数内完成)。
- **每日挑战**:为玩家提供额外目标,奖励特殊物品或货币。

## 开发背景:
开心消消乐的开发目标是创造一个引人入胜、适合家庭的游戏,将策略与乐趣相结合。设计团队专注于明亮的色彩图形、流畅的动画和令人上瘾的游戏循环,鼓励玩家不断回来体验更多。

---

# 游戏规则文档

## 1. 核心游戏机制
### 1.1 基本游戏循环
- 玩家交换相邻物品以创建三个或更多相同角色的组合。
- 匹配会从网格中清除物品,获得积分,并可能激活特殊能力或道具。
- 玩家后续的操作可能导致连锁匹配,进一步增加分数。

### 1.2 玩家操作及效果
- **交换**:改变两个相邻角色的位置。(效果:如果形成匹配,这些角色会被清除。)
- **点击道具**:点击道具以激活其功能。(效果:通常会清除额外的角色或影响网格。)

### 1.3 控制方案
- **触摸控制**:点击选择物品,滑动交换相邻物品。
- **按钮输入**:使用屏幕上的按钮激活道具和特殊能力。

### 1.4 时间机制和动作序列
- 玩家必须在计时器耗尽前完成关卡(通常每关60-120秒)。
- 某些关卡可能要求玩家在有限步数内(如20步)达到分数阈值。

### 1.5 移动系统和物理交互
- 角色放置在固定网格上,限制为水平或垂直移动。
- 重力将角色下拉以填补清除的空间,创造新的匹配机会。

## 2. 游戏系统
### 2.1 计分机制
- 根据匹配的角色数量获得积分:
  - 3个角色 = 10分
  - 4个角色 = 20分(加特殊效果)
  - 5个角色 = 30分(加更大的特殊效果)

### 2.2 进度追踪系统
- 每个关卡完成后根据表现获得星星(1-3颗),影响未来解锁。
- 通过关卡地图显示进度,有已完成关卡的视觉指示器。

### 2.3 资源管理规则
- 玩家在每个关卡中管理移动次数和道具。
- 可以赚取和花费游戏内货币来升级或购买特殊道具。

### 2.4 经验和等级系统
- 玩家通过完成关卡获得经验,解锁新的挑战和游戏模式。
- 升级可以获得特殊道具或角色的使用权。

### 2.5 经济和货币系统
- 玩家可以通过有效完成关卡赚取货币,并可以花费在道具上或继续失败的关卡。

## 3. 战斗和互动
### 3.1 战斗机制
- 互动主要是战略性匹配而非传统意义上的战斗。
- 竞争可能出现在基于时间的挑战或高分机制中。

### 3.2 伤害计算系统
- 不是计算伤害,而是根据完成的匹配和连击获得积分。

### 3.3 角色互动
- 特殊角色在匹配或清除时可能有独特能力。
- 角色也可以与环境效果和奖励互动。

### 3.4 状态效果和持续时间
- 道具可能有冷却时间(如10-15秒)才能再次使用。
- 某些关卡可能引入障碍,限制行动直到解决。

### 3.5 连击系统和特殊移动
- 创建角色组合可以产生特殊移动,清除棋盘上更大的区域。

## 4. 特殊机制
### 4.1 道具及其效果
- **直线消除道具**:清除整行或整列。
- **炸弹道具**:清除更大区域,通常是3x3网格。
- **神秘盒子**:匹配时激活,产生随机道具。

### 4.2 特殊能力和冷却时间
- 每个道具都有冷却期。例如,炸弹道具的冷却时间可能是30秒。

### 4.3 独特游戏元素
- 特定关卡可能引入独特的游戏机制,如收集配额或限时挑战。

### 4.4 环境互动
- 与地形的互动(如打破冰块)可以改变网格的工作方式。

### 4.5 隐藏机制和秘密
- 通过特定匹配组合或达到特定分数可以解锁隐藏关卡或隐藏奖励。

## 5. 游戏流程
### 5.1 回合/对局结构
- 每个游戏会话由多个回合组成,玩家在每个回合中争取获得分数或星星。

### 5.2 胜利/失败条件
- 玩家通过在限制条件内清除所有必需目标获胜;用尽移动次数或未完成目标则失败。

### 5.3 关卡进度要求
- 必须以最低分数令人满意地完成关卡才能解锁后续关卡。

### 5.4 游戏模式和变体
- 各种模式包括限时对局、限制移动次数,或无尽模式让玩家尽可能获得高分。

### 5.5 锦标赛或竞技规则
- 玩家可以根据在特定限时活动或挑战中获得的高分在排行榜上竞争。

## 6. 用户界面
### 6.1 HUD元素描述
- **分数显示**:显示当前分数和目标。
- **计时器**:显示有时间限制的关卡中的剩余时间。
- **道具库存**:计算游戏中剩余可用的道具数量。

### 6.2 菜单系统导航
- 多个标签页用于关卡、道具、设置和成就,通常在激活前保持低可见度。

### 6.3 状态指示器和含义
- 星级评定系统显示玩家表现(1-3星),在关卡完成后显示。

### 6.4 视觉和音频反馈系统
- 星星或其他奖励通过动画视觉庆祝成就,声音效果增强反馈。

## 7. 高级机制
### 7.1 专家级技巧
- 开发复杂策略,如创建更大的连击或有效利用道具。

### 7.2 策略考虑
- 分析棋盘状态并最大化移动次数以高效达成目标。

### 7.3 元游戏元素
- 玩家可以讨论和分享策略,或参与论坛以获得高分战术的见解。

### 7.4 高级得分策略
- 高效利用道具和创建连锁匹配可以带来显著的分数倍增器。

---

本游戏规则文档旨在通过详细说明所有游戏玩法机制、系统和玩家互动,提供对"开心消消乐"的全面理解。它既可以作为新玩家的参考,也可以作为游戏提供的更广泛策略深度的指南。

可以看出,我们的游戏解说视频其实较为简单,但是提取出的规则已经相对比较详细,我们可以再通过GPT进行补充完善即可。

总结

通过以上步骤,我们可以利用AI的多模态能力,从热门游戏的解说视频中快速提取出游戏的玩法设计规则。这不仅大大节省了分析时间,还能帮助我们更高效地复制和创新游戏模式。以上的实践代码,我已在github上开源:github.com/skindhu/AI-…,欢迎star。

更多内容,请关注作者公众号:

image.png

参考资料 [1]

《MM-VID: Advancing Video Understanding with GPT-4V(ision)》。: arxiv.org/abs/2310.19…