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

时间:2016-11-11 15:20:51

标签: python class oop module game-engine

我正在写一个游戏,已经把第一章打到了最后。它有大约10个模块+游戏引擎。我不是要求一步一步的指南,但如果你能告诉我在哪里寻找信息会很棒!

    如果我将它们放在不同的文件夹中,
  • 引擎代码可以以某种方式访问​​我的模块吗?(我想至少对不同文件夹中的不同章节进行排序)
  • 有不同的,更好的方法来做引擎代码吗?(假设我将在游戏中有50个章节,它将是大约500个模块,所以它将是大约1000多行引擎代码只是为了导入和调用它们这是非常非常糟糕的风格)

这是引擎代码:

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

类引擎(对象):

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()

类Map(对象):

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()

enter image description here

1 个答案:

答案 0 :(得分:0)

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

├── 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

你的逻辑的其余部分可以与你现在拥有的相似(每个场景返回下一个要播放的场景)。

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

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