freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于java語言的中國象棋設(shè)計與實現(xiàn)畢業(yè)設(shè)計-wenkub.com

2024-08-23 15:28 本頁面
   

【正文】 ){ ( 黑棋走棋 )。 //賦給棋子 play[M].setVisible(true)。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計) 23 }//else if 界面功能算法實現(xiàn) 悔棋功能的實現(xiàn) 本設(shè)計設(shè)置了悔棋按鈕,玩家可以依據(jù)自己的需要悔棋,沒有次數(shù)的 限制,悔棋按鈕是通過記錄坐標(biāo)的方式執(zhí)行悔棋的,具體算法如下: else if (().equals(repent)){ try{ //獲得 setVisible 屬性值 String S = (String)(()4)。 ( 黑棋勝利 )。 //將炮的位置移動到目標(biāo)子的位置 ((), Y(),55,55)。 ((()))。 ((()))。amp。amp。amp。amp。 public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){ int Count = 0。 在炮吃子時,需要定義一個變量,記錄起點和終點間是否有子。 (() ()) = 2 amp。amp。 ((),()+57,55,55)。 (()()) 0){ ((()))。 (()()) 86 amp。如果是向下,距離也是一步,可以通過 Y 坐標(biāo)加一的方式移動棋子,若果是向左右移動,就需要在判斷移動距離的同事判斷是否已經(jīng)過河,如果符合規(guī)則,可以通過 X 坐標(biāo)的加減來實現(xiàn)。 本文中,利用數(shù)組來記錄棋子的位置,并依據(jù)數(shù)組中 X, Y 坐標(biāo)的改變來改變棋子在棋盤中的位置。 GenKnightMoves(ChessPosition Position,HistTab){ 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計) 20 根據(jù) Position,得出當(dāng)前局面 player 馬的偽合法著法; for(all 馬的偽合法著法 ){ if ((其中一個著法 )){ ()。//車 GenCannonMoves(Position, HistTab)。//帥將 GenAdvisorMoves(Position, HistTab)。039。)。 } public void move(String moveStr) { src = (char) ([(0) 39。 dst = d。//位置 a0=0,b0=10 public boolean chk。 File[90]和 Rank[90]保存的是格子對應(yīng)的列和行,這比 “%、 /”(取余和除法)的運算速度快。 } } else { if ((Attack amp。 } } } else {//與目標(biāo)位置的列位置不同,也就是 “平 ” BitWord = BitRanks[y]。 } else {//不吃子 return = [y][BitWord] + Bottom[x]。//棋子所在的列 y = Rank[]。//被攻擊的棋子 if ((Attack amp。 現(xiàn)列出生成合法著法的算法并附簡要說明如下: 偽合法著法的合法性判斷: 以炮為例,算法如下: public boolean LeagalMove(MoveStruct Move){ int Piece, Attack, x, y, BitWord; Piece = Squares[]。 break。 k ) { if ((j amp。 (1 k))!=0) { k 。 } } FileCannonCapMin[i][j] = i。 (1 k))!=0) { FileCannonCapMoves[i][j][Index] = k。 break。 for (k = i + 1。 break。 k ) { if ((j amp。 break。 k ++) { if ((j amp。 Index = 0。 } FileNonCapMoves[i][j][Index] = k。 for (k = i 1。 } FileNonCapMoves[i][j][Index] = k。 for (k = i + 1。 i ++) {//10 條橫線 for (j = 0。 //兵照將 帥、將的位置共有 18 個,每個位置有一個編號,從 0 到 17,對應(yīng)數(shù)組的第一個下標(biāo)。 //車縱線照將 public static final BitBoard[][] FileCannonCheck=new BitBoard[18][1024]。 下面是最大的位移量和最小的位移量,用來生成合法著法時初步判斷著法的合法性: RankNonCapMax[2][101]=2 //不吃子著法中最大的格子增量 RankNonCapMin[2][101]=1 //不吃子著法中最小的 格子增量 RankRookCapMax[2][101]=3//車吃子著法中最大的格子增量 RankRookCapMin[2][101]=2//車吃子著法中最小的格子增量 RankCannonCapMax[2][101]=4//炮吃子著法中最大的格子增量 RankCannonCapMin[2][101]=2//炮吃子著法中最小的格子增量 以上是橫向(平)著法的靜態(tài)數(shù)組,縱向著法的表示與此類似,在此不再贅述。棋盤的橫線合縱線分別有 10 條和 9 條,這就是數(shù)組第一個下標(biāo) 10 和 9 的含義,用來指示車炮在哪條橫線或縱線上。 public static final int[][] RankCannonCapMin=new int[9][512]。//平 public static final int[][] RankNonCapMin=new int[9][512]。 public static final int[][] FileRookCapMin=new int[10][1024]。 public static final int[][][] RankCannonCapMoves=new int[9][512][4]。 //共十條橫線 ,FileNonCapMoves[y][bitWordY][index]=newY,進 public static final int[][][] FileRookCapMoves=new int[10][1024][4]。 AdvisorMoves[90][8]保存的是士的著法。為了速度(以位移運算取代除法運算),第 2 個坐標(biāo)值用 2 的整次方冪。 public static final int[][][] PawnMoves=new int[90][2][4]。 public static final int[][] BishopMoves=new int[90][8]。將軍的著法單獨作為一類。(偽合法著法并不考慮被吃的棋子的顏色 ——該棋子是對方的棋子 還是己方的棋子,也不考慮該子是否能動,例如動了該子,雙方的帥將會面。在對局中可以用 “查表 ”的方式查找生成的偽著法,并對其合法性作出判斷。 國際象棋引擎 Crafty(其作者是 Robert Hyatt 博士 )使用三個著法生成函數(shù)。 我選擇 使用位棋盤生成著法的基本原理。 ZobristLock^=ZobristLockTable[PieceType][Square]。 public class ChessPosition{ long ZobristKey, ZobristLock。 i ++) { for (j = 0。 j ++) { ZobristKeyTable[i][j] = ()。 for (i = 0。 long RandSeed。 public static long[][] ZobristLockTable = new long[14][90]。 Java 中 實現(xiàn) Zobrist 鍵值 本系統(tǒng)使用 一個 key 和一個 lock 結(jié)合來區(qū)分每個局面,這 樣 發(fā)生沖突(即兩個局面對應(yīng)的 key 和 lock 一樣)的概率幾乎為 0。 這個 函數(shù)用來填滿一個 long 型( 64 位)的三維數(shù)組:棋子的類型、棋子的顏色和棋子的位置: long zobrist[pcMAX][coMAX][sqMAX]。 如果要改變著子的一方,只要異或一個 “改變著子方 ”的鍵值就可以了。例如,紅馬在 e5 格,那么鍵值里一定異或過一個 “zobrist[KNIGHT][RED][E5]”。 Zobrist 鍵值的工作原理 Zobrist 鍵值的工作原理 用 Zobrist 技術(shù)產(chǎn)生的鍵 值,表面上與局面沒什么關(guān)系。如果比較每個棋子的位置,或許不需要花很多時間,但是實戰(zhàn)中每秒種需要做成千上萬次比較,因此這樣會使比較操作變成瓶頸的。 = (,bitMask[h9])。 /* clear a bit with the XOR operation */ = (,bitMask[h2]。 break。 現(xiàn)在初始化其他一些位棋盤 : for (c = 0。 piece_in_square[0] = RED_ROOK。//黑卒 BitBoard redPieces。//黑象 BitBoard redAdvisor。//黑馬 BitBoard redCannon。//黑將 BitBoard redRooks。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計) 8 int player。 c ++) { mask[c] = (b,c)。此處敘述走棋過程中隨棋局變化的諸多位棋盤的初始化及相關(guān)操作。例如 “AllPieces”位棋盤。例如上面所述的那個位棋盤數(shù)組 “knight[90]”。 public static BitBoard opXor(BitBoard arg1,BitBoard arg2) //位棋盤的 “異或 ”操作,保存結(jié)果。 int hi= amp。 int low= amp。代碼摘要(詳細代碼見附件)及相關(guān)說明如下: public class BitBoard{ private int Low,Mid,Hi//用 3 個 int 字段表示位棋盤,最高位 Hi 的高 //6 位不用 public BitBoard(int Arg1, int Arg2, int Arg3) {//構(gòu)造函數(shù) Low = Arg1。) 0 1 0 1 1 0 0 1 ———— 0 0 0 1 或 (|) 0 1 0 1 1 0 0 1 ———— 1 1 0 1 異或 (^) 0 1 0 1 1 0 0 1 ———— 1 1 0 0 取補 (~) a = 0001, ~a = 1110。 AllPieces 告訴我們棋盤上哪些格子有棋子,哪些沒有。其過程如下所示(圖 1): 當(dāng) 前 棋 局著 法 生 成 器m 1 m 2 m 3 … . . m n搜 索 算 法 搜索輔助局面評估著 法 隊 列 圖 1 著法生成 —— 位棋盤 什么是位棋盤 在中國象棋中,棋盤有 90 個交叉點。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計) 5 3 界面設(shè)計框架 程序的框架 從程序的結(jié)構(gòu)上講,大體上可以將引擎部分劃分為四大塊: 棋局表示; 著法生成; 搜索算法; 局面評估。 在行棋時依照 “馬走日,象走田,車、炮走直線、士在框內(nèi)走斜線,卒未過河是上下走、過河可左右行走且不能回頭,將 、帥 只能在框內(nèi)行走 ”等行走規(guī)則,且按照 “炮必須隔一個棋子才能吃棋子,其他棋子按棋子行走規(guī)則的位置實現(xiàn)吃子 ”的規(guī)則, 完全符合象棋的行棋規(guī)則。用 JAVA 編寫的中國象棋程序?qū)崿F(xiàn)了人與人的對弈, 符合 中國象棋的行棋 規(guī)則, 界面美觀,能夠激起 玩家 的興趣,同時單機游戲?qū)τ嬎銠C的環(huán)境要求十分簡單、易于實現(xiàn)。人們可以隨心所欲的選擇任何時間進行游戲,而且人人對戰(zhàn)還可以實現(xiàn)對戰(zhàn)雙方的直接交流,尤其隨著筆記本電腦的普及,基本上可以 隨時隨地都把它們帶在身邊,在人們離開家或者想玩的時候,可以不受任何時間地點限制地玩自己選擇的游戲。棋類游戲作為一種簡單易學(xué)的休閑游戲,一直深受廣大群眾的 喜愛。 最后,依據(jù)框架和目標(biāo)編寫代碼, 實現(xiàn)主要功能并且 進行測試,直至 程序運行 成功。 因此,我們迫切的需要一個更加基礎(chǔ)、更加實用的中國象棋對戰(zhàn)平臺。中國象棋的藝術(shù)和棋理折射著以儒家思想為正統(tǒng)的東方民族文化精神,深為我國各階層人民喜愛。國際象棋軟件有著成功的商業(yè)運作,已發(fā)展成一種產(chǎn)業(yè)。 本文 通過研究中國象棋的國內(nèi)外研究現(xiàn)
點擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1