2011-12-30 3 views
1

Я пишу простую игру в командной строке в Ruby. Мне нужен основной код игры, а затем независимый код для двух игроков, которые будут написаны двумя разными людьми или командами. Таким образом, основная игра должна позволить игрокам играть без изменения кода.Программы, работающие вместе

Я думал о том, как это сделать, но это самый большой проект программирования, который я когда-либо делал, и у меня, честно говоря, еще нет хорошей идеи.

Должны ли оба игрока-программы определять метод, который вызывает основная игра? Должен ли я иметь класс Player и иметь подкласс класса Player-Programms? Я пробовал несколько вещей, но, похоже, это не то, что я искал, или то, что можно считать достойным дизайном.

Что было бы хорошим способом сделать это в Ruby (или на любом другом языке, так как проблема является общей проблемой программирования)?

Надеюсь, я смог правильно сформулировать вопрос.

+1

Являются ли игровые программы «требуемыми» или являются отдельными процессами? – Linuxios

+0

Не знаю. Я мог бы иметь стандартное имя файла, которое player1.rb и player2.rb и требуют их. Но я предпочел бы использовать что-то другое, например, как предложил Асмунд Элдхусет. Я хотел бы иметь разные ИИ и позволить им играть друг с другом. Что ты предлагаешь? – kmikael

+0

Если игра в игру состоит только из одного или двух раз, когда игрок должен быть опрошен, вы можете использовать объекты lambdas или method. Это будет немного легче. Или вы можете использовать подход «load (file, true)» для кода песочного бокса. Или вы можете запускать их как отдельные потоки Ruby с пониженными привилегиями и запрашивать их через некоторую согласованную переменную. Это действительно зависит от количества сообщений между вашим программным обеспечением и программным обеспечением для воспроизведения. – Linuxios

ответ

3

Я бы сказал, что подход подкласса звучит хорошо (на других языках интерфейс может быть лучшим выбором, но я не думаю, что интерфейсы существуют в Ruby). Метод, который должен реализовать каждый класс игрока, должен принимать в качестве параметра объект, который содержит все состояние игры (например, позиции фигур, если вы делаете шахматы). Этот объект должен быть доступен только для чтения или должен быть копией состояния игры, чтобы классы игроков не могли напрямую изменять состояние игры. Вместо этого метод, который должны реализовывать классы игроков, должен возвращать некоторое значение, указывающее, что движет игрок. Я полагаю, что Ruby поддерживает некоторый механизм для динамического создания экземпляра класса из другого файла на основе имен класса и файла. Вы можете начать игру, как это, используя параметры, чтобы указать имена файлов и классов:

ruby game.rb player1.rb Player1Class player2.rb Player2Class 

Игра вероятно, будет выглядеть как этот псевдокод:

gameState = createObjectDescribingInitialGameState() 
player1FileName = args[0] 
player1ClassName = args[1] 
player2FileName = args[2] 
player2ClassName = args[3] 
player1 = dynamicallyInstantiateClassFromFile(player1ClassName, player1FileName) 
player2 = dynamicallyInstantiateClassFromFile(player2ClassName, player2FileName) 
currentPlayer = player1 
while not gameState.isGameOver(): 
    move = currentPlayer.makeMove(gameState.createReadOnlyCopy()) 
    gameState.peformMove(move) 
    currentPlayer = player2 if currentPlayer == player1 else player1 

При таком подходе, вы можете написать ядро игровой код один раз и запустить его без изменений с помощью любой пары игровых классов.

Смежные вопросы