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

正文內(nèi)容

手機(jī)五子棋游戲設(shè)計(jì)畢業(yè)論文-資料下載頁(yè)

2025-07-27 10:49本頁(yè)面
  

【正文】 size 0) { return。 } for (int i = 0。 i size。 i++) { drawPoint(canvas, ().get(i), BLACK)。 } drawPoint(canvas, ().get(size), NEW_BLACK)。 } private void drawPlayer2Point(Canvas canvas) { // TODO Autogenerated method stub if (player2 == null) { return。 } int size = ().size() 1。 if (size 0) { return。 } for (int i = 0。 i size。 i++) { drawPoint(canvas, ().get(i), WHITE)。 } // 最后下的一個(gè)點(diǎn)標(biāo)成黃色 drawPoint(canvas, ().get(size), NEW_WHITE)。 } public void fillPointArrays(int color, Drawable drawable) { Bitmap bitmap = (pointSize, pointSize, )。 Canvas canvas = new Canvas(bitmap)。 (0, 0, pointSize, pointSize)。 (canvas)。 pointArray[color] = bitmap。 } public void onDraw(Canvas canvas) { (canvas)。 (canvas, board, 0, 80)。// 加載棋盤(pán)圖片 (canvas, blackchess, 100, 2)。 // 加載白色棋缽圖片 (canvas, whitechess, 320, 2)。 // 加載黑色棋缽圖片 drawChssboardLines(canvas)。 // 畫(huà)棋盤(pán)上面的線條 drawPlayer1Point(canvas)。 // 畫(huà)玩家1所下的棋子 drawPlayer2Point(canvas)。 // 畫(huà)玩家2所下的棋子 if (hasStart()) { if (isPlayer2Run()) { ()。 (canvas, hide1, 100, 2)。 } else { ()。 (canvas, hide2,320, 2)。 } } } private static void drawImage(Canvas canvas, Bitmap bitmap, int x, int y) { // TODO Autogenerated method stub (bitmap, x, y, null)。 } // 初始化空白點(diǎn)集合 private void createPoints() { ()。 for (int i = 0。 i maxX。 i++) { for (int j = 0。 j maxY。 j++) { (new Point(i, j))。 } } } public ListPoint getFreePoints() { return allFreePoints。 } public void setTextView(TextView textView) { // TODO Autogenerated method stub =textView。 } public void undo(ChessBoard cBoard){ Point point1 =().get(().size() 1)。 ().remove(point1)。 (point1)。 Point point2 =().get(().size() 1)。 ().remove(point2)。 (point2)。 ()。 refressCanvas()。 } public void undo1(ChessBoard cBoard){ refressCanvas()。 }} 玩家類本次設(shè)計(jì)中共有三個(gè)玩家類,BasePlayer類,HumanPlayer類,PhonePlayer類。HumanPlayer類,PhoneAi類都是繼承BasePlayer類的,而PhonePlayer類是繼承PhoneAi類的,可以說(shuō)PhonePlayer類是PhoneAi類的一個(gè)實(shí)例。下面將主要介紹一下BasePlayer類。該類做的工作主要是初始化棋盤(pán)和判斷玩家是否贏了。如何才能判斷玩家是否贏了呢?本次設(shè)計(jì)所采取的方法是:如果每個(gè)玩家所下的棋子還不足5個(gè),則不予判斷。否則,遍歷玩家的每一個(gè)棋子,分別從橫、豎、正斜、反斜四個(gè)方向進(jìn)行分析。如果在其中的某一個(gè)方向上一連有5個(gè)都是玩家的棋子則判玩家贏了。獲取玩家剛剛落下的棋子的位置,并以該點(diǎn)為中心橫向上已有我方的五子連成一線縱向上已有我方的五子連成一線正斜上已有我方的五子連成一線反斜上已有我方的五子連成一線NNNNYYYY玩家贏了玩家還沒(méi)贏圖8 判斷玩家是否贏了的流程圖BasePlayer類的主要代碼為:public abstract class BasePlayer implements Player { protected ListPoint myPoints = new ArrayListPoint()。// 我已下的棋子 protected ChessBoard chessboard。 // 棋盤(pán) protected ListPoint allFreePoints。 // 所有空白棋子 //獲取己方棋子 public final ListPoint getMyPoints() { return myPoints。 } //初始化棋盤(pán) public void setChessboard(ChessBoard chessboard) { = chessboard。 allFreePoints = ()。 ()。 } private final Point temp = new Point(0, 0)。 // 我是否是否贏了 public final boolean hasWin() { //我方棋子總數(shù)小于5,不可能贏 if (() 5) { return false。 } Point point = (() 1)。 int count = 1。 int x = (), y = ()。 // 橫向 (x).setY(y)。 //從當(dāng)前位置著手判斷,如果橫向緊鄰當(dāng)前位置也是我方棋子,且該位置還在棋盤(pán)內(nèi), //截止到此位置我方的相鄰的棋子數(shù)還小于5,則count加1,temp指向與當(dāng)前位置相鄰的我方棋子 while (((() 1)) amp。amp。 () = 0 amp。amp。 count 5) { count++。 } //如果相鄰緊挨的我方棋子數(shù)目大于等于5,則我贏了 if (count = 5) { return true。 } (x).setY(y)。 while (((() + 1)) amp。amp。 () 15 amp。amp。 count 5) { count++。 } if (count = 5) { return true。 } // 縱向,判斷方法與橫向相似,count的值重置 count = 1。 (x).setY(y)。 while (((() 1)) amp。amp。 () = 0) { count++。 } if (count = 5) { return true。 } (x).setY(y)。 while (((() + 1)) amp。amp。 () 15 amp。amp。 count 5) { count++。 } if (count = 5) { return true。 } // 正斜向 ,判斷方法同上 count = 1。 (x).setY(y)。 while (((() 1).setY( () + 1)) amp。amp。 () = 0 amp。amp。 () 15) { count++。 } if (count = 5) { return true。 } (x).setY(y)。 while (((() + 1).setY( () 1)) amp。amp。 () 15 amp。amp。 () = 0 amp。amp。 count 6) { count++。 } if (count = 5) { return true。 } // 反斜 ,判斷方法同上 count = 1。 (x).setY(y)。 while (((() 1).setY( () 1)) amp。amp。 () = 0 amp。amp。 () = 0) { count++。 } if (count = 5) { return true。 } (x).setY(y)。 while (((() + 1).setY( () + 1)) amp。amp。 () 15 amp。amp。 () 15 amp。amp。 count 5) { count++。 } if (count = 5) { return true。 } return false。 }5 人機(jī)智能算法分析 知識(shí)準(zhǔn)備 極大極小樹(shù)目前絕大部分的博弈類游戲中的人工算法都采用這種方法。假設(shè)己方為MAX點(diǎn),對(duì)方則為MIN點(diǎn)。如果當(dāng)層的節(jié)點(diǎn)為奇數(shù)時(shí)那么就為MAX層,同樣為偶數(shù)時(shí)就為MIN層。當(dāng)在MAX層時(shí),該層的值就應(yīng)該為下一個(gè)MIN層中的最大一個(gè)的值。當(dāng)在MIN層是,該層的值就應(yīng)該為它子層MAX的最小的一個(gè)。通俗的說(shuō)就是當(dāng)輪到我方時(shí),我們就應(yīng)該選擇一個(gè)最有利于我們的點(diǎn),預(yù)測(cè)對(duì)方可能下的最有利他方的點(diǎn)(相對(duì)我方來(lái)說(shuō)就是最壞的點(diǎn))。這樣反復(fù)計(jì)算下去就能夠得到根節(jié)點(diǎn)的最大值,這個(gè)點(diǎn)也就是我們最佳下棋點(diǎn)。在計(jì)算這個(gè)點(diǎn)時(shí)可以很明顯的看出這是一個(gè)不斷遞歸的過(guò)程,到達(dá)葉子節(jié)點(diǎn)時(shí)根據(jù)相關(guān)的計(jì)算規(guī)則算出該值然后向上一層不斷的返回。下圖中矩形代表極大層,橢圓代表極小層。601056010402051560圖9 極大極小樹(shù) 深度優(yōu)先搜索在圖論中有兩個(gè)很重要的遍歷的方法,一個(gè)是深度優(yōu)先搜索(DFS),另外一個(gè)是廣度優(yōu)先搜索(BFS).這兩個(gè)方法的主要區(qū)別在于下一個(gè)節(jié)點(diǎn)的選擇。DFS首先選擇它的連接節(jié)點(diǎn),若它的下個(gè)節(jié)點(diǎn)已經(jīng)全部被遍歷過(guò)或者不存在的話。則向上返回到上一個(gè)節(jié)點(diǎn),在遍其他的未被訪問(wèn)過(guò)的點(diǎn)。很容易想到這要用到堆棧結(jié)構(gòu),使用一個(gè)遞歸來(lái)實(shí)現(xiàn)。而B(niǎo)FS則是逐個(gè)的遍歷它的聯(lián)接接點(diǎn),將已經(jīng)訪問(wèn)過(guò)的點(diǎn)放入隊(duì)列中。然后再依次取出繼續(xù)這個(gè)過(guò)程。ABCFDE圖10 圖的遍歷 DFS遍歷過(guò)程如下:首先從A點(diǎn)出發(fā)訪問(wèn)它的領(lǐng)接點(diǎn)B,因?yàn)锽的領(lǐng)接點(diǎn)C,F(xiàn)均未被訪問(wèn)過(guò),所以B點(diǎn)選擇C(當(dāng)然也可以選擇F點(diǎn))作為下一個(gè)要訪問(wèn)的點(diǎn),C點(diǎn)的領(lǐng)接點(diǎn)是D,F(xiàn)選擇下個(gè)節(jié)點(diǎn)D,而D的鄰接點(diǎn)只有一個(gè)E且未被訪問(wèn)過(guò),就將E作為了它下個(gè)節(jié)點(diǎn)。這時(shí)因?yàn)镋已經(jīng)沒(méi)有可訪問(wèn)的鄰點(diǎn),所以向上一層返回到D,發(fā)現(xiàn)D也已經(jīng)沒(méi)有可訪問(wèn)的點(diǎn)了,繼續(xù)向上層返回到C,由于C的鄰節(jié)點(diǎn)F未被訪問(wèn)過(guò),那么就訪問(wèn)F。所以整個(gè)過(guò)程的遍歷結(jié)果為:AB224。C224。D224。E224。F。BFS的的遍歷過(guò)程為:A224。B224。E224。C224。F224。D。 剪枝方法當(dāng)預(yù)測(cè)的深度達(dá)到3的時(shí)候,最壞情況下225*225*225=11390625個(gè),這在目前的一些常規(guī)平均的機(jī)器性能下也需要40多秒的時(shí)間,這是不能夠容忍的。那么是否有很好的改進(jìn)技術(shù),去除那些不必要的節(jié)點(diǎn),并且在剪去了這些點(diǎn)后不影響結(jié)果呢?答案是肯定的,這種方法就是AlphaBeta剪枝。下面通過(guò)圖來(lái)說(shuō)明,矩形代表極大層,橢圓代表極小層。A: 40B:40C:=30D:204050E:30??F:20H:=25I:25??圖11 Alpha—Beta剪枝從上圖可以看出,由于C節(jié)點(diǎn)的值肯定不大于30而B(niǎo)節(jié)點(diǎn)的值為40大于C節(jié)點(diǎn),那么目前為止可以很肯定的說(shuō)A節(jié)點(diǎn)值一定不小于40。 所以C點(diǎn)的其他子節(jié)點(diǎn)無(wú)須去訪問(wèn)也不會(huì)對(duì)結(jié)果的值有影響。這個(gè)就是α剪枝。在I節(jié)點(diǎn)的值確定為25后,我們就可以斷定H節(jié)點(diǎn)一定不小于25,而F點(diǎn)的值為20,那么就可以很確定的說(shuō)D的值為20。這個(gè)就是β剪枝。下面給出完整的定義:α剪枝:若任一極小值層節(jié)點(diǎn)的β值小于或等于它任一先輩極大值層節(jié)點(diǎn)的α值 ,即α(先輩層)≥β(后繼層) ,則可終止該最小值層中這個(gè) Min 節(jié)點(diǎn)的搜索過(guò)程。這個(gè) Min 節(jié)點(diǎn)最終的倒推值就確定為β值。β剪枝:若任一極小值層節(jié)點(diǎn)的α值大于或
點(diǎn)擊復(fù)制文檔內(nèi)容
物理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1