组织游戏模块的最佳方式是什么

what's the best way to organize game modules

我正在写游戏,第一章已经完成了。它有大约 10 个模块 + 游戏引擎。我不是要分步指南,但如果你能告诉我在哪里可以找到信息,那就太好了!

这是引擎代码:

from sys import exit
from random import randint

import module_intro
import module_house_one
import module_package_zoom
import module_house_two
import module_unboxing
import module_key_letter
import module_letter_key
import module_house_three
import module_end_game

class 引擎(对象):

def __init__(self, scene_map):
    self.scene_map = scene_map

def play(self):
    current_scene = self.scene_map.opening_scene()
    last_scene = self.scene_map.next_scene('finished')

    while current_scene != last_scene:
        next_scene_name = current_scene.enter()
        current_scene = self.scene_map.next_scene(next_scene_name)

    current_scene.enter()

class 地图(对象):

scenes = {
'intro': module_intro.Intro(),
'house_one': module_house_one.HouseOne(),
'package_zoom': module_package_zoom.PackageZoom(),
'house_two': module_house_two.HouseTwo(),
'unboxing': module_unboxing.Unboxing(),
'key_letter': module_key_letter.KeyLetter(),
'letter_key': module_letter_key.LetterKey(),
'house_three': module_house_three.HouseThree(),
'end_game': module_end_game.EndGame()
}

def __init__(self, start_scene):
    self.start_scene = start_scene

def next_scene(self, scene_name):
    val = Map.scenes.get(scene_name)
    return val

def opening_scene(self):
    return self.next_scene(self.start_scene)

a_map = Map('intro')
a_game = Engine(a_map)
a_game.play()

例如,您可以使用此目录结构或类似的东西将每一章放入单独的文件夹中:

├── game
│   ├── chapter_one
│   │   ├── __init__.py
│   │   └── main.py
│   ├── chapter_two
│   │   ├── __init__.py
│   │   └── main.py
│   ├── engine.py
│   └── __init__.py
└── main.py

根目录下的main.py会加载所有章节并开始游戏,可以这样看:

import game.chapter_one.main
import game.chapter_two.main
from game.engine import Engine, SceneMap

print("Starting the engine...")
a_map = SceneMap()
a_game = Engine(a_map)
a_game.play()

并且 Scene 对象可以在 SceneMap 中自动注册,因此您不必手动执行此操作,例如 game.chapter_one.main.py:

from ..engine import SceneMap

class Scene(object):

    def enter(self):
        print('Enter chapter 1')

SceneMap.register('intro', Scene)

game.chapter_two.main.py:

from ..engine import SceneMap

class Scene(object):

    def enter(self):
        print('Enter chapter 2')

SceneMap.register('chapter 2', Scene)

SceneMap 可以是这样的:

class SceneMap(object):

    scenes = OrderedDict()

    @classmethod
    def register(cls, name, map_fn):
        cls.scenes[name] = map_fn

您的其余逻辑可以与您现在的逻辑类似(每个场景 returns 下一个要播放的场景)。

或者,您可以进一步简化它并依赖 main.py 中的章节导入顺序。

因此,如果您在 main.py 中交换 chapter_one / chapter_two 的导入,它们将以倒序播放。 请参阅此方法的完整示例 here