2011-12-30 38 views
1

我正在用Ruby寫一個簡單的命令行棋盤遊戲。我需要擁有主要的遊戲代碼,然後爲兩個玩家編寫獨立的代碼,這些代碼將由兩個不同的人或團隊編寫。所以主遊戲需要允許不同的玩家在不改變任何代碼的情況下玩遊戲。程序一起工作

我一直在想辦法做到這一點,但是這是我有史以來最大的編程項目,我坦率地說沒有一個好主意呢。

兩個玩家程序是否應該定義主遊戲所調用的方法?我是否應該有一個Player類並且擁有player-Programms子類?我嘗試了一些東西,但它似乎永遠不是我所尋找的東西,或者甚至是體面的設計。

在Ruby(或任何其他語言,因爲這個問題是一般的編程問題)中這樣做的好方法是什麼?

我希望我能夠正確地說出問題。

+1

玩家程序是「需要」的,還是它們是獨立的進程? – Linuxios 2011-12-30 23:11:02

+0

我不知道。我可以有一個標準的文件名,即player1.rb和player2.rb並且需要它們。但我寧願使用別的東西,就像Aasmund Eldhuset所說的那樣。我想有不同的AI,讓他們互相玩。你會建議什麼? – kmikael 2011-12-31 00:26:48

+0

如果玩家需要輪詢一次或兩次玩遊戲,則可以使用lambdas或方法對象。這會更容易一些。或者你可以使用'load(file,true)'方法來製作沙盒代碼。或者你可以將它們作爲單獨的具有較低特權的Ruby線程運行,並通過一些商定的變量來查詢它們。這取決於您的軟件和播放軟件之間的通信數量。 – Linuxios 2011-12-31 00:54:42

回答

3

我想說的是,子類的方法聽起來不錯(在其他語言中,接口可能是一個更好的選擇,但我不認爲在接口紅寶石存在)。每個玩家類必須實現的方法應該將包含整個遊戲狀態的對象(例如,如果您正在下棋的棋子位置)作爲參數。這個對象必須是隻讀的,或者必須是遊戲狀態的副本,以便玩家類不能直接改變遊戲狀態。相反,玩家類必須實現的方法應該返回一些值,表明玩家希望做什麼。我想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 

通過這種方法,你可以寫核心遊戲代碼一次,並且無需修改任何一對玩家類就可以啓動它。

相關問題