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

正文內容

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

2025-06-26 21:03本頁面
  

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