跳棋算法


摘要:介紹了跳棋游戲的游戲功能及程序總體邏輯,在此基礎上深入探討了跳棋游戲中的查詢棋子可跳動位置、最佳路徑提示、電腦落子和玩家落子的算法,通過這些算法實現游戲按規則有序的進行。
中國論文網 http://www.xzbu.com/8/view-3599881.htm
  關鍵詞:游戲設計;跳棋游戲
  中圖分類號:TP311 文獻標識碼:A 文章編號:1007-9599 (2012) 13-0000-02
  一、引言
  電腦游戲軟件的產生,使得計算機的娛樂功能產生了質的提升,進一步加快了計算機的普及。當代快節奏的生活方式,加深了人們對計算機游戲軟件的需求。計算機游戲軟件應用而生。隨着計算機技術的發展,游戲軟件給用戶帶來了全方位的感官體驗,各種游戲引擎的引入,使得計算機游戲軟件的用戶體驗越來越逼真、形象。於此同時,各種簡單的休閑游戲也呈現出異軍突起的陣勢。各類休閑小游戲引起本身的易移植性,也為眾多游戲開發者所寵愛。同時,由於各種辦公室累工作者閑暇時間,以及工作壓力較大的工作人員在下班時間往往選擇比較簡單易懂,而富有趣味性的計算機游戲來進行放松。因此,簡單小游戲的開發前景也為作者所看好。本文基於以上各種考慮,通過C#語言開發了一款簡單的跳棋游戲軟件。
  二、功能描述及游戲總體邏輯
  在跳棋游戲中,玩家數為偶數,且必須大於等於2小於等於6,游戲可以是人與人參與,也可以是人與電腦。在游戲初始化完成后,所有玩家的10顆棋子都位於自己所在方棋盤上倒立的正三角形上,玩家在游戲過程中的目標是,在游戲規則允許的情況下,將自己的棋子移向並完全占領對面玩家棋子在棋盤上的初始位置。游戲規則為:參與游戲者輪流出棋跳子,棋子每次可以移動到本棋子相鄰位置的任意一個空位置,也可以像蹺蹺板一樣,隔着旁邊的一顆棋子直接跳到對稱位置上,並且隔子跳動的方式可以實現連續跳動(若后方還有可以隔子跳動的位置)。跳棋各方的目的都是將自己的棋子全部移動到對方玩家棋子的初始位置,先完成將自己的棋子全部移動到對方棋子初始位置的一方為勝利[1]。
  三、跳棋游戲設計的關鍵算法
  (一)查詢棋子可跳動位置
  棋子可跳動位置是用數組來存儲的,在開始游戲前,棋子初始化的過程就是將所有棋子的可跳動位置數組重置更新,棋子可跳動位置的數組在初始化后不能為空,否則游戲將無法開始;在玩家玩游戲的過程中,玩家的每次執棋跳動都會對其他棋子的可以跳動的位置產生很大的影響,所以在實現跳棋游戲很重要的一點就是實現查詢棋子的可跳動位置。在本設計的查詢棋子可跳動位置的實現中,用到的函數為:SetAllowPlace函數負責修改棋盤中所有棋子的可跳動位置數組;SetSide函數用來添加棋子鄰近的可跳動位置;Chess為遞歸函數,用來計算當前棋子的6個方向的可跳動位置數組;AddPlace函數將當前位置保存到當前棋子的可跳動位置數組中,並且函數AddPlace也可繼續嵌套調用函數Chess。SetAllowPlace函數為本游戲的核心函數,它負責每次跳動結束后所有棋子的可跳動位置數組的更新,這樣當玩家為電腦時電腦落子函數會根據自己10顆棋子的可跳動位置數組,來選擇一顆能盡可能跳得遠的棋子來跳動。而當玩家為人時,雖然人只是根據自己的主觀判斷來選擇位置跳動,但人必須按游戲規則選擇存在於自己10顆棋子的可跳動位置數組中的位置跳動,保證玩家對游戲規則的遵守,否則程序是不予響應棋子上的鼠標點擊事件。
  SetAllowPlace函數算法思想:由於考慮到游戲過程中棋子可以連續跳動和跳向相鄰的空位置兩種情況,所以在更新棋子可跳動位置數組的時候,函數分為兩種情況討論:一、實現棋子的連續跳動;二、棋子向相鄰的位置跳動。只所以把棋子的跳動分為兩個函數來寫,是因為棋子跳動相鄰位置時不可再繼續往下走,而棋子隔子跳動時可接着再隔子跳動,但隔子跳動一步后不可再跳向相鄰的可跳動位置。
  Chess和ChessOdd函數算法思想:要尋找棋子的可連續跳動的位置,就要向着棋子的6個方向來尋找,逐方向尋找可跳動位置。而在尋找每個方向的跳動位置時,要實現棋子的隔子跳動,也就意味着要找到一個棋子,並且以這個棋子做跳板,跳到同方向對稱的位置上。因此在尋找j方向是否有可跳動位置時分兩步判斷,第一步判斷j方向是否有棋子,如果有棋子則該棋子就是跳板;第二步判斷當前棋子j方向上的棋子的j方向是否有棋子,如果有棋子則退出(說明位置被占住,當前棋子不能跳到此位置),如果沒有棋子則該位置可跳動,所以將該位置加入當前棋子的可跳動位置數組中,並將i更新為該位置的編號,調用Chess繼續往后尋找可跳動的位置,即從尋找到的可跳動位置繼續尋找下一個可跳動的位置,從而實現棋子的連續跳動。這是跳棋在更新位置數組時所使用的搜索算法的基本思想,也是本程序的關鍵。
  AddPlace函數算法思想:加可跳動位置bh到當前棋子的可跳動位置數組時,首先我們要判斷該位置是否已經存在於當前棋子的可跳動位置數組中,若存在則不需添加,若不存在則將該位置編號添加到當前棋子chess的可跳動位置數組中,到這里僅實現了棋子的一步隔子跳動,並沒有實現棋子的連續跳動,為了實現棋子的連續跳動我們自然會想到函數的嵌套調用,這時我們就以該可跳動位置為起點,繼續調用Chess函數(只是這時的i是之前添加的可跳動位置的編號bh,即i=bh),從該可跳動位置開始繼續向前尋找可跳動的位置,當當前棋子的6個方向均遍歷結束后即跳出此次循環。
  SetSide函數算法思想:添加相鄰可跳動位置到當前棋子的可跳動位置數組時,從當前棋子的6個方向逐方向判斷,若當前方向棋孔上沒有棋子則將當前方向棋孔的編號加入到當前棋子的可跳動位置數組中,若當前方向有棋子或不存在,則繼續向下個方向尋找。
  (二)最佳路徑提示算法
  根據游戲規則,棋子只能有兩種跳法:
  1.跳向相鄰位置,且相鄰位置上沒有棋子;
  2.每步隔相鄰一顆棋子跳動,實現連續跳動。
  首先這個算法采用遞歸的思想,從最開始的位置,逐步向周圍尋找,如果存在則加入最佳位置數組,並且修改當前起始位置,再次遞歸調用該算法,繼續往后尋找;如果不存在則刪除起點位置,從下一個方向的棋子再次搜尋。其中跳法1中若找到相鄰位置則代表程序結束,跳法2中若找到結束位置則代表程序結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM