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

正文內(nèi)容

基于java語(yǔ)言的中國(guó)象棋設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)-wenkub

2022-09-07 15:28:26 本頁(yè)面
 

【正文】 狀、分析中國(guó)象棋的需求和用 JAVA語(yǔ)言設(shè)計(jì)中國(guó)象棋程序的可行性,同時(shí) 根據(jù)國(guó)際象棋程序設(shè)計(jì)的一些成功經(jīng)驗(yàn),主要借鑒了位棋盤、 Zobrist 鍵值等, 針對(duì)中國(guó)象棋程序設(shè)計(jì)的一系列問(wèn)題,總結(jié)出一些 中國(guó)象棋程序 的設(shè)計(jì)方法 。盡我所知,除文中特別加以標(biāo)注和致謝的地方外,不包含其他人或組織已經(jīng)發(fā)表或公布過(guò)的研究成果,也不包含我為獲得 及其它教育機(jī)構(gòu)的學(xué)位或?qū)W歷而使用過(guò)的材料。對(duì)本研究提供過(guò)幫助和做出過(guò)貢獻(xiàn)的個(gè)人或集體,均已在文中作了明確的說(shuō)明并表示了謝意。 根據(jù)該方法 設(shè)計(jì) 出了符合中國(guó)象棋 行棋和吃子規(guī)則,能夠判斷勝負(fù) ,能夠 實(shí)現(xiàn)悔棋、重新開(kāi)始等 多種 功能, 而且 界面 十分 美觀的中國(guó)象棋程序,并給出了 JAVA 語(yǔ)言的實(shí)現(xiàn)方法。在設(shè)計(jì)中國(guó)象棋軟件過(guò)程中,國(guó)際象棋軟件有很多值得借鑒的成功經(jīng)驗(yàn)和優(yōu)秀的思想。但是中國(guó)象棋在國(guó)際上的普及率仍然很低,并因此未被入選 2020 年廣州亞運(yùn)會(huì)的競(jìng)賽項(xiàng)目 。 預(yù)期目標(biāo) 首先進(jìn)行理論的研究,研究 JAVA 編程的基礎(chǔ),包括 JAVA 編成的主要步驟及所需要的工具和軟件, 熟悉編程軟件后,開(kāi)始著手 進(jìn)行 研究,設(shè)計(jì)出論文的主要框架和具體實(shí)現(xiàn)的步驟、目標(biāo) 。 最終 在深入研究理論的基礎(chǔ)上,實(shí)現(xiàn)基于 JAVA 語(yǔ)言設(shè)計(jì)的中國(guó)象棋,做出預(yù)期的完整游戲。 JAVA 作為一種程序編寫的語(yǔ)言,在軟件市場(chǎng)的影響力快速提高,潛力巨大。 可行性分析 隨著計(jì)算機(jī)的普及和應(yīng)用,電子游戲已經(jīng)深入到我們生活的各個(gè)方面,利用電子游戲推廣我國(guó)文化、增加我國(guó)傳統(tǒng) 游戲的市場(chǎng)占有率,是將我國(guó)文化推向世界的 比較便捷的一種方式。 功能分析 打開(kāi)游戲,鼠標(biāo)所在的功能鍵會(huì)突出顯示,點(diǎn)開(kāi)新游戲后,原本的 “歡迎使用象棋對(duì)弈系統(tǒng) ”會(huì)變成提示 “紅棋 走棋 ”或 “黑棋走棋 ”。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 4 硬件環(huán)境 開(kāi)發(fā)環(huán)境 硬件環(huán)境 CPU: AMD Turion(tm)64*2 內(nèi)存: DDR 硬盤: 80G 軟件環(huán)境 操作系統(tǒng): WINDOWS XP 開(kāi)發(fā)語(yǔ)言: JAVA 運(yùn)行環(huán)境 32M 以上內(nèi)存, 4G 以上硬盤。 程序的大概的思想是: 首先使用一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)描述棋局信息,對(duì)某一特定的棋局信息由著法生成器生成當(dāng)前下棋方所有合法的著法并依次存入著法隊(duì)列。位棋盤其實(shí)就是一個(gè)長(zhǎng)度為 90 位的變量,每個(gè)位對(duì)應(yīng)一個(gè)交叉點(diǎn),用來(lái)記錄棋盤上的某些布爾值。當(dāng)棋子處于最初位置的時(shí)候, “AllPieces”看上去是這個(gè)樣子的 (以下描述中,格子的下標(biāo)從 0 開(kāi)始 ): (Hi,89,a9)111111111 000000000 101010101 000000000 000000000 101010101 000000000 010000010 000000000 111111111(Low,0,i0) 其最高位對(duì)應(yīng)第 89 格 (a9 格 ,左上角 ),最低位對(duì)應(yīng)第 0 格 (a8 格,右下角 )。 Java 中位棋盤的實(shí)現(xiàn) 位棋盤類的實(shí)現(xiàn) Java 中,位棋盤用 3 個(gè) int 型的數(shù)據(jù)表示,最高六位不用。 Mid = Arg2。 。 。 public static int count(BitBoard arg) //計(jì)算位棋盤中非零位的個(gè)數(shù) public static BitBoard duplicate(int arg) //復(fù)制位棋盤 public static boolean equals(BitBoard arg1,BitBoard arg2) //位棋盤是否相等(所有 90位對(duì)應(yīng)的位相同即 //為相等) public static BitBoard leftShift(BitBoard arg,int num) //位棋盤 arg左位移 num位 public static rightShift(BitBoard,int num) //位棋盤右位移 num位 public static int LSB(BitBoard Arg) //位棋盤最低非 0位的位置(從 0開(kāi)始計(jì)數(shù)) public static int MSB(BitBoard Arg) //位棋盤最高非 0位的位置(從 0開(kāi)始計(jì)數(shù)) public static boolean notZero(BitBoard Arg) //是否非 “0”。 (他實(shí)際上記錄了當(dāng) “馬 ”在任意格子上時(shí),它下一步可以走的格子。當(dāng)中國(guó)象棋棋盤變化時(shí),它也跟著變化。 首先,初始化 “BitBoard bitMask[90]”數(shù)組: BitBoard b = new BitBoard(0,0,1)。 } 其次,用一個(gè)叫 ChessPosition 類記錄棋盤上某一狀態(tài)的所有有用信息。 //輪到哪方走棋, 2:紅方走, 1:黑方走 BitBoard allPieces。//紅車 BitBoard blackRooks。//紅炮 BitBoard redCannon。//紅仕 BitBoard blackAdvisor。//所有紅棋子 BitBoard blackPieces。 piece_in_square[1] = RED_KNIGHT。 c 90。 … } } 位棋盤的更新 當(dāng)棋盤局面變動(dòng)后,某些位棋盤就需要被更新。 = (,bitMask[h2])。 現(xiàn)在我們要將 blackPieces 和 blackKnights 位棋盤的 h9 位清除,因?yàn)槟抢锏暮隈R被吃掉了。另外,需要比較的局面數(shù)量多得驚人,要存儲(chǔ)每個(gè)棋子的位置,需要占用非常大的空間。如果一個(gè)棋子動(dòng)過(guò)了,就會(huì)得到完全不同的鍵值,所以這兩個(gè)鍵值不會(huì)擠在一塊兒或者沖突。如果再次異或這個(gè)值,那么根據(jù)異或的工作原理,這個(gè) “馬 ”就從鍵值里刪除了。用這種方法,可以在搜索根結(jié)點(diǎn)的時(shí)候構(gòu)造一個(gè) Zobrist 鍵值,在搜索時(shí)通過(guò)走子函數(shù)“MakeMove()”來(lái)更新鍵值,一直讓它保持和當(dāng)前局面同步。 程序啟動(dòng)時(shí)就把這個(gè)數(shù)組用隨機(jī)數(shù)填滿。示例代碼及相關(guān)說(shuō)明如下 填充數(shù)組 上述的三維數(shù)組現(xiàn)在改變?yōu)槎S(將顏色與棋子兵種類型合并) …… public static long ZobristKeyPlayer。 …… static{ …… zobristGen()。 RandSeed = 1。 i 14。 } } ZobristLockPlayer = ()。 j 90。 //當(dāng)前局面的 zobrist 鍵值 public ChessPosition{ …… ZobristKey=0。 ZobristKey ^= ZobristKeyPlayer。 之所以 用這種方式生成著法 , 是 因?yàn)?生成著法耗費(fèi)一定的時(shí)間。一個(gè)用來(lái)生成所有偽合法吃子著法,一個(gè)生成所有偽合法不吃子著法,最后一個(gè)生成所有擺脫被將軍狀態(tài)的著法。這樣可以節(jié)省大量的時(shí)間。)炮和車的不吃子著法規(guī)則相同,但分為縱向橫向行走兩類。 本程序使用靜態(tài)數(shù)組存儲(chǔ)生成的偽 合法著法,先對(duì)其作一些說(shuō)明。 public static final int[][] ElephantEyes=new int[90][4]。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 13 第一個(gè)下標(biāo)說(shuō)明棋子所在的格,第二個(gè)下標(biāo)含義不盡相同。(在后面所講的開(kāi)局庫(kù)和置換表的大小設(shè)置是 2 的整次方冪也是這個(gè)道 理。 BishopMoves[90][8]保存的是相(象)的著法, ElephanEyes[90][4]保存的是相(象)著法對(duì)應(yīng)的塞象眼的位置。 public static final int[][][] FileCannonCapMoves=new int[10][1024][4]。 public static final int[][] FileNonCapMax=new int[10][1024]。 public static final int[][] FileCannonCapMax=new int[10][1024]。 public static final int[][] RankRookCapMax=new int[9][512]。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 14 車、炮吃子著法與它們的不吃子著法規(guī)則不同,因此需要分開(kāi)保存。第二個(gè)坐標(biāo)的含義,以橫線走法示例如下: 例如,第二條橫線上的棋子如下(有棋子的用 1 表示,炮或車的位置用 x 表示,實(shí)際上 x 也是 1): 001100x01 那么, RankNonCapMoves[2][101][0]=1 RankNonCapMoves[2][101][1]=1 RankNonCapMoves[2][101][2]=2 RankNonCapMoves[2][101][3]=0 上面的下標(biāo) 101 就是 001100101 對(duì)應(yīng)的二進(jìn)制值,數(shù)組元素的值 2 表示可行走格子的增量。 “照將 ”著法 public static final BitBoard[] CheckLegs=new BitBoard[18]。 //炮縱線照將 public static final BitBoard[][] RankRookCheck=new BitBoard[18][512]。 KnightPinCheck 是馬 “照將 ”的著法, CheckLegs 是馬 “照將 ”蹩馬腿的位棋盤。 j 1024。 k = 9。 Index ++。 k = 0。 Index ++。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 16 FileRookCapMax[i][j] = i。 (1 k))!=0) { FileRookCapMoves[i][j][Index] = k。 } } FileRookCapMin[i][j] = i。 (1 k))!=0) { FileRookCapMoves[i][j][Index] = k。 } } FileRookCapMoves[i][j][Index] = 1。 k = 9。 } } for (。 Index ++。 for (k = i 1。 break。 (1 k))!=0) { 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 17 FileCannonCapMoves[i][j][Index] = k。 } } FileCannonCapMoves[i][j][Index] = 1。 if ((Piece amp。 (Player!=0 ? 32 : 16))!=0) { return false。//棋子所在的行 if (x == File[]) {//與目標(biāo)位置在同一列,也就是進(jìn)退 BitWord = BitFiles[x]。 } } else {// ,退 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 18 if ((Attack amp。//行位棋盤數(shù)值, 9 位二進(jìn)制數(shù) if ( ) { if ((Attack amp。 (Player!=0 ? 16 : 32))!=0) { return == [x][BitWord] + y。 BitFiles[9]和 BitRanks[10]分別保存的是位棋盤中 9 列(每列共 10 位)和 10 行(每行共 9 位)的二進(jìn)制值。 public MoveStruct(){ src = dst = cap = 1。 chk=false。a39。 dst = (char) ([(2) 39。)。//仕士 GenBishopMoves(Position, HistTab)。//炮 GenPawnMoves(Position, HistTab)。 If(走子方不是處于被 “將 ”狀態(tài) ) saveToMoveList。下面我以卒的算法為例,介紹如何實(shí)現(xiàn)棋子 按行棋 規(guī)則行走 。在移動(dòng)的同時(shí),還要將當(dāng)前棋子的位置記錄下來(lái),以便悔棋。amp。 ((()))。 } else if (() 284 amp。 (() ()) = 112){ 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 21 (()+57,(),55,55)。amp。同 時(shí)要 定義 一個(gè)循環(huán), 用于查找所有棋子所在的位置。 for (int j=0。 playQ[j].getX() () = 27 amp。 playQ[j].isVisible()){ //自己是起點(diǎn)被吃的是終點(diǎn) (以 從上到下 為例 ) for (int k=()+57。 playQ[j].getY() ()){ //計(jì)算起點(diǎn)和終點(diǎn)的棋子個(gè)數(shù) Count++。 Chess =
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1