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

正文內(nèi)容

基于ios平臺(tái)的游戲“五子棋”畢業(yè)論文-資料下載頁(yè)

2025-06-26 21:03本頁(yè)面
  

【正文】 說(shuō)GoBangViewController中無(wú)法判斷游戲勝利。這個(gè)時(shí)候就需要使用到了委托。在前文中我們提到更新積分榜的時(shí)候要用到委托,這里我定義了一個(gè)委托協(xié)議類UIMyDelegate,在GoBangViewController中實(shí)現(xiàn)這個(gè)委托協(xié)議,并且把這個(gè)類設(shè)為棋盤(pán)類的一個(gè)委托。實(shí)現(xiàn)委托協(xié)議就是要在該類中實(shí)現(xiàn)委托協(xié)議中聲明的方法: (void)gameSucess:(char)flag type:(int)gameType。在這里,傳入的flag是指是游戲勝利的一方是黑子還是白字,gameType代表游戲的模式是人機(jī)對(duì)戰(zhàn)和人人對(duì)戰(zhàn)。然后根據(jù)傳入的這兩個(gè)信息更新積分榜以及數(shù)據(jù)庫(kù)上的信息。那么這個(gè)委托方法是什么時(shí)候調(diào)用的?當(dāng)棋盤(pán)類中判斷游戲勝負(fù)的方法判斷出了勝負(fù),然后就可以調(diào)用它的委托對(duì)象GoBangViewController的委托函數(shù)了。我在視圖中有“悔棋”,“新局”,“認(rèn)輸”三個(gè)按鈕,我把它添加到了棋盤(pán)視圖的下方。這三個(gè)視圖都是UIButton類,在GoBangViewController的ViewDidLoad:方法中直接使用addSubView:方法就可以把它以子視圖的形式顯示在屏幕上。在按鈕事件的實(shí)現(xiàn)中,由于棋盤(pán)類是GoBangViewController的一個(gè)全局變量,所以我可以直接調(diào)用了棋盤(pán)類中的一些方法來(lái)實(shí)現(xiàn)。 棋盤(pán)類的設(shè)計(jì)在棋盤(pán)類中有若干的全局變量,下面對(duì)它們進(jìn)行介紹:char chessMap[ROW_COUNT][COLUMN_COUNT]:這個(gè)數(shù)組代表的是棋盤(pán)的表示,棋子是char型的,‘1’代表黑子,‘2’代表白子,‘0’代表沒(méi)有下子。char chessTurn:代表的是現(xiàn)在輪到哪一方進(jìn)行下子。CHESS_STATUS status:代表游戲的狀態(tài),一種是游戲結(jié)束,一種是游戲開(kāi)始。int whiteHistoX[maxChessCount]:用于記錄白子下子的點(diǎn)的行坐標(biāo),用于悔棋。int whiteHistoY[maxChessCount]:用于記錄白子下子的點(diǎn)的列坐標(biāo)。int blackHistoX[maxChessCount]:用于記錄黑子下子的點(diǎn)的行坐標(biāo)。int blackHistoY[maxChessCount]:用于記錄黑子下子的點(diǎn)的列坐標(biāo)。int chessCount:代表下子的步數(shù)。int difficultTag:代表人機(jī)對(duì)戰(zhàn)機(jī)器人的難度,0代表簡(jiǎn)單,1代表較難。int firstTag。:代表先后手,0代表我先手,1代表我后手。int chessType:代表游戲類型,0代表人機(jī)對(duì)戰(zhàn),1代表人人對(duì)戰(zhàn)。id UIMyDelegatedelegate:UILabel *statusLabel:顯示游戲狀態(tài)的label。棋盤(pán)類繼承自UIView,視圖內(nèi)容就是一個(gè)五子棋的棋盤(pán),在UIView中有一個(gè)drawRect方法可以繪制視圖,棋盤(pán)的繪制就是在這個(gè)方法中進(jìn)行的。在繪制棋盤(pán)中,并不是使用添加子視圖這些來(lái)實(shí)現(xiàn),而是使用Quartz2D調(diào)用創(chuàng)建和顯示元素。在繪圖過(guò)程中,首先需要?jiǎng)?chuàng)建一個(gè)圖形上下文,然后在圖形上下文中畫(huà)出棋盤(pán)上橫豎方向的每一條線。另外,在棋盤(pán)上還有一個(gè)狀態(tài)提示欄,用來(lái)提示游戲狀態(tài),我使用的是UILabel類,并且使用addSubView:方法添加到棋盤(pán)視圖上。這樣,棋盤(pán)就算畫(huà)完了。前面介紹了棋盤(pán)的繪制,當(dāng)玩家點(diǎn)擊屏幕后需要將玩家的棋子顯示在棋盤(pán)上。點(diǎn)擊屏幕后,可以觸發(fā)一個(gè)事件,在這個(gè)事件中,我們先判斷用戶點(diǎn)擊的坐標(biāo),判斷它點(diǎn)擊的地方是否超過(guò)棋盤(pán)的范圍,然后通過(guò)這個(gè)坐標(biāo)來(lái)計(jì)算出它是在第幾行第幾列下子,這樣就能將棋盤(pán)數(shù)組對(duì)應(yīng)位置的值置成玩家的棋子。比如現(xiàn)在是白子下棋,在坐標(biāo)(x,y)地方點(diǎn)擊了棋盤(pán),而經(jīng)過(guò)計(jì)算這個(gè)點(diǎn)是在第一行第一列,那么我們要把chessMap[0][0]的值置成‘2’。同時(shí),需要在棋盤(pán)視圖上顯示相應(yīng)的棋子。在這里,我將棋子單獨(dú)寫(xiě)成了一個(gè)棋子類,我們創(chuàng)建一個(gè)棋子類的對(duì)象,并將它用添加子視圖的方式來(lái)顯示棋子。然后,我們需要調(diào)用判斷游戲結(jié)束的函數(shù)來(lái)判斷是否有五子相連的棋型產(chǎn)生。假如沒(méi)有產(chǎn)生我們就需要調(diào)用機(jī)器人下子的函數(shù)來(lái)使機(jī)器人下子。并且將chessTurn置為機(jī)器人的顏色,將下子點(diǎn)的坐標(biāo)記錄下來(lái)以備后面悔棋使用。機(jī)器人下子的函數(shù)和玩家下子類似,但它得到下子的位置是通過(guò)前面介紹的AI算法來(lái)得到的。在人機(jī)對(duì)戰(zhàn)中,有兩種不同的難度。AI算法的alphabeta搜索中可以設(shè)定搜索的廣度和深度,當(dāng)廣度和深度較大的時(shí)候,機(jī)器人就會(huì)更加聰明,游戲的難度就會(huì)增加。但是我們?cè)谠O(shè)定這兩個(gè)值的時(shí)候,必須要考慮設(shè)備的計(jì)算能力。平板與PC不同,沒(méi)有那么強(qiáng)大的CPU,所以深度和廣度都不能太大。在這里,我在普通級(jí)別中將搜索深度設(shè)置為2,搜索廣度設(shè)置為3,而在較難級(jí)別中,搜索的深度沒(méi)有變化,搜索的廣度變?yōu)榱?。在這樣的設(shè)定條件下,程序還不會(huì)變的非常卡,并且仍然具有智能性,所以是可行的。當(dāng)游戲是在人機(jī)對(duì)戰(zhàn)模式的時(shí)候,我們需要記錄下黑子和白子下棋的歷史記錄用于后面的悔棋,這里使用到了whiteHistoX,whiteHistoY,blackHistoX,blackHistoY四個(gè)數(shù)組。另外,我們還有一個(gè)記錄下子步數(shù)的變量chessCount,當(dāng)白方落子的時(shí)候就將chessCount加一,黑子(機(jī)器人)下子時(shí)不加,因?yàn)閏hessCount是記錄雙方各自下子的步數(shù),黑子的步數(shù)與白子的步數(shù)保持同步。此時(shí),利用chessCount來(lái)對(duì)四個(gè)數(shù)組相應(yīng)位置置成相應(yīng)的值。比如,玩家在(1,2)的地方落子,然后機(jī)器人在(3,4)的地方落子,那么在玩家點(diǎn)擊的那個(gè)地方將chessCount加一(假設(shè)變?yōu)榱?),那么我們就要將whiteHistoX[1]置成1,將whiteHistoY[1]置成2,將blackHistoX[1]置成3,將blackHistoY[1]置成4。這些都是為后面的悔棋功能做準(zhǔn)備。在棋盤(pán)上添加棋子有兩種不同的方法,一種是直接使用繪圖的功能直接在棋盤(pán)上畫(huà)出棋子,而我采用的是另外一種方法:使用添加子視圖的方法。在這里我定義了一個(gè)單獨(dú)的視圖類ChessMan,我們?cè)谒膁rawRect:方法中畫(huà)出棋子,畫(huà)棋子的方法與畫(huà)棋盤(pán)類似。當(dāng)我們需要添加棋子的時(shí)候,就要定義一個(gè)棋子類,并且傳入相應(yīng)的參數(shù)(坐標(biāo)點(diǎn)以及棋子的顏色)。然后使用addSubView:的方法將棋子添加到棋盤(pán)中。在點(diǎn)擊事件下子和機(jī)器人下子函數(shù)中每一次下子后都需要調(diào)用判斷游戲勝負(fù)的方法judgeSuccess: withRow: withColumn:。調(diào)用這個(gè)方法的時(shí)候,傳入剛剛下子的棋子顏色(flag),行坐標(biāo)(row),列坐標(biāo)(column)。然后判斷有沒(méi)有五子相連的情況。當(dāng)有五子相連的時(shí)候,需要調(diào)用sendSuccess:方法,在sendSuccess:方法中,調(diào)用棋盤(pán)類委托對(duì)象的委托方法(前面已經(jīng)提及)。最后判斷勝負(fù)功能的函數(shù)返回一個(gè)flag(假如沒(méi)有出現(xiàn)勝利的情況,返回0),當(dāng)調(diào)用判斷勝負(fù)的方法得到這個(gè)flag的時(shí)候,將它與傳入的參數(shù)flag進(jìn)行比較,假如相同,就說(shuō)明該顏色的棋子贏得了這局棋的勝利。這個(gè)時(shí)候,使用控件進(jìn)行提示。在這里我使用的是UIAlertView控件,同時(shí),由于已經(jīng)得到了勝負(fù),需要改變狀態(tài)欄statusLabel的內(nèi)容為“游戲結(jié)束”。當(dāng)玩家點(diǎn)擊“新局”按鈕之后,游戲需要進(jìn)入從頭開(kāi)始的狀態(tài)。此時(shí),需要將前面提到過(guò)的那些全局變量全部進(jìn)行初始化,然后將上一局游戲中的棋子全部移出視圖,然后就要調(diào)用其它方法來(lái)讓玩家進(jìn)行一系列的游戲選擇(游戲類型等),這些選擇是通過(guò)點(diǎn)擊UIActionSheet控件上來(lái)實(shí)現(xiàn)功能的。比如,當(dāng)我們需要選擇游戲類型的時(shí)候,我們定義并且顯示一個(gè)UIActionSheet對(duì)象,在這個(gè)對(duì)象上有兩個(gè)按鈕(顯示人機(jī)對(duì)戰(zhàn)和人人對(duì)戰(zhàn))。當(dāng)我們點(diǎn)擊控件上面的按鈕的時(shí)候,程序就會(huì)調(diào)用控件對(duì)象的委托方法,在這個(gè)委托方法中,可以傳入點(diǎn)擊了哪個(gè)按鈕的標(biāo)志,然后我們根據(jù)點(diǎn)擊了不同的按鈕來(lái)做不同的處理。 認(rèn)輸功能也是棋類游戲中比較常見(jiàn)的一個(gè)功能,實(shí)現(xiàn)認(rèn)輸功能還是比較簡(jiǎn)單的。假如是人機(jī)對(duì)戰(zhàn)模式,認(rèn)輸功能只能是玩家認(rèn)輸,此時(shí)我們彈出一個(gè)UIActionSheet對(duì)象讓玩家確認(rèn)認(rèn)輸。而假如是人人對(duì)戰(zhàn)模式,認(rèn)輸功能可以是黑方認(rèn)輸或者是白方認(rèn)輸,所以此時(shí)彈出的UIActionSheet對(duì)象就需要提供兩個(gè)按鈕來(lái)讓玩家選擇是哪一方認(rèn)輸。點(diǎn)擊UIActionSheet上的按鈕觸發(fā)的委托方法的實(shí)現(xiàn)類似于前面判斷游戲結(jié)束功能。此時(shí),我們彈出一個(gè)控件提示是哪一方勝利,調(diào)用可以更新積分榜視圖的委托方法來(lái)更新視圖,將status變量和顯示游戲狀態(tài)的label設(shè)為游戲結(jié)束。在人機(jī)對(duì)戰(zhàn)模式中,我設(shè)置了玩家悔棋的功能(前提是還沒(méi)有分出勝負(fù)),而在人人對(duì)戰(zhàn)中,我取消了這個(gè)功能。實(shí)現(xiàn)悔棋功能的關(guān)鍵是利用之前記錄黑白子下棋坐標(biāo)的那四個(gè)數(shù)組以及記錄下子步數(shù)的變量chessCount。當(dāng)我們點(diǎn)擊了悔棋按鈕的時(shí)候,我們先判斷chessCount的大?。ㄒ婚_(kāi)始將它初始化為1),所以只有當(dāng)它大于等于0的時(shí)候說(shuō)明有白方落子。所以,當(dāng)chessCount和1相等的時(shí)候,彈出一個(gè)控件提示玩家已經(jīng)是最新的棋局了,無(wú)法悔棋。而當(dāng)chessCount與1不等的時(shí)候,我們依據(jù)chessCount從記錄黑白下棋歷史的數(shù)組中取出相應(yīng)的行列坐標(biāo),根據(jù)這些行列坐標(biāo)將記錄整個(gè)棋盤(pán)的數(shù)組chessMap中相應(yīng)位置的值置空,并且通過(guò)坐標(biāo)找出相應(yīng)的添加在棋盤(pán)上的棋子對(duì)象(棋子對(duì)象有記錄x,y坐標(biāo)的屬性),并將這些棋子從棋盤(pán)視圖中移除。而當(dāng)我們這樣做的時(shí)候,其實(shí)下子的步數(shù)已經(jīng)比之前減少了,所以我們需要將chessCount的值減一?;谄骞δ苤荒茉谟螒蜻M(jìn)行中,所以當(dāng)游戲結(jié)束狀態(tài)中點(diǎn)擊悔棋按鈕的時(shí)候需要彈出控件提示游戲結(jié)束無(wú)法悔棋。前面介紹了軟件主要功能,也可以看做是人機(jī)對(duì)戰(zhàn)功能的實(shí)現(xiàn)。而在這里,人人對(duì)戰(zhàn)的功能還是稍顯簡(jiǎn)單,沒(méi)有加入網(wǎng)絡(luò)通信那部分。人人對(duì)戰(zhàn)的實(shí)現(xiàn)與人機(jī)對(duì)戰(zhàn)類似,最主要的區(qū)別在于,當(dāng)人機(jī)對(duì)戰(zhàn)模式中玩家點(diǎn)擊屏幕之后,除了顯示點(diǎn)擊的棋子之外,就要馬上調(diào)用AI算法求出機(jī)器人的下子點(diǎn)。而在人人對(duì)戰(zhàn)模式中,任何一方觸發(fā)點(diǎn)擊事件后就不需要調(diào)用機(jī)器人下子模塊了,而是等待另一方點(diǎn)擊屏幕下子。6 開(kāi)發(fā)過(guò)程中遇到的問(wèn)題 五子棋AI算法設(shè)計(jì)問(wèn)題AI算法設(shè)計(jì)是該軟件最難設(shè)計(jì)的一塊,在這一塊也會(huì)出現(xiàn)各種問(wèn)題,下面簡(jiǎn)單介紹一些遇到的主要問(wèn)題以及解決方法。1,在搜索算法中,按照之前搜索樹(shù)的結(jié)構(gòu),第一層其實(shí)是需要求第二層的最大值,但是這個(gè)值是不需要轉(zhuǎn)換的。而我在開(kāi)始設(shè)計(jì)的時(shí)候,按照第三層傳到第二層類似,我仍然將第二層得到的最大值進(jìn)行了轉(zhuǎn)換。這樣子的話最終得到的估值是一個(gè)負(fù)數(shù)。解決方法:按照搜索的層次,將第二層到第一層傳遞數(shù)值與其它層次之間分開(kāi),因?yàn)樗恍枰M(jìn)行轉(zhuǎn)換。代碼如下: if (search_depth == 1) { score = alphaBetaSearch( search_depth + 1 , alpha , beta , (player == MYSELF) ? MYSELF : RIVAL ) 。 } else{ score = alphaBetaSearch( search_depth + 1 , beta , alpha , (player == MYSELF) ? RIVAL : MYSELF ) 。 }2,alphabeta算法中alpha和beta值的問(wèn)題,同樣的道理,由于下一層傳遞上來(lái)的值與該層的值是相反的,在遞歸的時(shí)候,假如alpha和beta還是該層的alpha值和beta值,就會(huì)出現(xiàn)問(wèn)題。在該層中,alpha是極小值,beta是極大值,但是在遞歸的時(shí)候,它所傳遞的alpha是之前beta的負(fù)數(shù),它所傳遞的beta是之前alpha的負(fù)數(shù)。和上一個(gè)問(wèn)題類似的是,在第一層中遞歸的時(shí)候,alpha和beta的值是不變的。 棋盤(pán)類設(shè)計(jì)遇到的問(wèn)題1,由于在算法設(shè)計(jì)方面使用的C++語(yǔ)言,但是在設(shè)計(jì)棋盤(pán)時(shí)用到的是objectc語(yǔ)言,在棋盤(pán)類中需要調(diào)用算法那一塊,這是傳統(tǒng)的objectc語(yǔ)言做不到的,這樣可以實(shí)現(xiàn)objectc和C++的混編來(lái)解決問(wèn)題。2,在棋盤(pán)類中,需要用到多個(gè)UIActionSheet類的對(duì)象來(lái)實(shí)現(xiàn),在點(diǎn)擊了UIActionSheet控件上的按鈕時(shí),我們需要定義委托方法。但是多個(gè)控件對(duì)應(yīng)一個(gè)委托方法,在調(diào)用委托方法的時(shí)候,不能識(shí)別是哪一個(gè)控件調(diào)用的。解決的辦法是使用actionsheet的tag屬性來(lái)解決問(wèn)題,在委托方法中,使用tag來(lái)識(shí)別是哪一個(gè)控件調(diào)用了該委托方法并且做出不同的處理。3,棋盤(pán)類判斷勝負(fù)是檢查有沒(méi)有連續(xù)五個(gè)相同顏色的棋子相連,在判斷勝負(fù)的函數(shù)中,假如是掃描全部整個(gè)棋盤(pán)來(lái)判斷需要耗費(fèi)大量的時(shí)間。而更加簡(jiǎn)單的方法是在這個(gè)函數(shù)中傳遞進(jìn)剛剛下子的一點(diǎn),然后以該點(diǎn)為中心點(diǎn),掃描它周圍各個(gè)方向的棋子,把每個(gè)方向上和它顏色相同的記錄下來(lái),遇到不同顏色的棋子或還沒(méi)有下子的點(diǎn)后在該方向上就可以停止掃描,最后通過(guò)判斷連續(xù)的個(gè)數(shù)來(lái)得到勝負(fù)。4,積分榜積分是采用NSuserdefault這個(gè)類來(lái)實(shí)現(xiàn)的,它是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)。游戲過(guò)程中,當(dāng)游戲結(jié)束后,積分榜可以更新相應(yīng)的數(shù)據(jù)。但是當(dāng)我關(guān)閉程序下次打開(kāi)的時(shí)候,發(fā)現(xiàn)積分榜的數(shù)據(jù)仍然是原來(lái)沒(méi)有更新過(guò)的數(shù)據(jù),這說(shuō)明數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中存在問(wèn)題。后來(lái)發(fā)現(xiàn)的問(wèn)題是UserDefaults不是立即寫(xiě)入,而是根據(jù)時(shí)間戳定時(shí)的把緩存中的數(shù)據(jù)寫(xiě)入本地磁盤(pán)。所以調(diào)用了set方法之后數(shù)據(jù)有可能還沒(méi)有寫(xiě)入磁盤(pán)應(yīng)用程序就終止了。出現(xiàn)以上問(wèn)題??梢酝ㄟ^(guò)調(diào)用synchornize方法強(qiáng)制寫(xiě)入。7 測(cè)試測(cè)試是軟件設(shè)計(jì)中一個(gè)非常重要的模塊,只有經(jīng)過(guò)了測(cè)試,才能確保軟件功能都能正確的實(shí)現(xiàn)。下面主要介紹程序功能都完成之后的測(cè)試,在軟件開(kāi)發(fā)過(guò)程中,我使用開(kāi)發(fā)工具自帶的iOS模擬器進(jìn)行測(cè)試,最后將軟件移植到真機(jī)上進(jìn)行測(cè)試。1,當(dāng)程序打開(kāi)時(shí),界面會(huì)顯示棋盤(pán),各個(gè)按鈕以及積分榜這樣一個(gè)視圖,如下圖:2,點(diǎn)擊新局按鈕時(shí),界面上會(huì)彈出一個(gè)控件讓玩家來(lái)選擇對(duì)戰(zhàn)的模式,如下圖:
點(diǎn)擊復(fù)制文檔內(nèi)容
電大資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1