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