iOS开源:五子棋-大华五子棋(已上架)
GonzaloTill
8年前
<p>一.项目介绍</p> <p>1.地址:</p> <ul> <li> <p>iTunes下载 : <a href="/misc/goto?guid=4959747347446033868" rel="nofollow,noindex"> 大华五子棋 </a></p> </li> <li> <p>github地址: <a href="/misc/goto?guid=4959747347551463855" rel="nofollow,noindex">GobangProject</a></p> </li> <li> <p><a href="/misc/goto?guid=4959747347629089965" rel="nofollow,noindex">CocoaChina代码库地址</a></p> </li> <li> <p>优酷操作视频: <a href="http://v.youku.com/v_show/id_XMjY1OTk5MzMzMg==.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0" rel="nofollow,noindex"> 如何操作 </a></p> </li> </ul> <p>2.效果图:</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/99e96c2b7f108e43e9ba150b7d835981.gif"></p> <p>近场五子棋对战.gif</p> <p>3.简介:</p> <p>该项目主要用到 <a href="/misc/goto?guid=4959747347825653547" rel="nofollow,noindex"> MutipeerConnectivity </a> 框架,用 蓝牙 或者 局域网 二人近场五子棋对战。</p> <h3>二.思路介绍</h3> <p>大概说下思路,具体看代码实现。</p> <p>1.画棋盘及落点</p> <p>这个可以去慕课网看看这个视频: <a href="/misc/goto?guid=4959747347909968875" rel="nofollow,noindex"> 五子棋 </a> ,里面有详细的讲解,我对里面的进行了部分优化。比如怎么判断两点之间到底触摸的哪个点。</p> <p>2.悔棋,重来</p> <p>每个点都是一个对象,让后把对象放数组里面,进行删去,或者重置。</p> <p>3.人机模式</p> <p style="text-align:center"><img src="https://simg.open-open.com/show/c394af9352b0db978a13f3a31c4b0752.png"></p> <p>AI简介.png</p> <p>这里的AI(人工智能)比较简单,这个算法可深可浅,此项目就是比较浅的,深的可以去看 <a href="/misc/goto?guid=4959747347989449163" rel="nofollow,noindex"> 算法 </a> ,此项目AI的大体思路是:</p> <ul> <li> <p>先便利棋盘上面的点,找到AI的棋子有活四,死四的点,既下一步能形成5个点的落子点,找到就直接在此点落子。</p> </li> <li> <p>如果没找到,就遍历玩家活四,或者死四的点,并在此进行落点进行防守,虽然活四没法防守。</p> </li> <li> <p>然后这两个点都没找到的话,就直接找AI有形成活三,或者死三的点,进行落子进攻。</p> </li> <li> <p>如果没找到,就找用户能形成活三,死三的点进行防守。就这样简单的进行交互。</p> </li> </ul> <p>4.人人模式</p> <p>人人连机主要用Multipeer Connectivity框架进行近场通讯,现在有黑白玩家想要连接。</p> <ul> <li> <p>那么双方必须打开蓝牙或者连接 同一WiFi ,接着至少要有一个设备作为浏览器(browser),用来搜寻其他设备;</p> </li> <li> <p>第二个设备必须是可发现的,它要声明它在这里,并且它想要与别的设备连接。换句话说,第二个设备需要宣传自己。<br> 一般来说,两个设备都要宣传自己,但至少要有一个能浏览其他设备,从而建立连接。</p> </li> <li> <p>接受邀请后双方建立连接。然后他们就可以基于session会话来传递数据消息数据(包括文本、图像以及可以转换为NSData对象的任何其他数据),流数据,资源数据。</p> </li> <li> <p>此项目只需要传递消息数据即可。收到数据的代理方法默认会是在子线程上面,所以如果要更新UI等操作要用 GCD线程回调到主线程 上面来,否则会造成线程异常的情况。</p> </li> <li> <p>传递的数据有棋子位置,棋子颜色,催促信号,语言文字等。为此我制定了简单的协议来区别这些数据。否则没有一套基本的标准,应用没办法判定这串数据是否是语言文字,还是棋子位置或者信号等。通讯协议表如下表所示。</p> </li> </ul> <table> <thead> <tr> <th>数据类型</th> <th>头部</th> <th>内容</th> <th>例子</th> </tr> </thead> <tbody> <tr> <td>语言文字</td> <td>~</td> <td>文字</td> <td>~你吃饭了吗?</td> </tr> <tr> <td>黑子位置</td> <td>black</td> <td>棋子x,y坐标</td> <td>black0705</td> </tr> <tr> <td>白子位置</td> <td>white</td> <td>棋子x,y坐标</td> <td>white0705</td> </tr> <tr> <td>催促</td> <td>quikly</td> <td> </td> <td>quikly</td> </tr> <tr> <td>悔棋</td> <td>undo</td> <td> </td> <td>undo</td> </tr> </tbody> </table> <p> </p> <p> </p> <p>项目主页:<a href="http://www.open-open.com/lib/view/home/1492132749711">http://www.open-open.com/lib/view/home/1492132749711</a></p> <p> </p>