-
1.??????? 定義一種數據結構:x,y分別表示當前場上的點所對應的橫坐標和縱坐標
注意:不用系統提供的x,y值的類型為 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
AI算法抽象為一個類:KWOmni(oppoType從用戶的角度考慮落子的位置。AI的角度考慮落子的位置。p點開始向左右或者上下遍歷在指定情況下能否形成KWOmni初始化好之后,就可以從AI的角度進行思考。startX,startY對hPoint(橫向vPoint(豎向rPoint(右下lPoint(左下num連珠的起始點。<span &font-size: 11px">checkPoint檢查該點是否為可用點:如果該點的x,y值大于等于0且小于kBoardSize,則該點在棋盤上??捎脛t尋找:初始化一個solution(假設有一個點滿足條件),從0開始遍歷,橫向尋找:horizonal(x+ii,y不變),如果x值小于棋盤寬度(判斷趨勢:是滿足num連珠的趨勢的話,count++。如果在一段長度的相同類型的點之后找到一個空點(落子點),則認為該點可能為一個solution。)如果找到了我們希望的連珠個數,則返回:如果count大于等于當前連珠個數,并且該點為可用點的話,則返回該點。否則以遞歸的方式向后一個點進行遍歷:getNextPoint(傳進來一個pp,如果pp.x+1<kBoardSize,即pp+1下一個點還在同一行的話,result.x=pp.x+1;result.y=pp.y;否則的話尋找下一行:result.x=0;result.y=pp.y+1;)縱向尋找與橫向思路一樣,只不過x不變,y+ii。右下尋找:x+ii;y+ii。左下尋找:x-ii;y+ii。
如果num=5,找到一個可用五子連珠點,表示勝利。否則繼續遍歷:看一下這個點是否可用并且判斷是否滿足stepEmergent這個條件(從pp點進行尋找之后,這個check,我們找到這個點的值,和這個點左右兩點的值,不斷進行遍歷:這個點左右兩個點分別滿足在棋盤上且滿足當前xType的話,則再次進行向左向右遍歷,知道最后左側的值減去右側的值大于等于需要尋找這個趨勢的五子連珠,并且左右點都為空的話,就返回true,即表示這個點左邊和右邊能夠滿足需要尋找的這個條件,如果這兩個條件有一個不滿足,則繼續使用循環向四個方向進行尋找。如果跳出了循環的話,要看一看是這兩個條件的哪一個跳出了循環。如果條件滿足才跳出循環的話(在連珠的兩側找到了空點),返回這個點。否則返回一個不可用的點。)
整體思路:myType(判斷AI這個點是否能形成五連珠,即進攻)-->oppoType(判斷用戶能否形成這個點,即防守)-->myType(判斷能否形成四連珠)-->oppoType(判斷用戶能否形成四連珠)-->3-->2-->sad
查看全部 -
算法實現思路
首先要對場上所有的空點進行遍歷,此處使用遞歸。如果找到需要防守的點,則在此落子
? ? ? ? 遞歸簡介:遞歸,就是在運行的過程中函數調用自己。
子問題須與原始問題為同樣的事,且更為簡單;
不能無限制地調用本身,須有個出口
?? 2.? 決策順序:首先進行防守,尋找活四,死四,活三等進行防守。然后進行進攻,形成具有威脅地棋子排布。
查看全部 -
算法原理
AI對用戶所有點進行遍歷,找出威脅點
AI對于自身所有點進行遍歷,找出最佳點
如果找到威脅點,則防守,否則進攻
認為有威脅的點為活三或活四
查看全部 -
棋子繪制原理
原理:通過API獲取手勢點擊位置
并且通過該位置信息計算出最近的棋格
API:touchesBegan(蘋果原生的專門接收當前界面手勢信息的API)
獲取點擊信息
UITouch *touch=[touches anyObject];
獲取位置
CGPoint point=[touch locationInView:self];
尋點(相鄰縣之間做對比)
for(int i=0;i<=kBoardSize+1;i++)
如果每條線將屏幕分割的區域的寬度小于點擊點的x值,并且這個區域的下一根線所對應的x值大于這個點擊點的x值,則該點在兩條線之間
如果剛好是第一根線,則該點落在第一條線上
如果i==kBoardSize,則該點在最后一條線上
否則判斷該點離左側比較近還是右側比較近(如果該點的坐標減去其左側的坐標大于右邊的那根線的x值減去其點擊點的x值的話,離右邊的線比較近,否則的話,離左邊的線比較近)
使用UIImageView表達落子的位置
初始化piece(棋子)之后,piece.center的x,y坐標加一(棋盤上的物理坐標從一開始)
查看全部 -
開發環境
Mac OS X Yosemite
Xcode 7.3
Objective-C
界面繪制
如何棋盤繪制
? ?? 原理:縱向和橫向繪制多條相同樣式的橫線
? ?? 優點:不必使用外部資源,盡量減少工程對外部資源的依賴,從而減 ? ? ?? 少文件包的大小
定義一個專門用于處理所有界面展示和用戶交互的View
名字:GobangView
在initWithFrame對其初始化的時候,利用for循環添加要繪制的橫豎線
定義一個常量,棋盤橫豎各有多少個可落子的點
const NSInteger kBoardSize=19;
繪制棋盤的時候考慮棋盤的邊緣
for(int i=0;i<kBoardSize+2;i++)
定制橫豎線的顏色
horizentalLine.backgroundColor=[UIColor blackColor];
使用GobangView
方法:將其引入到ViewController.m當中
自定義背景顏色,GobangView在alloc之后用initWithFrame進行初始化,并定義其背景顏色
將其add到view上,當然這個view的frame的大小是由view的寬度定義的,從而使其充滿整個屏幕
如何添加資源并展示棋子
方法:使用Xcode提供的Image Set,使用2x圖進行資源的賦值
1.New Image Set命名為black(黑色的棋子對應的資源)
2.New Image Ser命名為white(白色的棋子對應的資源)
3.將黑白棋子分別加入2x圖中
查看全部 -
iOS 五子棋查看全部
-
看到3-3五子棋大戰查看全部
-
操作系統,查看全部
-
繪制五子棋棋盤查看全部
-
哈哈鏡查看全部
-
ffuhbvxfj chvdg查看全部
-
空點難道不是從三個角度考慮嗎? 1. 四個角落; 2. 四條邊緣線; 3. 其余線上不是應該考慮8個延伸方向 難道不是射線,而是直線的角度 在后邊的解說上驗證了這一說法查看全部
-
1. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event; 2. fabs 取絕對值。查看全部
-
good查看全部
-
算法原理查看全部
-
算法原理查看全部
-
歐尼已i查看全部
-
筆記啊查看全部
-
看看查看全部
-
太難了查看全部
-
草泥馬查看全部
-
這個東西怎么學習呢查看全部
-
不錯查看全部
-
嗯嗯查看全部
-
筆記筆記查看全部
舉報