2012-09-12 71 views
2

我正在製作一個國際象棋遊戲,用OpenGL渲染。C++/OpenGL國際象棋遊戲程序設計建議

我不是在找人告訴我所有的答案,我想要自己的代碼出來,但指出我正確的概念是我真正需要的。在這一點上,我不確定從哪裏開始。這裏是我已經想通了:

枚舉,TurnState,具有以下值:

  • playerOneTurn
  • playerTwoTurn
  • Stopped

枚舉,GameState,與以下值:

  • playerOneCheck
  • playerTwoCheck
  • playerOnecCheckMate
  • PlayerTwoCheckMate
  • InitializingGame
  • Tie
  • NormalPlay

抽象類,Player,和一個子類,Computer

類,ChessGame,具有以下字段:

Player p1, p2 
TurnState turnState 
GameState gameState 

類,Move,具有以下字段:

*Piece 
Location origin 
Location destination 

類,Location,具有以下字段:

row 
col 
*ChessBoard 

A class,ChessBoard,使用一種方法isValid,它需要Move並檢查移動是否有效。

一個抽象類,ChessPieces,用下面的方法:

GetValue()  // returns an int value of the piece (for scoring) 
GetPosition() // returns the current position of a piece 
getIsSelected() // returns a boolean, true if selected, false if unselected 
move()   // moves the piece in a way dependent upon what piece 

而下面的子類:

  • Pawn
  • Rook
  • Queen
  • King
  • Knight
+0

堆棧溢出的格式,減價,搞砸了原來的格式。我已經將其編輯爲更具可讀性,但您可能需要進一步編輯它。 – icktoofay

回答

3

至於棋局的AI部分:

要獲得國際象棋AI,或任何類型的回合制遊戲AI,你將需要計算的「價值」在某一回閤中的遊戲(這很重要)(即你爲每個棋子分配一個值,然後將player1和player2的值相加,然後你得分= player1score - player2score,所以負值有利於玩家2和正面玩家,玩家1,這僅僅是一個基本的例子,而不是一個非常有效的例子,但它是解釋遊戲「價值」的最基本方式)。

之後你可以計算出你需要能夠計算給定板的某種配置的玩家的每一個可能的移動。

這樣你就可以建立一個決策樹,在這棵樹中你將擁有當前遊戲狀態的根節點。樹的下一個「級別」將表示您可以從當前狀態(等等)獲得的每種可能狀態。重要的是要注意,如果你考慮玩家1可能在樹的等級上的移動,你會考慮玩家在下一個可能的移動。

接下來要做的是:

假設PLAYER1是會做出的舉動,他將考慮在樹上,直到深度5(用於一盤棋,你永遠不會看在整個樹)。所以他會選擇一個會爲他優化的舉動,這意味着:在每個級別他都會考慮他的最佳舉動或者player2的最佳舉措(所以他會在最壞的情況下工作),所以他會把樹的下一級中最高值的節點。

要計算節點的值,請執行以下操作: 注意:考慮根節點的深度爲0,每個奇數深度節點需要爲player1的maxValue和player2的每個偶數深度節點minValue。

您會將樹擴展到您定義的最大深度,對於maxDepth中的節點,您只需計算板的值(我在回答的開頭提到),對於上層節點,會做:

即使節點的值:minValue(最小值)的所有子節點之間 奇節點的值:包括maxValue所有子節點之間

所以基本上你會做迴歸查找節點的基礎上的價值的價值更深的節點。那麼,你可以研究一些其他的東西,如果你想你可以PM我,我已經做了一些關於這種搜索的工作,我只是在這裏描述了最基本的想法,爲了獲得高效的代碼,您需要大量的優化技術。

希望它有一點幫助

1

首先:分開兩個:AI和GUI/OpenGL。在國際象棋中,在兩個不同的進程與預定義的協議進行通信時,將GUI和AI(計算機國際象棋術語中的「引擎」)置於正常狀態是正常的。這兩個最流行的協議是UCI和WinBoard。

對於國際象棋引擎的一部分,你基本上需要三個東西:

  1. 一個板/位置表示
  2. 葉節點評價函數
  3. 一個搜索算法

我建議你閱讀:

  1. Chess Programming WIKI
  2. TalkChess forum for computer chess
  3. 研究的一個開放源計算機下棋發動機,如鱈魚乾,狡猾或水果。
0

這可能不是直接回答你的問題(實際上你的問題是什麼?),但你提到你想要的是指向正確概念的指針。

oysteijo是對的,其中一個非常重要的概念是將程序的各個部分彼此分開。

對於像國際象棋這樣的事情,國際象棋遊戲存在許多高效優雅的表現形式。我會說MVC(模型,視圖,控制器)設計模式對於象棋遊戲來說工作得很好。

希望這會有所幫助,如果不是的話,我建議你再閱讀一下MVC。

您的模型將主要涉及存儲遊戲狀態表示的數據結構,這是棋盤。一件作品只能在64個作品中的一個作品上,而作品的種類,作品的種類以及作品的種類都有限制。該模型將負責處理這些東西。爲模型提供確定任何給定移動的合法性的邏輯(即遊戲的屬性不一定涉及任何給定遊戲實例的狀態)也是有意義的。

該視圖是所有與演示相關的代碼所在的位置。所有這些OpenGL都會在這裏進行,就像一個「調試」例程,它可能(例如)將棋盤的ASCII表示打印到控制檯。

控制器可能有一些與用戶接口來處理輸入的功能。控制器是操縱模型的代碼(「將E5移動到D3」:控制器中的一個函數可能調用model.moveKnight('D3'))和視圖(「以光榮的3D繪製板子」:控制器可能會執行一些操作,如調用openGLView.draw(model)

MVC幫助實現的主要目標之一是獨立執行不同任務的代碼部分。如果AI中的某些變化導致渲染算法出現問題,那麼這是一個令人沮喪和困難的位置。有經驗的程序員會花費很大的精力確保不會發生這種情況。

在這一點上,你可能想知道你的AI代碼適合圖片。那麼,這真的取決於你。用你最好的判斷力。它可能是控制器的一部分。我個人認爲它是一個完整的控制器(chessAIController),它實現了AI算法,但它很容易包含在主控制器中。

問題是,只要以某種邏輯方式完成代碼,實際上如何組織代碼並不重要。 MVC如此廣泛的原因在於,這3個組件通常存在於大多數軟件中,通常將它們分開是有意義的。注意它們實際上並沒有真正分開......控制器通常直接操縱視圖和模型。諸如不允許視圖操縱任何東西的限制有助於代碼保持乾淨和清晰。

當你在編程項目中沒有結構或組織也可以是幾乎不可能的,以避免巨大的程序裏面做一切的一點點,因爲真的是有在其中在建立功能的代碼只有一個地方。這一切產生的總是大量的意大利麪條代碼,無論語言水平如何高,都無法使您擺脫困境。這會創建一些簡單的代碼,因爲沒有其他人能夠理解它,甚至連編寫它兩週後你都無法理解它。