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

正文內(nèi)容

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

2024-09-16 15:28本頁(yè)面
  

【正文】 在某個(gè)位置最多有 4 種走法,例如 KingMoves[13][0]=12 表示帥在 13 格( e1 格)時(shí)可以走到 12 格(當(dāng)然,也可以走到 1 22 格,保存到其他幾個(gè)數(shù)組元素中)。為了速度(以位移運(yùn)算取代除法運(yùn)算),第 2 個(gè)坐標(biāo)值用 2 的整次方冪。)兵的走棋規(guī)則需要分顏色,紅色的垂直走棋方向和黑色的垂直走棋方向是相反的。 AdvisorMoves[90][8]保存的是士的著法。 KnightMoves 和 HorseLegs 是馬的著法和蹩馬腿的位置。 //共十條橫線 ,FileNonCapMoves[y][bitWordY][index]=newY,進(jìn) public static final int[][][] FileRookCapMoves=new int[10][1024][4]。 public static final int[][][] RankNonCapMoves=new int[9][512][12]。 public static final int[][][] RankCannonCapMoves=new int[9][512][4]。 //FileNonCapMax[y][bitwordY]=MaxY//進(jìn)退 public static final int[][] FileNonCapMin=new int[10][1024]。 public static final int[][] FileRookCapMin=new int[10][1024]。 public static final int[][] FileCannonCapMin=new int[10][1024]。//平 public static final int[][] RankNonCapMin=new int[9][512]。 public static final int[][] RankRookCapMin=new int[9][512]。 public static final int[][] RankCannonCapMin=new int[9][512]。再將著法分為水平和垂直兩種(也就是進(jìn)、退與平)。棋盤的橫線合縱線分別有 10 條和 9 條,這就是數(shù)組第一個(gè)下標(biāo) 10 和 9 的含義,用來(lái)指示車炮在哪條橫線或縱線上。 RankRookCapMoves[2][101][0]=2 RankRookCapMoves[2][101][1]=3 RankRookCapMoves[2][101][2]=0 以上是車吃子的走法。 下面是最大的位移量和最小的位移量,用來(lái)生成合法著法時(shí)初步判斷著法的合法性: 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ù)組,縱向著法的表示與此類似,在此不再贅述。 //帥將每個(gè)位置蹩馬腿的位棋盤 public static final BitBoard[][] KnightPinCheck=new BitBoard[18][256]。 //車縱線照將 public static final BitBoard[][] FileCannonCheck=new BitBoard[18][1024]。 //車橫線照將 public static final BitBoard[][] RankCannonCheck=new BitBoard[18][512]。 //兵照將 帥、將的位置共有 18 個(gè),每個(gè)位置有一個(gè)編號(hào),從 0 到 17,對(duì)應(yīng)數(shù)組的第一個(gè)下標(biāo)。 算法示例 ——車炮的偽合法著法生成 : 以下是車炮橫線 —縱移(橫線定位,縱向移動(dòng))的算法: // Generate FilePreMove for Rooks and Cannons for (i = 0。 i ++) {//10 條橫線 for (j = 0。 j ++) {//一條縱線位棋盤的二進(jìn)制值 Index = 0。 for (k = i + 1。 k ++) { if ((j amp。 } FileNonCapMoves[i][j][Index] = k。 FileNonCapMax[i][j] = k。 for (k = i 1。 k ) { if ((j amp。 } FileNonCapMoves[i][j][Index] = k。 FileNonCapMin[i][j] = k。 Index = 0。 for (k = i + 1。 k ++) { if ((j amp。 Index ++。 break。 for (k = i 1。 k ) { if ((j amp。 Index ++。 break。 Index = 0。 for (k = i + 1。 k ++) { if ((j amp。 break。 k = 9。 (1 k))!=0) { FileCannonCapMoves[i][j][Index] = k。 FileCannonCapMax[i][j] = k。 } } FileCannonCapMin[i][j] = i。 k = 0。 (1 k))!=0) { k 。 } } for (。 k ) { if ((j amp。 Index ++。 break。 } } 合法著法的生成 合法著法的生成,是在已生成的偽合法著法的基礎(chǔ)之上,增加一些判斷合法性的條件。 現(xiàn)列出生成合法著法的算法并附簡(jiǎn)要說(shuō)明如下: 偽合法著法的合法性判斷: 以炮為例,算法如下: public boolean LeagalMove(MoveStruct Move){ int Piece, Attack, x, y, BitWord; Piece = Squares[]。 (Player!=0 ? 32 : 16))==0) { return false。//被攻擊的棋子 if ((Attack amp。//有被攻擊的棋子,但不是對(duì)方的。//棋子所在的列 y = Rank[]。//該列的二進(jìn)制位棋盤數(shù)值,共十位 if ( ) {//進(jìn) if ((Attack amp。 } else {//不吃子 return = [y][BitWord] + Bottom[x]。 (Player!=0 ? 16 : 32))!=0) { return == [y][BitWord] + Bottom[x]。 } } } else {//與目標(biāo)位置的列位置不同,也就是 “平 ” BitWord = BitRanks[y]。 (Player!=0 ? 16 : 32))!=0) { return == [x][BitWord] + y。 } } else { if ((Attack amp。 } else { return = [x][BitWord] + y。 File[90]和 Rank[90]保存的是格子對(duì)應(yīng)的列和行,這比 “%、 /”(取余和除法)的運(yùn)算速度快。PreMoves 是生成偽合法的類,保存有所有偽合法著法的靜態(tài)數(shù)組。//位置 a0=0,b0=10 public boolean chk。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 19 chk = false。 dst = d。 } public MoveStruct(String moveStr){ move(moveStr)。 } public void move(String moveStr) { src = (char) ([(0) 39。] + (1) 39。)。a39。039。 if (src 0 || src = 90 || dst 0 || dst = 90) {//invalid move src = dst = 1。//帥將 GenAdvisorMoves(Position, HistTab)。//相象 GenKnightMoves(Position, HistTab)。//車 GenCannonMoves(Position, HistTab)。//兵 } GenMoves 根據(jù)當(dāng)前局面(作為參數(shù)的 final ChessPosition Position)生成合法著法,并保存在一個(gè)數(shù)組 MoveStruct moveList[MAX_MOVENUM]中,同 時(shí)也將每個(gè)著法的局面評(píng)價(jià)值存入數(shù)組 int valueList[MAX_MOVENUM]中,這樣以便對(duì)著法進(jìn)行排序,在搜索算法中提高算法的效率。 GenKnightMoves(ChessPosition Position,HistTab){ 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 20 根據(jù) Position,得出當(dāng)前局面 player 馬的偽合法著法; for(all 馬的偽合法著法 ){ if ((其中一個(gè)著法 )){ ()。 ()。 本文中,利用數(shù)組來(lái)記錄棋子的位置,并依據(jù)數(shù)組中 X, Y 坐標(biāo)的改變來(lái)改變棋子在棋盤中的位置。 在卒移動(dòng)算法中,將卒的移動(dòng)分為向前、向左 、向右 三部分。如果是向下,距離也是一步,可以通過(guò) Y 坐標(biāo)加一的方式移動(dòng)棋子,若果是向左右移動(dòng),就需要在判斷移動(dòng)距離的同事判斷是否已經(jīng)過(guò)河,如果符合規(guī)則,可以通過(guò) X 坐標(biāo)的加減來(lái)實(shí)現(xiàn)。具體算法如下: if ((()()) 27 amp。 (()()) 86 amp。 (()()) 55 amp。 (()()) 0){ ((()))。 ((()))。 ((),()+57,55,55)。amp。amp。 } else if (() 284 amp。 (() ()) = 2 amp。 (() ()) =58){ (()57,(),55,55)。 在炮吃子時(shí),需要定義一個(gè)變量,記錄起點(diǎn)和終點(diǎn)間是否有子。這樣在執(zhí)行循環(huán)的時(shí)候,就可以找出所有與自己在一條直線上的棋子,同時(shí)記錄下炮和目標(biāo)棋子中間是否有一個(gè)棋子。 public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){ int Count = 0。j32。amp。amp。amp。k()。amp。 break。amp。amp。 ((()))。 ((Man))。 ((()))。 ((i))。 //將炮的位置移動(dòng)到目標(biāo)子的位置 ((), Y(),55,55)。本文判斷勝負(fù)的算法正是基于這個(gè)思想,如果紅棋的將不可見(jiàn)了,則黑棋贏得比賽,如果黑棋的將不可見(jiàn)了,則紅棋贏得比賽, 系統(tǒng)將彈出提示對(duì)話框,并且此時(shí)將不能再走棋, 具體算法如下: if (!play[31].isVisible()){ ( this,黑棋勝利 ,玩家一勝利 , ,)。 ( 黑棋勝利 )。 chessPlayClick=3。 北京物資學(xué)院 2020屆畢業(yè)論文(設(shè)計(jì)) 23 }//else if 界面功能算法實(shí)現(xiàn) 悔棋功能的實(shí)現(xiàn) 本設(shè)計(jì)設(shè)置了悔棋按鈕,玩家可以依據(jù)自己的需要悔棋,沒(méi)有次數(shù)的 限制,悔棋按鈕是通過(guò)記錄坐標(biāo)的方式執(zhí)行悔棋的,具體算法如下: else if (().equals(repent)){ try{ //獲得 setVisible 屬性值 String S = (String)(()4)。 //獲得 Y 坐標(biāo) int y = ((String)(()2))。 //賦給棋子 play[M].setVisible(true)。 if (play[M].getName().charAt(1) == 39。){ ( 黑棋走棋
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1