五子棋想抽浓郁口感下一步棋大概要想多久?

五子棋必胜开局 五子棋开局技巧有哪些
  五子棋对大家来说应该都不陌生,因为它十分简单容易上手,小时候大家应该都玩过。玩了那么久的的五子棋,都大概知道,都知道五子棋的开始几步是很关键的。今天小编给大家介绍的就是。
  五子棋必胜开局
  五子棋玩儿家们经常提到&八卦阵&,什么是八卦阵?八卦阵就是一种高效率的防守阵法,如果对方不得其要领,八卦阵能够取得很优越的外势。我现在用通俗的语言描述一下这里面的道理。 如果你想用渔网打鱼,就需要有预谋地布下一张网,把鱼儿&网&在里面慢慢收拾。但大家都知道渔网和渔叉的区别,渔叉是有直接攻击性的,渔网没有直接的攻击性,它的使用是先布网,轰赶、控制,最后收网,再杀鱼。
  布网的问题
  第一、布网的效率
  用一定数量的材料,最大效率地织网,很自然遇到一个疏密的问题,过疏则网眼过大,易漏;过密则效率不高,自己就成鱼早被别人网在里面了。怎样才算疏密适当呢?那要看网是做什么用的了。下五子棋用的,疏密程度要以使对方不能在网里面形成五连为标准,那么很自然就是只留有四个空点为标准了。以这样的标准和统一的织法来织网,就是那个&马步&相连的网了。
  第二、布网的缓急
  当鱼儿看到有一张网出现在眼前,很自然就会躲避、突围,所以在布网的时候要预测鱼儿逃跑的方向,逃跑的方向就是布网的急所,要先急后缓。
  再说收网的问题
  第一、收网的时机
  当鱼儿在网中横冲直撞的时候,不是收网的最好时机,急于收网,网容易被撞破。当鱼儿气力枯竭的时候,才是收网的时机。
  第二、收网的方法
  最基本的收网方法是用一颗棋子与网上已有的节点同时形成三个活二,这样,一张渔网就摇身一变,成了一把鱼叉,然后不停地叉啊叉,就把鱼儿收拾了。
相关阅读推荐:
洋葱是日常生活中常见的一种蔬菜,它有着丰富的营养...
很多人感冒了都胡乱的吃药,其实这是不对的,因为我...
高血压是常见的一种心血管疾病,它的危害不容小觑,...老司机带路 如何正确迈出电子烟第一步(全文)
(原标题:老司机带路 如何正确迈出电子烟第一步)
第1页:电子烟逐渐火热 新用户该如何选择国内电子烟市场的关注指数可以说是走了一个大大的V型,几年前电子烟电视广告吞云吐雾能戒烟的画面深入人心,让不少想戒烟的烟民为其买单,但是随着使用者的增多,传统自动型电子烟烟雾小、续航差、口感差的弊端逐渐暴露,让电子烟口碑一落千丈并逐渐淡出了公众视野。老司机带路&如何正确迈出电子烟第一步而随着近年来国外电子烟技术的升级,玩法的增多,用户体验的上升,让电子烟的关注度又重新回暖,再次进入公众视野。现代主流的电子烟花样更多,选择性更大。举个形象的例子来说,现在的电子烟就像是DIY电脑主机一样,你可以选择不同的电池盒子、不同的电池、不同的雾化器、不同的烟油甚至是自己用金属丝来DIY发热芯,抛开戒烟的功效不谈,单单是这强大的可玩性,就能让很多人心里痒痒。电子烟跟电脑硬件一样,懂得人可以玩的很6,不懂的小白却是真的什么都不懂。笔者虽然不是什么资深电子烟玩家,但作为一个老用户今天就给大家来普及下如何选购电子烟。完整电子烟的部件主要包括雾化器、电池杆、烟油一支完整的电子烟包括雾化器、电池杆、烟油三大部分,而这三大部分每种都至少有上百个不同种类,通过玩家的需求进行不同组合可以出现不同效果,诸如追求口感、追求大烟雾、想要代替香烟等等,对于新用户来说,你的需求不一样,选择也是多元化的。关于电子烟的选购跟购买台式机的道理也是相通的就像DIY主机一样,你是发烧游戏玩家,你肯定会力求显卡性能,而反之你是办公用户,可能一般的CPU集显就足够使用,你就可以舍弃显卡,降低预算。但是对于新手来说,对电子烟的了解几乎是0,所以你无法找到一个最佳的平衡点,而且在随着你对电子烟知识了解更多了之后,你就会发现原来雾化器、盒子竟然有这么多种类和玩法,可能届时你就会萌生更换设备的想法,虽说电子烟没有一步到位的配置,但笔者希望通过这篇文章可以教新手们如何选好第一支电子烟,即便日后更换也可以将更换成本降到最低,做到好玩又不浪费钱。
第2页:够了解才能用的好 电子烟原理普及想要玩好电子烟,作为用户最少你应该知道电子烟工作的原理,为什么一个电池盒子加上雾化器就能迸发出比传统香烟还大的烟雾。笔者虽然不是什么物理科班出身,但经过一段时间的使用,还是基本弄懂了电子烟的工作原理。电子烟发热雾化的核心-发热丝笔者使用的是RBA(可重建式雾化器)雾化器,简单点说就是需要自己手动制作发热芯,为啥选择此类雾化器,最初的目的就是为了省钱。雾化器有成品芯和DIY芯之分,前者无需自己动手,购买成品发热芯更换即可,价格10-20元不等,后者需要自己制作发热芯,成本平均几毛钱,而且像经典的五子棋雾化器,DIY芯子上手也比较容易,只要不是太懒,RBA雾化器是个不错的选择。电子烟工作电路示意图整套电子烟的工作原理其实非常简单,最基本的物理电路图就可以清楚的标示出它的工作原理。当用户按下调压盒子的开关后,电池放电,电流经过回路使雾化器中的发热丝升温放热,而此时位于发热丝孔径内导油棉上的烟油经过高温气化后产生烟雾,在用户吸食的过程中,空气从雾化器的进气口进入,这样持续不断的烟雾就会吸入吸食者的口腔或者肺部。
第3页:雾化器有大学问 雾化器的知识普及雾化器是电子烟最重要的组成部分,雾化器的好坏决定了用户不同的吸食口感和烟雾量。市面上的雾化器有原厂和精工两种,前者做工,用料好,价格昂贵(一千至几千元不等)后者,素质虽不及原厂,但价格却足够便宜,通常是原厂的五分之一或者十分之一,也是绝大部分电子烟玩家的选择。从种类上雾化器可以分为:一次性烟弹:最有代表性的就是早期咱们常见的自动式电子烟上类似于香烟过滤嘴状的圆柱形烟弹,内置提前灌好的各口味烟油,一次性产品,不可重复清洗使用。类似于香烟过滤嘴的一次性烟弹储油式雾化器:一般指成品储油雾化器,不需要使用者手动制作发热丝,直接购买成品发热芯,注入烟油即可使用,当然也有部分成品雾化器可以DIY发热丝,但难度普遍偏大,不主流。DIY储油雾化器DIY储油式雾化器(RTA/RBA):需要用户手动制作发热丝,制作发热丝难度因不同雾化器而不同,对于新手常用的几款RBA来说,正常人都能轻易上手。DIY滴油式雾化器(RDA):一般不具备储油舱,使用者普遍为电子烟中后期玩家,烟雾量大,但因为没有储油舱,所以用户每次吸食都需要不断的对雾化器进行注油。大家已经了解了市面上常见的雾化器种类,对于大部分玩电子烟的用户来说,一次性烟弹就可以PASS掉了,而对于新手来说,滴油式雾化器也可以直接PASS掉,滴油式雾化器基本属于用来“玩”的雾化器,每抽几口就需要注油,略显繁琐,不适合长期使用,当你玩到后期,追求极致烟雾的时候,再购入滴油雾化器也为时不晚。所以,在选购雾化器上主要还是考虑储油式雾化器和DIY储油式雾化器。成品芯无需制作但使用成本高&DIY成本低但需要动手关于储油式雾化器和DIY储油式雾化器也是各有优势,各有缺点,储油式雾化器配成品发热芯使用方便,但不定期更换的发热芯成本太高(10-20元),有性价比要求的用户可能不太会考虑储油式雾化器。而DIY储油式雾化器需要DIY发热芯,平均成本几毛钱一个,大大降低后期使用成本,一般老鸟们都会推荐。而且网上一直都在讲DIY雾化器要比成品芯的雾化器口感要好,但经过笔者体验来说,口感本身就是一个很抽象的概念,而且是一个通过比较才会有的概念,笔者抽过的雾化器有限,但实际体验上DIY芯和成品芯均有口感不错的雾化器,所以在笔者个人看来,口感的好坏完全取决于雾化器的种类,关于DIY芯和成品芯影响口感之分,是一个片面的说法。
第4页:关于电子烟-雾化器选购的那些事儿相信很多新手购买电子烟的目的都来源于戒烟,而要求就是抽着口感好,使用方便,价格不要太贵。当此类用户咨询该购买何种电子烟的时候,很多老鸟都会给用户克莱鹏mini(电池盒子)和鹦鹉螺或者五子棋(雾化器)的组合,而笔者最初入坑的时候,也是被人推荐了上述组合,但在用过一段时间后就觉得这种搭配方法,在后期使用上还是会产生重复投资,并不算太合理。如果单纯为了抽电子烟,可能上述的组合也算够用,但是再你渐渐了解电子烟后,如果想要升级,基本全套都需要更换。扯远了,下面说说新手常见的几款雾化器:鹦鹉螺mini雾化器鹦鹉螺mini雾化器:成品芯更换简单,网传的口感也非常好,鹦鹉螺mini和鹦鹉螺基本是目前电子烟实体店体验烟油采用的标准雾化器,就笔者个人而言,鹦鹉螺系列的雾化器购买的意义在现在来说真的不是很大。首先成品芯20块钱一个,使用一周到两周的时间就需要更换,长此以往,你一年就需要多花五百块钱。其次鹦鹉螺网传的口感问题,笔者个人感觉口感表现平淡,出烟也比较小,所以个人而言不建议购买。五子棋雾化器五子棋雾化器:也是老鸟给新人推荐的常见雾化器,但需要自己手动做芯,好在做芯简单,笔者第一次做芯,废了一个芯就成功了。现在给五子棋做芯也就几分钟的事情,比较方便。五子棋价格不贵,后期使用成本也比较低,口感上也比较不错,烟雾量适中,适合新手在室内环境下使用。玫瑰V2S雾化器玫瑰V2S:虽然名气没有鹦鹉螺和五子棋那么大,但是不少老鸟都是这款雾化器的粉丝,外观精细修长,做芯比五子棋稍难(其实还好),精工版价格也不贵,口吸纯口感追捧的雾化器之一。当然,还有诸如像KF4这样经典的DIY雾化器都是新手可以选择的雾化器,根据笔者以往的经验,绝大部分新手在熟练学会使用上述口感雾化器的时候,一定会去考虑尝试大烟雾类的雾化器,此时的你可能已经不仅仅是为了戒烟一个目的去使用电子烟,更有一点点想玩电子烟的味道。所以在你购入大烟雾雾化器后,像五子棋和玫瑰此类的雾化器也依旧可以继续使用。他们可以给你带来更出色的口感。
第5页:关于电子烟-电池杆选购的那些事儿如果说雾化器选择不够明智可能让你多几个不常用的雾化器,那么电池盒子的选择失误,可能就会让你陷入无限投资的死循环,白白浪费很多钱。目前主流的电池盒子就是调压盒子、温控调压盒子、机械杆三种,就目前市场状况来看,机械杆推出的最早,但市面玩的人不多。调压盒子没有温控盒子功能那么强大,但技术更成熟,入市早,市面保有量最多,温控调压2015年开始才逐渐从实验变成投产上市,虽然功能上更为强大,体验上也更好,但因上市较晚,也相当于损失了部分之前购买过电子烟产品的用户。目前不少机械杆已经成了用户的收藏品 机械杆:机械杆结构简单,圆柱形居多。机械杆的优势在于他能把电池的最大功率释放出来,给用户带来更极致的烟雾量。但如此毫无保留的功率输出对雾化器和电阻丝的要求就比较高,而且用户要计算输出和电阻的安全值,如果盲目使用,容易造成爆炸的危险。虽然机械杆爆炸的情况还不多见,但既然有危险,就不建议新手使用。 调压盒子:之前市面上最主流的电池盒子,内置电子芯片,用户可以根据需求来调节盒子的输出功率,比如控制出烟大小等等。搭配DNA200新品的高端温控调压盒子成为主流温空调压盒子:目前盒子流行的趋势,不少主流电子烟玩家都会考虑的盒子。温控调压盒子的功能可以说是在调压盒子上进行了一个升级,既保留了调压盒子功率调节的功能,又多了一个温控功能。通过内置的温控芯片来测量发热丝的温度。温控的优势在于精准的温度控制,能够让烟油带来更好的口感和味道,而且还能避免棉花被烧焦,糊芯等问题的发生。简单的了解到不同盒子的差距后,我们再选购盒子上首选的肯定是温控调压盒子和调压盒子。从前如果你想戒烟,求大神给你推荐电子烟套装,大部分在盒子选择上会给你推荐克莱鹏mini盒子,这款盒子价格不贵150左右,普通的调压盒子,30W最大功率抽口感也基本足够。但从长远来看,如果你一旦起了玩心,显然这款设备是不够用的,这时候的你可能考虑要更换设备,在更换设备的同时,也就意味着之前的设备基本不会再用了。所以,在选购盒子上,我们即使不考虑一步到位,也应该考虑价格和新技术的一个平衡点,减少设备重叠更换的可能性。克莱鹏mini&Plus:这款盒子颜色丰富,采用单18650电池设计,外观小巧,易于携带。输出功率1W-50W&温度焦耳值10-50J,价格比克莱鹏MINI贵20元,对于新手来说不但预算上不会增长太多,而且在功能上要相对丰富很多,可玩性也高很多。绿之叶公司的IPV&D3性价比也不错iPv&D3:对于电子烟玩家来说,绿之叶公司的IPV系列一定不会陌生,这款主机260元左右,价格上对于新手来说应该还可以接受。采用YIHI&SX150H芯片,外观圆润小巧,手感十足。输出功率最大80W,支持镍丝钛丝温控模式,对于大部分玩家来说,这都是一款性价比比较高的主机。
第6页:真烟味的烟油在哪 关于烟油的选择抽电子烟抽到最后,玩的其实就是烟油,就跟炒菜时一样的,给你顶级的厨具,顶级的食材,顶级的大厨,不给你调味品,做出来的东西一样难吃到死。烟油也是一样,口味好,适合你的烟油,即便设备不够好,他抽出来的味道整体上也还会符合你的心意。而更好的设备,则可以让烟油的味道和口感发挥的更好。目前烟油从渠道上有国产和进口之分,国产的就不多说了,买过几瓶抽着不是很理想,也就没再买过。进口的有美国的、马来西亚的、日本的、英国的等等,总体来说目前烟油市场以马来油和美国油的销量最大。烟油的成分其实比较简单烟油从成分上来说其实基本成分也都比较透明,不像云南白药似得还需要搞一个配方保密。烟油的主要构成分为蔬菜甘油、丙二醇、香精、尼古丁、色素、添加剂这几种。看起来非常简单,实际上也的确是很简单,甚至用户可以自己购买以上配料进行勾兑,DIY出自己想要的烟油都不是问题。在用户选购烟油上,笔者个人感觉抓住以下几点即可: 品牌(产地):烟油的品牌众多像VGOD、HALO、五子棋都是比较出名的进口牌子,所以在选购进口烟油上,笔者建议新手还是应该选择品牌熟悉,口碑好的烟油。首先是安全第一,大品牌在油品的质量上肯定是要比三流作坊生产出来的安全可靠。其次是味道,就像同一口味的饮料,牌子货的口味配方一定比你在地摊上买的杂牌好喝一样,烟油也是如此。另外推荐人数较多的油都是经过无数人尝试过的口味,一般情况下都不会太让你失望。尼古丁浓度:普遍购买电子烟的用户多为了戒烟,很多人一看到烟油含有尼古丁,可能就会高呼,我要0mg浓度的,这样健康。其实大家完全不要被尼古丁这三个字吓住,既然烟油中标注含有尼古丁并标示了含量,那么正常使用对健康和安全是不会有影响的。而且尼古丁除了可以满足老烟民的烟瘾外,还能带来所谓的吸烟中的击喉感(尼古丁含量越高,击喉感越强),所以对于新手来说笔者还是建议6mg以下的烟油都可以尝试下。一般情况下3mg和6mg的尼古丁含量是主流用户的选择目前主流的烟油尼古丁浓度一般分为0mg、3mg、6mg、9mg、12mg几种,从吸食的感觉来说击喉感也是越来越强烈,对于普通用户来说,笔者还是建议以6mg以下的作为长期口粮,击喉感不会那么明显,相对来说也更健康。像12mg含量的烟油,吸食后能够明显的感觉到呛嗓子的感觉,不建议长期使用。  口味:对于用户来说,口味其实应该是放在第一位的。一般从真烟过渡到电子烟的用户在口味要求上一定会想到模拟真烟的口味来抽,但经过笔者无数次的尝试,可以确切的告诉大家,像什么“中华”、“芙蓉王”、“黄鹤楼”、“玉溪”、“万宝路”等等口味的防真烟烟油没有一个能够模拟到真烟的口味,根据笔者的尝试,绝大部分号称烟油味的烟油都是红糖大枣味居多,所以幻想真烟口味的朋友千万不要购买所谓的中华、芙蓉王等口味,如果真的想有一丝烟草味,可以考虑下部分美国油。美国油是现在的主流烟油的选择美国油:口味众多,在国内知名的品牌也比较多。喜欢烟草口味的用户可以考虑尝试下美国油,比如“十五任”、“翠贝卡”等等,但口味上仍然不能和国内烤烟相比,口味上笔者个人感觉更像是雪茄的味道。另外美国油中也有不少好抽的水果口味和甜品口味可以供大家尝试,相对来说美国油的香味要比马来油更纯正一些,当然这也不保证每一款油都如你想象的那么好抽。马来油价格便宜味道清新&部分烟油值得一试马来油:一般通常以清新水果味居多,水果味中略带薄荷的感觉,抽起来还是非常的不错。但马来油也并非没有缺点,都说一分钱一分货,马来油价格便宜,所以带来的各色水果香味也并不是那么醇正,而且如果你是成品芯用户,建议少抽马来油,马来油比较废芯子,基本一仓油芯子就会黑掉。对于电子烟用户来说,烟油才是最大的坑,选购烟油口味的时候,一定要多看网友评价,少看商家给出的口味评价。这样才能减少买到难抽烟油的几率。烟油的口味因人而异,而且也不一定是昂贵的烟油一定就好抽,所以选择烟油就像盲人摸象一样,一定程度上还是要碰碰运气的。
第7页:小配件是否有大作用 理性选购配件虽然选购电子烟的大知识已经普及完成了。但在选购电子烟的过程中,还少不了一些小配件的选择,下面就简单给大家介绍一下。电池和充电器:电池是电子烟的动力源,虽然小,但是作用却是最大的。一般的电子烟最常见的就是18650电池,而生产这些电池的几大著名厂商其实大家也都耳熟能详,索尼、LG、松下、三星等。所以在电子烟电池的选购上无外乎也就以上几大品牌。电池虽小,但却关乎使用安全,在购买上切莫贪图价格便宜。根据笔者了解一块正品的18650电芯售价最低也都会在30-40元左右。另外就是在使用中量力而行,不要给设备施加太大压力,压力越大,发生危险的几率也就更大一些。18650电池很重要&千万别买假货关于电池充电器,对于新手玩家来说一个售价接近百元的充电器看起来还是相当昂贵的。而且目前大部分设备都支持USB直充,所以在笔者看来对于新手而言,电池充电器也并非是必需品。绕丝工具:绕丝工具在笔者看来可分为穷人版和高富帅版。穷人版10-20块钱基本可以搞定,高富帅版价格在100-200元之间。两者除了外观和工具数量上有一定的差别外在使用方便程度和绕丝精美度上也会存在差别,但最终对用户使用电子烟的影响并不是很大。所以在笔者看来购买什么版本,还是要看个人预算。穷人作丝装备穷人版:小镊子、剪丝钳、两枚直径2MM的小螺丝刀(拧螺丝和绕丝)豪华版电子烟工具箱高富帅版:工具箱、多枚螺丝刀、陶瓷镊子、剪丝钳、绕丝棒、剪刀、测阻器等等个性配件:关于电子烟的周边配件其实还不算多,主要包括贴纸、保护套和防滑圈。三者的主要作用就是让自己的电子烟设备更加个性化和降低电子烟磨损和脱手的情况发生。从价格来说贴纸和保护套10元左右,防滑圈价格两元左右。
第8页:电子烟并不代表健康 使用还需理性关于电子烟:电子烟虽然诞生多年,但到目前为止,在国内仍然没有给出一个较为明确的定位。对于电子烟的安全性,无论是使用多年电子烟的老用户还是有购买想法的用户来说,都是一个未知数。即便从烟油的成分中我们看不到明显的毒性,但在笔者看来使用电子烟的群体,仍然应该保持着谨慎的态度。尤其对于烟油和使用方法上,更应该保持一份理性和慎重的心态。无论是戒烟还是娱乐&对待电子烟还是要慎重 选购总结:在选购电子烟上大部分用户都是会在意成本的,包括同时在吸食真烟的用户,不但要考虑到电子烟烟油的成本,可能还要考虑到如果不戒烟香烟的成本。在这里关于成本的问题,笔者只能在文章里帮大家合理压缩,但其他避免不了的花费,还是希望大家根据收入情况量力而行。特殊提示:18岁以下未成年人请勿购买使用雾化器:新手的第一个雾化器应该首先考虑的是更好的口感和使用难度,所以在推荐上笔者并未向新手推荐大烟雾类雾化器。因为在使用电子烟的过程中,口感和大烟雾是两个不冲突的概念。口感更像是用来代替香烟,大烟雾则更倾向于娱乐化,所以即便未来用户想购买大烟雾雾化器,也不会跟前期选购口感雾化器冲突,口感雾化器和大烟雾雾化器都可以交替使用。
电池盒子:关于电池盒子,笔者首推温控调压盒子,这样即便你在后期更换设备的时候,也无需担心盒子性能不够的问题而产生重复消费。当然,如果你真的就想节约成本,以后肯定不会升级设备,那么30W功率的克莱鹏mini现在依旧是个挺有性价比的选择。烟油:烟油是个无底洞,口味成百上千种。无论是国产油还是进口油,千万记得别买到假油。口味上因人而异,还需要用户自己多去尝试。对于没有经验的用户,笔者个人建议抽一些口碑好,人气高的烟油是个不错的选择。如果有条件也可以去当地的电子烟店去尝试体验一番。点我查看更多电子烟套装产品的美图。
本文来源:中关村在线
责任编辑:王珏_NT2830
关键词阅读:
不做嘴炮 只管约到
热门产品:   
:        
:         
热门影院:
用微信扫描二维码分享至好友和朋友圈更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
, 可在设置中重新打开噢!
30秒后自动关闭
五子棋 把五子棋下成围棋了最后一步白棋傻了呀">五子棋 把五子棋下成围棋了最后一步白棋傻了呀
请选择打赏金额:
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
本奖品由提供
红包雨下完了,下次早点来噢~Android下的五子棋开发详细步骤(附代码)
时间: 04:44:38
&&&& 阅读:344
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&今天我们来看一下Android下游戏的开发。首先来看看整体的结构:
各个类的详细代码如下,附有详细注释:
MainActivity:
package com.example.
import android.app.A
import android.content.I
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
//import com.example.gobang.bt.BtGoBangA
import com.example.gobang.mm.MMGobangA
import com.example.gobang.R;
public class MainActivity extends Activity implements OnClickListener {
& & @Override
& & protected void onCreate(Bundle savedInstanceState) {
& & & & super.onCreate(savedInstanceState);
& & & & setContentView(R.layout.gobang);
& & & & Button b_mm = (Button) findViewById(R.id.b_mm);
& & & & Button b_bt = (Button) findViewById(R.id.b_bt);
& & & & b_mm.setOnClickListener(this);
& & & & b_bt.setOnClickListener(this);
& & @Override
& & public void onClick(View v) {
& & & & switch (v.getId()) {
& & & & & & case R.id.b_bt:
& & & & & & & & //startActivity(new Intent(MainActivity.this, BtGoBangActivity.class));
& & & & & & System.out.println(&蓝牙版还未上线&);
& & & & & & & &
& & & & & & case R.id.b_mm:
& & & & & & & & startActivity(new Intent(MainActivity.this, MMGobangActivity.class));
& & & & & & & &
ChessFormUtil:
package com.example.gobang.
public class ChessFormUtil {
& & // 定义各种棋形的分数
& & /** 待分析的棋型列表的长度 */
& & public static final int ANALYZE_LEN = 8;
& & public static final int HALF_LEN = ANALYZE_LEN && 1;
& & &* 五连:你只需下一步就可以胜利了
& & public static final int WU_LIAN = 85;
& & &* 活四:两边都可成五的点
& & public static final int HUO_SI = 40;
& & &* 活三:在走一步可以成活四的点
& & public static final int HUO_SAN = 15;
& & &* 冲四:只有一端可成五的点
& & public static final int CHONG_SI = 6;
& & &* 活二:在走一步可成活三的点
& & public static final int HUO_ER = 4;
& & &* 眠三:在走一步可成冲四的点
& & public static final int MIAN_SAN = 2;
& & &* 眠二:在走一步可成眠三的点
& & public static final int MIAN_ER = 1;
& & // -------------------------------------------------------------
& & &* 分析存在五连
& & &* @param tmpChess
& & public boolean analyzeWulian(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & for (int i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & for (int i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (count == 4) {
& & & & & &
& & &* 分析活四 return 是否存在活四
& & &* @param tmpChess
& & public boolean analyzeHuosi(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & int i = 0;
& & & & boolean isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN - (i + 1)] == 0) {
& & & & & & isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN + i] == 0) {
& & & & & & isSpace =
& & & & } else {
& & & & & & isSpace =
& & & & if (count == 3 && isSpace) {
& & & & & &
& & &* 分析活三 return 是否存在活三
& & &* @param tmpChess
& & public boolean analyzeHuosan(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & int i = 0;
& & & & boolean isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN - (i + 1)] == 0) {
& & & & & & isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN + i] == 0) {
& & & & & & isSpace =
& & & & } else {
& & & & & & isSpace =
& & & & if (count == 2 && isSpace) {
& & & & & &
& & &* 分析冲四 return 是否存在冲四
& & &* @param tmpChess
& & public boolean analyzeChongsi(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & int i = 0;
& & & & boolean isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN - (i + 1)] == 0) {
& & & & & & isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN + i] == 0) {
& & & & & & isSpace =
& & & & if (count == 3 && isSpace) {
& & & & & &
& & &* 分析活二 return 是否存在活二
& & &* @param tmpChess
& & public boolean analyzeHuoEr(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & int i = 0;
& & & & boolean isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN - (i + 1)] == 0) {
& & & & & & isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN + i] == 0) {
& & & & & & isSpace =
& & & & } else {
& & & & & & isSpace =
& & & & if (count == 1 && isSpace) {
& & & & & &
& & &* 分析眠三 return 是否存在眠三
& & &* @param tmpChess
& & public boolean analyzeMianSan(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & int i = 0;
& & & & boolean isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN - (i + 1)] == 0) {
& & & & & & isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN + i] == 0) {
& & & & & & isSpace =
& & & & if (count == 2 && isSpace) {
& & & & & &
& & &* 分析眠二 return 是否存在眠二
& & &* @param tmpChess
& & public boolean analyzeMianEr(int[] tmpChess, int isWho) {
& & & & int count = 0;
& & & & int i = 0;
& & & & boolean isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN - (i + 1)] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN - (i + 1)] == 0) {
& & & & & & isSpace =
& & & & for (i = 0; i & HALF_LEN; i++) {
& & & & & & if (tmpChess[HALF_LEN + i] == isWho) {
& & & & & & & & count++;
& & & & & & } else {
& & & & & & & &
& & & & & & }
& & & & if (tmpChess[HALF_LEN + i] == 0) {
& & & & & & isSpace =
& & & & if (count == 1 && isSpace) {
& & & & & &
GobangView:
package com.example.gobang.
import android.content.C
import android.content.res.R
import android.graphics.B
import android.graphics.BitmapF
import android.graphics.C
import android.graphics.C
import android.graphics.P
import android.graphics.Paint.S
import android.graphics.drawable.D
import android.util.AttributeS
import android.util.L
import android.view.KeyE
import android.view.MotionE
import android.view.V
import android.widget.TextV
import com.example.gobang.R;
class ChessPoint {
// public class GobangView extends View implements Runnable {
public class GobangView extends View {
& & private final static int GRID_SIZE = 13;
& & private final static int CHESS_GRID = GRID_SIZE - 1;
& & private final static int CHECK_DIR = 4; // 当前位置的四个方向,横、竖、左斜、右斜
& & private int mChessDia = 22; // 棋的直径
& & private int mW // 棋盘格的宽度
& & private int mStartX;// 棋盘定位的左上角X
& & private int mStartY;// 棋盘定位的左上角Y
& & private Bitmap[] mChessBW; // 黑棋和白棋
& & private int[][] mChessTable = new int[CHESS_GRID][CHESS_GRID]; // 网格
& & private int[][][] computerTable = new int[CHESS_GRID][CHESS_GRID][CHECK_DIR]; // 电脑棋形表
& & private int[][][] playerTable = new int[CHESS_GRID][CHESS_GRID][CHECK_DIR]; // 电脑棋形表
& & public static final int BLACK = 2; // 电脑执黑棋
& & public static final int WHITE = 1; // 玩家执白棋
& & private int whoTurn = WHITE; // 该谁下了,该下白棋了=2,该下黑棋了=1.
& & // 这里先下黑棋(黑棋以后设置为机器自动下的棋子)
& & private int mWinFlag = 0;
& & private static final int GAMESTATE_PRE = 0;
& & private static final int GAMESTATE_RUN = 1;
& & private static final int GAMESTATE_PAUSE = 2;
& & private static final int GAMESTATE_END = 3;
& & private int mGameState = GAMESTATE_RUN; // 游戏阶段:0=尚未游戏,1=正在进行游戏,2=游戏结束
& & private TextView mStatusTextV // 根据游戏状态设置显示的文字
& & private CharSequence mT
& & private CharSequence STRING_WIN = &白棋赢! \n 按中键开始新游戏。&;
& & private CharSequence STRING_LOSE = &黑棋赢! \n 按中键开始新游戏。&;
& & private CharSequence STRING_EQUAL = &酷!你们是平手! \n 按中键开始新游戏。&;
& & private Paint mP
& & private boolean bitmapLoaded =
& & private ChessFormUtil mChessFormU
& & private Resources mR
& & private Bitmap mB
& & // 保存前5个较好的落子点
& & private ChessPoint[] fiveBetterPoints = new ChessPoint[5];
& & public GobangView(Context context){
& & super(context);
& & public GobangView(Context context, AttributeSet attrs, int defStyle) {
& & & & super(context, attrs, defStyle);
& & & & mChessFormUtil = new ChessFormUtil();
& & public GobangView(Context context, AttributeSet attrs) { // 好像调用的是这个构造函数,为什么不是前面的呢
& & & & super(context, attrs);
& & & & this.setFocusable(true); //&
& & & & this.setFocusableInTouchMode(true);
& & & & mChessFormUtil = new ChessFormUtil();
& & & & mResources = this.getResources();
& & & & mBitmap = BitmapFactory.decodeResource(mResources, R.drawable.game);
& & & & //init();
& & // 这里画棋子后来没有用图片画,而是直接画了圆。因为我做的图片不好看。
& & // 初始化黑白棋的Bitmap
& & public void init() {
& & & & mGameState = 1; // 设置游戏为开始状态
& & & & whoTurn = WHITE; // 初始为先下黑棋
& & & & mWinFlag = 0; // 清空输赢标志。
& & & & // 清空各种表格
& & & & for (int i = 0; i & CHESS_GRID; i++) {
& & & & & & for (int j = 0; j & CHESS_GRID; j++) {
& & & & & & & & mChessTable[i][j] = 0;
& & & & & & & & for (int k = 0; k & CHECK_DIR; k++) {
& & & & & & & & & & computerTable[i][j][k] = 0;
& & & & & & & & & & playerTable[i][j][k] = 0;
& & & & & & & & }
& & & & & & }
& & public void setTextView(TextView tv) {
& & & & mStatusTextView =
& & & & mStatusTextView.setVisibility(View.INVISIBLE);
& & @Override
& & protected void onSizeChanged(int w, int h, int oldw, int oldh) {
& & & & if (w &= h)
& & & & & & mWidth = w / GRID_SIZE;
& & & & else
& & & & & & mWidth = h / GRID_SIZE;
& & & & mChessDia = mWidth - 2;
& & & & mStartX = (w - GRID_SIZE * mWidth) && 1;
& & & & mStartY = (h - GRID_SIZE * mWidth) && 1;
& & & & if (!bitmapLoaded) {
& & & & & & mChessBW = new Bitmap[2];
& & & & & & Bitmap bitmap = Bitmap.createBitmap(mChessDia, mChessDia,
& & & & & & & & & & Bitmap.Config.ARGB_8888);
& & & & & & Canvas canvas = new Canvas(bitmap);
& & & & & & Resources r = this.getContext().getResources();
& & & & & & Drawable tile = r.getDrawable(R.drawable.chess1);
& & & & & & tile.setBounds(0, 0, mChessDia, mChessDia);
& & & & & & tile.draw(canvas);
& & & & & & mChessBW[0] =
& & & & & & // bitmap.recycle(); //
& & & & & & // 清除该bitmap的内存,保证该Bitmap被回收,但是一般不需要手动调用,正常的GC会清除该Bitmap
& & & & & & bitmap = Bitmap.createBitmap(mChessDia, mChessDia,
& & & & & & & & & & Bitmap.Config.ARGB_8888);
& & & & & & canvas = new Canvas(bitmap); // Bitmap + Canvas + Drawable ==
& & & & & & // 标准的Bitmap绘制。
& & & & & & tile = r.getDrawable(R.drawable.chess2);
& & & & & & tile.setBounds(0, 0, mChessDia, mChessDia);
& & & & & & tile.draw(canvas);
& & & & & & mChessBW[1] =
& & & & & & bitmapLoaded =
& & & & & & init();
& & @Override
& & public boolean onTouchEvent(MotionEvent event) {
& & & & if (event.getAction() == MotionEvent.ACTION_DOWN) {
& & & & & & switch (mGameState) {
& & & & & & & & case GAMESTATE_PRE:
& & & & & & & & & &
& & & & & & & & case GAMESTATE_RUN: {
& & & & & & & & & &
& & & & & & & & & &
& & & & & & & & & & float x0 = mWidth - (event.getX() - mStartX) % mW
& & & & & & & & & & float y0 = mWidth - (event.getY() - mStartY) % mW
& & & & & & & & & & if (x0 & (mWidth && 1)) {
& & & & & & & & & & & & x = (int) ((event.getX() - mStartX) / mWidth);
& & & & & & & & & & } else {
& & & & & & & & & & & & x = (int) ((event.getX() - mStartX) / mWidth) - 1;
& & & & & & & & & & }
& & & & & & & & & & if (y0 & (mWidth && 1)) {
& & & & & & & & & & & & y = (int) ((event.getY() - mStartY) / mWidth);
& & & & & & & & & & } else {
& & & & & & & & & & & & y = (int) ((event.getY() - mStartY) / mWidth) - 1;
& & & & & & & & & & }
& & & & & & & & & & Log.v(&x,y&, && + y + &,& + x);
& & & & & & & & & & if ((x &= 0 && x & CHESS_GRID) && (y &= 0 && y & CHESS_GRID)) {
& & & & & & & & & & & & if (mChessTable[x][y] == 0) {
& & & & & & & & & & & & & & if (whoTurn == WHITE) {
& & & & & & & & & & & & & & & & putChess(x, y, WHITE);
& & & & & & & & & & & & & & & & if (checkWin(WHITE)) {
& & & & & & & & & & & & & & & & & & mText = STRING_WIN;
& & & & & & & & & & & & & & & & & & mGameState = GAMESTATE_END;
& & & & & & & & & & & & & & & & & & showTextView(mText);
& & & & & & & & & & & & & & & & } else if (checkFull()) {// 如果棋盘满了
& & & & & & & & & & & & & & & & & & mText = STRING_EQUAL;
& & & & & & & & & & & & & & & & & & mGameState = GAMESTATE_END;
& & & & & & & & & & & & & & & & & & showTextView(mText);
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & whoTurn = BLACK;
& & & & & & & & & & & & & & & & // 电脑开始分析
& & & & & & & & & & & & & & & & analyzeChess();
& & & & & & & & & & & & & & & & // 黑棋下了之后开始分析黑棋此时是否胜利。
& & & & & & & & & & & & & & & & if (checkWin(BLACK)) { // 如果是黑棋赢了
& & & & & & & & & & & & & & & & & & mText = STRING_LOSE;
& & & & & & & & & & & & & & & & & & mGameState = GAMESTATE_END;
& & & & & & & & & & & & & & & & & & showTextView(mText);
& & & & & & & & & & & & & & & & } else if (checkFull()) {// 如果棋盘满了
& & & & & & & & & & & & & & & & & & mText = STRING_EQUAL;
& & & & & & & & & & & & & & & & & & mGameState = GAMESTATE_END;
& & & & & & & & & & & & & & & & & & showTextView(mText);
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & whoTurn = WHITE;
& & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & & &
& & & & & & & & case GAMESTATE_PAUSE:
& & & & & & & & & &
& & & & & & & & case GAMESTATE_END:
& & & & & & & & & &
& & & & & & }
& & & & & & this.invalidate();
& & private void clearArray(int[] array) {
& & & & for (int i = 0; i & array. i++)
& & & & & & array[i] = 0;
& & private void clearChessArray() {
& & & & int i,
& & & & for (i = 0; i & CHESS_GRID; i++) {
& & & & & & for (j = 0; j & CHESS_GRID; j++) {
& & & & & & & & computerTable[i][j][0] = 0;
& & & & & & & & computerTable[i][j][1] = 0;
& & & & & & & & computerTable[i][j][2] = 0;
& & & & & & & & computerTable[i][j][3] = 0;
& & & & & & & & playerTable[i][j][0] = 0;
& & & & & & & & playerTable[i][j][1] = 0;
& & & & & & & & playerTable[i][j][2] = 0;
& & & & & & & & playerTable[i][j][3] = 0;
& & & & & & }
& & & & for (i = 0; i & 5; i++) {
& & & & & & fiveBetterPoints[i] =
& & &* 分析具体的方向
& & &* @param tmpChess 该方向的棋型
& & private int analyzeDir(int[] tmpChess, int isWho) {
& & & & // 如果满足活四,就不活三、满足活三就不冲四,如此...
& & & & int score = 0;
& & & & if (mChessFormUtil.analyzeWulian(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.WU_LIAN;
& & & & } else if (mChessFormUtil.analyzeHuosi(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.HUO_SI;
& & & & } else if (mChessFormUtil.analyzeHuosan(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.HUO_SAN;
& & & & } else if (mChessFormUtil.analyzeChongsi(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.CHONG_SI;
& & & & } else if (mChessFormUtil.analyzeHuoEr(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.HUO_ER;
& & & & } else if (mChessFormUtil.analyzeMianSan(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.MIAN_SAN;
& & & & } else if (mChessFormUtil.analyzeMianEr(tmpChess, isWho)) {
& & & & & & score = ChessFormUtil.MIAN_ER;
& & & & } else {
& & & & & & score = 0;
& & &* 电脑智能分析最好的下棋地点
& & private void analyzeChess() {
& & & & if (whoTurn == BLACK) {
& & & & & & // 与当前棋子相关需要分析棋型的棋子数组
& & & & & & clearChessArray();
& & & & & & analyzeChessMater(computerTable, BLACK, 0, 0, CHESS_GRID,
& & & & & & & & & & CHESS_GRID);
& & & & & & // 分析玩家的棋型/////////////////////////////////////////////////////
& & & & & & analyzeChessMater(playerTable, WHITE, 0, 0, CHESS_GRID, CHESS_GRID);
& & & & & & ChessPoint bestPoint = findBestPoint();
& & & & & & // Log.v(&Best Chess&, &x = & + bestPoint.x + &, y = & +
& & & & & & // bestPoint.y);
& & & & & & mChessTable[bestPoint.y][bestPoint.x] = BLACK;
& & &* 分析指定的棋型
& & &* @param materChess 棋型数组
& & private void analyzeChessMater(int[][][] materChess, int isWho, int sx,
& & & & & & int sy, int ex, int ey) {
& & & & int[] tmpChess = new int[ChessFormUtil.ANALYZE_LEN];
& & & & // 具体代码...
& & & & int i, j,
& & & & // 分析电脑的棋型/////////////////////////////////////////////////////
& & & & for (i = i & i++) {
& & & & & & for (j = j & j++) {
& & & & & & & & if (mChessTable[i][j] == 0) {
& & & & & & & & & & // 找出横向的棋子的棋型
& & & & & & & & & & clearArray(tmpChess);
& & & & & & & & & & for (k = 1; k &= ChessFormUtil.HALF_LEN; k++) {
& & & & & & & & & & & & if ((j + k) & ex) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN + (k - 1)] = mChessTable[i][j
& & & & & & & & & & & & & & & & & & + k];
& & & & & & & & & & & & }
& & & & & & & & & & & & if ((j - k) &= 0) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN - k] = mChessTable[i][j
& & & & & & & & & & & & & & & & & & - k];
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & & & materChess[i][j][0] = analyzeDir(tmpChess, isWho);
& & & & & & & & & & // 找出竖向的棋子的棋型
& & & & & & & & & & clearArray(tmpChess);
& & & & & & & & & & for (k = 1; k &= ChessFormUtil.HALF_LEN; k++) {
& & & & & & & & & & & & if ((i + k) & ey) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN + (k - 1)] = mChessTable[i
& & & & & & & & & & & & & & & & & & + k][j];
& & & & & & & & & & & & }
& & & & & & & & & & & & if ((i - k) &= 0) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN - k] = mChessTable[i
& & & & & & & & & & & & & & & & & & - k][j];
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & & & materChess[i][j][1] = analyzeDir(tmpChess, isWho);
& & & & & & & & & & // 找出左斜的棋子的棋型
& & & & & & & & & & clearArray(tmpChess);
& & & & & & & & & & for (k = 1; k &= ChessFormUtil.HALF_LEN; k++) {
& & & & & & & & & & & & if ((i + k) & ey && (j + k) & ex) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN + (k - 1)] = mChessTable[i
& & & & & & & & & & & & & & & & & & + k][j + k];
& & & & & & & & & & & & }
& & & & & & & & & & & & if ((i - k) &= 0 && (j - k) &= 0) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN - k] = mChessTable[i
& & & & & & & & & & & & & & & & & & - k][j - k];
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & & & materChess[i][j][2] = analyzeDir(tmpChess, isWho);
& & & & & & & & & & // 找出右斜的棋子的棋型
& & & & & & & & & & clearArray(tmpChess);
& & & & & & & & & & for (k = 1; k &= ChessFormUtil.HALF_LEN; k++) {
& & & & & & & & & & & & if ((i - k) &= 0 && (j + k) & ex) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN + (k - 1)] = mChessTable[i
& & & & & & & & & & & & & & & & & & - k][j + k];
& & & & & & & & & & & & }
& & & & & & & & & & & & if ((i + k) & ey && (j - k) &= 0) {
& & & & & & & & & & & & & & tmpChess[ChessFormUtil.HALF_LEN - k] = mChessTable[i
& & & & & & & & & & & & & & & & & & + k][j - k];
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & & & materChess[i][j][3] = analyzeDir(tmpChess, isWho);
& & & & & & & & & & // mChessTable[i][]
& & & & & & & & & & // 分析最大分数,保存该点坐标...
& & & & & & & & }
& & & & & & }
& & private void insertBetterChessPoint(ChessPoint cp) {
& & & & int i, j = 0;
& & & & ChessPoint tmpcp =
& & & & for (i = 0; i & 5; i++) {
& & & & & & if (null != fiveBetterPoints[i]) {
& & & & & & & & if (cp.score & fiveBetterPoints[i].score) {
& & & & & & & & & & tmpcp = fiveBetterPoints[i];
& & & & & & & & & & fiveBetterPoints[i] =
& & & & & & & & & & for (j = j & 5; j++) {
& & & & & & & & & & & & if (null != fiveBetterPoints[j]) {
& & & & & & & & & & & & & & if (tmpcp.score & fiveBetterPoints[j].score) {
& & & & & & & & & & & & & & & & tmpcp = fiveBetterPoints[j];
& & & & & & & & & & & & & & & & fiveBetterPoints[j] =
& & & & & & & & & & & & & & }
& & & & & & & & & & & & } else {
& & & & & & & & & & & & & & fiveBetterPoints[j] =
& & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & & & }
& & & & & & & & & &
& & & & & & & & }
& & & & & & } else {
& & & & & & & & fiveBetterPoints[i] =
& & & & & & & &
& & & & & & }
& & & & tmpcp =
& & &* 找到最佳点
& & &* @return 最佳点
& & private ChessPoint findBestPoint() {
& & & & int i,
& & & & ChessP
& & & & int maxScore = 0;
& & & & int tmpScore = 0;
& & & & for (i = 0; i & CHESS_GRID; i++) {
& & & & & & for (j = 0; j & CHESS_GRID; j++) {
& & & & & & & & // 电脑比较
& & & & & & & & tmpScore = computerTable[i][j][0];
& & & & & & & & tmpScore += computerTable[i][j][1];
& & & & & & & & tmpScore += computerTable[i][j][2];
& & & & & & & & tmpScore += computerTable[i][j][3];
& & & & & & & & if (maxScore &= tmpScore) {
& & & & & & & & & & maxScore = tmpS
& & & & & & & & & & point = new ChessPoint();
& & & & & & & & & & point.x =
& & & & & & & & & & point.y =
& & & & & & & & & & point.score = maxS
& & & & & & & & & & // 不能容忍0作为最小分数插入,因为
& & & & & & & & & & // 哪怕该点有棋,它的分数也是为0
& & & & & & & & & & // 不过这里不做判断就会将有棋的地方替换掉
& & & & & & & & & & if (maxScore & 0) {
& & & & & & & & & & & & insertBetterChessPoint(point);
& & & & & & & & & & }
& & & & & & & & }
& & & & & & & & // 玩家比较
& & & & & & & & tmpScore = playerTable[i][j][0];
& & & & & & & & tmpScore += playerTable[i][j][1];
& & & & & & & & tmpScore += playerTable[i][j][2];
& & & & & & & & tmpScore += playerTable[i][j][3];
& & & & & & & & if (maxScore &= tmpScore) {
& & & & & & & & & & maxScore = tmpS
& & & & & & & & & & point = new ChessPoint();
& & & & & & & & & & point.x =
& & & & & & & & & & point.y =
& & & & & & & & & & point.score = maxS
& & & & & & & & & & if (maxScore & 0) {
& & & & & & & & & & & & insertBetterChessPoint(point);
& & & & & & & & & & }
& & & & & & & & }
& & & & & & }
& & & & // Log.v(&cmaxpoint = &, && + cMaxScore);
& & & & // Log.v(&pmaxpoint = &, && + pMaxScore);
& & & & return analyzeBetterChess();
& & &* 找到几点中比较好的点
& & &* @return 最佳点
& & private ChessPoint findBetterPoint(int sx, int sy, int ex, int ey) {
& & & & int i,
& & & & ChessP
& & & & int maxScore = 0;
& & & & int tmpScore = 0;
& & & & for (i = i & i++) {
& & & & & & for (j = j & j++) {
& & & & & & & & // 电脑比较
& & & & & & & & tmpScore = computerTable[i][j][0];
& & & & & & & & tmpScore += computerTable[i][j][1];
& & & & & & & & tmpScore += computerTable[i][j][2];
& & & & & & & & tmpScore += computerTable[i][j][3];
& & & & & & & & if (maxScore &= tmpScore) {
& & & & & & & & & & maxScore = tmpS
& & & & & & & & & & point = new ChessPoint();
& & & & & & & & & & point.x =
& & & & & & & & & & point.y =
& & & & & & & & & & point.score = maxS
& & & & & & & & & & insertBetterChessPoint(point);
& & & & & & & & }
& & & & & & & & // 玩家比较
& & & & & & & & tmpScore = playerTable[i][j][0];
& & & & & & & & tmpScore += playerTable[i][j][1];
& & & & & & & & tmpScore += playerTable[i][j][2];
& & & & & & & & tmpScore += playerTable[i][j][3];
& & & & & & & & if (maxScore &= tmpScore) {
& & & & & & & & & & maxScore = tmpS
& & & & & & & & & & point = new ChessPoint();
& & & & & & & & & & point.x =
& & & & & & & & & & point.y =
& & & & & & & & & & point.score = maxS
& & & & & & & & & & insertBetterChessPoint(point);
& & & & & & & & }
& & & & & & }
& & & & return fiveBetterPoints[0];
& & private ChessPoint analyzeBetterChess() {
& & & & if (fiveBetterPoints[0].score & 30) {
& & & & & & return fiveBetterPoints[0];
& & & & } else {
& & & & & & ChessPoint betterPoint =
& & & & & & ChessPoint tmpPoint =
& & & & & & int goodIdx = 0;
& & & & & & int i = 0;
& & & & & & int startx, starty, endx,
& & & & & & ChessPoint[] fbpTmp = new ChessPoint[5];
& & & & & & for (i = 0; i & 5; i++) {
& & & & & & & & fbpTmp[i] = fiveBetterPoints[i];
& & & & & & }
& & & & & & for (i = 0; i & 5; i++) {
& & & & & & & & if (fbpTmp[i] == null)
& & & & & & & & & &
& & & & & & & & mChessTable[fbpTmp[i].y][fbpTmp[i].x] = BLACK;
& & & & & & & & clearChessArray();
& & & & & & & & startx = fbpTmp[i].x - 5;
& & & & & & & & starty = fbpTmp[i].y - 5;
& & & & & & & & if (startx & 0) {
& & & & & & & & & & startx = 0;
& & & & & & & & }
& & & & & & & & if (starty & 0) {
& & & & & & & & & & starty = 0;
& & & & & & & & }
& & & & & & & & endx = startx + 10;
& & & & & & & & endy = starty + 10;
& & & & & & & & if (endx & CHESS_GRID) {
& & & & & & & & & & endx = CHESS_GRID;
& & & & & & & & }
& & & & & & & & if (endy & CHESS_GRID) {
& & & & & & & & & & endy = CHESS_GRID;
& & & & & & & & }
& & & & & & & & analyzeChessMater(computerTable, BLACK, startx, starty, endx,
& & & & & & & & & & & & endy);
& & & & & & & & // 分析玩家的棋型/////////////////////////////////////////////////////
& & & & & & & & analyzeChessMater(playerTable, WHITE, startx, starty, endx,
& & & & & & & & & & & & endy);
& & & & & & & & tmpPoint = findBetterPoint(startx, starty, endx, endy);
& & & & & & & & if (betterPoint != null) {
& & & & & & & & & & if (betterPoint.score &= tmpPoint.score) {
& & & & & & & & & & & & betterPoint = tmpP
& & & & & & & & & & & & goodIdx =
& & & & & & & & & & }
& & & & & & & & } else {
& & & & & & & & & & betterPoint = tmpP
& & & & & & & & & & goodIdx =
& & & & & & & & }
& & & & & & & & mChessTable[fbpTmp[i].y][fbpTmp[i].x] = 0;
& & & & & & }
& & & & & & tmpPoint =
& & & & & & betterPoint =
& & & & & & return fbpTmp[goodIdx];
& & @Override
& & public boolean onKeyDown(int keyCode, KeyEvent msg) {
& & & & Log.e(&KeyEvent.KEYCODE_DPAD_CENTER&, & & + keyCode);
& & & & if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
& & & & & & switch (mGameState) {
& & & & & & & & case GAMESTATE_PRE:
& & & & & & & & & &
& & & & & & & & case GAMESTATE_RUN:
& & & & & & & & & &
& & & & & & & & case GAMESTATE_PAUSE:
& & & & & & & & & &
& & & & & & & & case GAMESTATE_END: {// 游戏结束后,按CENTER键继续
& & & & & & & & & & Log.e(&Fire Key Pressed:::&, &FIRE&);
& & & & & & & & & & mGameState = GAMESTATE_RUN;
& & & & & & & & & & this.setVisibility(View.VISIBLE);
& & & & & & & & & & this.mStatusTextView.setVisibility(View.INVISIBLE);
& & & & & & & & & & this.init();
& & & & & & & & & & this.invalidate();
& & & & & & & & }
& & & & & & & & & &
& & & & & & }
& & & & return super.onKeyDown(keyCode, msg);
& & @Override
& & public void onDraw(Canvas canvas) {
& & & & // canvas.drawColor(Color.YELLOW);
& & & & Paint paint1 = new Paint();
& & & & canvas.drawBitmap(mBitmap, 0, 0, paint1);
& & & & // 画棋盘
& & & & & & Paint paintRect = new Paint();
& & & & & & paintRect.setColor(Color.GRAY);
& & & & & & paintRect.setStrokeWidth(2);
& & & & & & paintRect.setStyle(Style.STROKE);
& & & & & & for (int i = 0; i & GRID_SIZE; i++) {
& & & & & & & & for (int j = 0; j & GRID_SIZE; j++) {
& & & & & & & & & & int mLeft = i * mWidth + mStartX;
& & & & & & & & & & int mTop = j * mWidth + mStartY;
& & & & & & & & & & int mRright = mLeft + mW
& & & & & & & & & & int mBottom = mTop + mW
& & & & & & & & & & canvas.drawRect(mLeft, mTop, mRright, mBottom, paintRect);
& & & & & & & & }
& & & & & & }
& & & & & & // 画棋盘的外边框
& & & & & & paintRect.setStrokeWidth(4);
& & & & & & canvas.drawRect(mStartX, mStartY, mStartX + mWidth * GRID_SIZE,
& & & & & & & & & & mStartY + mWidth * GRID_SIZE, paintRect);
& & & & // 画棋子
& & & & if (bitmapLoaded) {
& & & & & & for (int i = 0; i & CHESS_GRID; i++) {
& & & & & & & & for (int j = 0; j & CHESS_GRID; j++) {
& & & & & & & & & & if (mChessTable[i][j] == BLACK) {
& & & & & & & & & & & & // 通过图片来画
& & & & & & & & & & & & canvas.drawBitmap(mChessBW[0], mStartX + (i + 1)
& & & & & & & & & & & & & & & & * mWidth - (mChessDia && 1), mStartY
& & & & & & & & & & & & & & & & + (j + 1) * mWidth - (mChessDia && 1),
& & & & & & & & & & & & & & & & mPaint);
& & & & & & & & & & } else if (mChessTable[i][j] == WHITE) {
& & & & & & & & & & & & // 通过图片来画
& & & & & & & & & & & & canvas.drawBitmap(mChessBW[1], mStartX + (i + 1)
& & & & & & & & & & & & & & & & * mWidth - (mChessDia && 1), mStartY
& & & & & & & & & & & & & & & & + (j + 1) * mWidth - (mChessDia && 1),
& & & & & & & & & & & & & & & & mPaint);
& & & & & & & & & & }
& & & & & & & & }
& & & & & & }
& & private void putChess(int x, int y, int blackwhite) {
& & & & mChessTable[x][y] =
& & private boolean checkWin(int wbflag) {
& & & & for (int i = 0; i & GRID_SIZE - 1; i++)
& & & & & & for (int j = 0; j & GRID_SIZE - 1; j++) {
& & & & & & & & // 就是检查四条线,参见英国国旗
& & & & & & & & // 检测横轴五个相连
& & & & & & & & if (((i + 4) & (GRID_SIZE - 1))
& & & & & & & & & & & & && (mChessTable[i][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 1][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 2][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 3][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 4][j] == wbflag)) {
& & & & & & & & & & // Log.e(&check win or loss:&, wbflag + &win&);
& & & & & & & & & & mWinFlag =
& & & & & & & & }
& & & & & & & & // 纵轴5个相连
& & & & & & & & if (((j + 4) & (GRID_SIZE - 1))
& & & & & & & & & & & & && (mChessTable[i][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i][j + 1] == wbflag)
& & & & & & & & & & & & && (mChessTable[i][j + 2] == wbflag)
& & & & & & & & & & & & && (mChessTable[i][j + 3] == wbflag)
& & & & & & & & & & & & && (mChessTable[i][j + 4] == wbflag)) {
& & & & & & & & & & // Log.e(&check win or loss:&, wbflag + &win&);
& & & & & & & & & & mWinFlag =
& & & & & & & & }
& & & & & & & & // 左上到右下5个相连
& & & & & & & & if (((j + 4) & (GRID_SIZE - 1)) && ((i + 4) & (GRID_SIZE - 1))
& & & & & & & & & & & & && (mChessTable[i][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 1][j + 1] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 2][j + 2] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 3][j + 3] == wbflag)
& & & & & & & & & & & & && (mChessTable[i + 4][j + 4] == wbflag)) {
& & & & & & & & & & // Log.e(&check win or loss:&, wbflag + &win&);
& & & & & & & & & & mWinFlag =
& & & & & & & & }
& & & & & & & & // 右上到左下5个相连
& & & & & & & & if (((i - 4) &= 0) && ((j + 4) & (GRID_SIZE - 1))
& & & & & & & & & & & & && (mChessTable[i][j] == wbflag)
& & & & & & & & & & & & && (mChessTable[i - 1][j + 1] == wbflag)
& & & & & & & & & & & & && (mChessTable[i - 2][j + 2] == wbflag)
& & & & & & & & & & & & && (mChessTable[i - 3][j + 3] == wbflag)
& & & & & & & & & & & & && (mChessTable[i - 4][j + 4] == wbflag)) {
& & & & & & & & & & // Log.e(&check win or loss:&, wbflag + &win&);
& & & & & & & & & & mWinFlag =
& & & & & & & & }
& & & & & & }
& & & & if (mWinFlag == wbflag) {
& & & & & &
& & & & } else
& & & & & &
& & private boolean checkFull() {
& & & & int mNotEmpty = 0;
& & & & for (int i = 0; i & GRID_SIZE - 1; i++)
& & & & & & for (int j = 0; j & GRID_SIZE - 1; j++) {
& & & & & & & & if (mChessTable[i][j] != 0)
& & & & & & & & & & mNotEmpty += 1;
& & & & & & }
& & & & if (mNotEmpty == (GRID_SIZE - 1) * (GRID_SIZE - 1))
& & & & & &
& & & & else
& & & & & &
& & private void showTextView(CharSequence mT) {
& & & & this.mStatusTextView.setText(mT);
& & & & mStatusTextView.setVisibility(View.VISIBLE);
MMGobangActivity:
package com.example.gobang.
import com.example.gobang.R;
import android.app.A
import android.os.B
import android.view.W
import android.widget.TextV
//这是主程序,继承自Activity,实现onCreate方法。
public class MMGobangActivity extends Activity {
& & GobangView mGobangV
& & /** Called when the activity is first created. */
& & @Override
& & public void onCreate(Bundle savedInstanceState) {
& & & & super.onCreate(savedInstanceState);
& & & & // 隐藏标题栏
& & & & requestWindowFeature(Window.FEATURE_NO_TITLE);
& & & & setContentView(R.layout.gobang_mm);
& & & & mGobangView = (GobangView) this.findViewById(R.id.gameview);
& & & & mGobangView.setTextView((TextView) this.findViewById(R.id.text));
gobang_mm.xml
&?xml version=&1.0& encoding=&utf-8&?&
&FrameLayout
& & xmlns:android=&/apk/res/android&
& & android:orientation=&vertical&
& & android:layout_width=&fill_parent&
& & android:layout_height=&fill_parent&
& & &com.example.gobang.mm.GobangView
& & & & android:id=&@+id/gameview&
& & & & android:layout_width=&fill_parent&
& & & & android:layout_height=&fill_parent& /&
& & &RelativeLayout
& & & & android:layout_width=&wrap_content&
& & & & android:layout_height=&wrap_content& &
& & & & &TextView&
& & & & & & android:id=&@+id/text&&
& & & & & & android:visibility=&visible&&
& & & & & & android:layout_width=&wrap_content&
& & & & & & android:layout_height=&wrap_content&
& & & & & & android:gravity=&center_horizontal& /&
& & &/RelativeLayout&
&/FrameLayout&
gobang.xml
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
& & android:layout_width=&match_parent&
& & android:layout_height=&match_parent&
& & android:background=&@drawable/bg& &
& & &Button
& & & & android:id=&@+id/b_bt&
& & & & style=&@style/buttonstyle&
& & & & android:layout_centerHorizontal=&true&
& & & & android:layout_centerVertical=&true&
& & & & android:text=&@string/b_bt& /&
& & &Button
& & & & android:id=&@+id/b_mm&
& & & & style=&@style/buttonstyle&
& & & & android:layout_above=&@+id/b_bt&
& & & & android:layout_alignLeft=&@+id/b_bt&
& & & & android:layout_marginBottom=&30dp&
& & & & android:text=&@string/b_mm& /&
&/RelativeLayout&
strings.xml
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
& & &string name=&app_name&&GameDebug&/string&
& & &string name=&hello_world&&Hello world!&/string&
& & &string name=&menu_settings&&Settings&/string&
& & &string name=&b_mm&&人机对弈&/string&
& & &string name=&b_bt&&蓝牙对弈&/string&
& & &string name=&open&&打开&/string&
& & &string name=&close&&关闭&/string&
& & &string name=&visible&&可见&/string&
& & &string name=&search&&查找&/string&
& & &string name=&connect&&连接&/string&
& & &string name=&fire&&蓝牙对战&/string&
&/resources&
以上是所有的代码,好奇的同学们可以复制黏贴到你的eclipse中试一试了。当然,前提是你安装好了Android的开发环境了哈。
提示一下,要千万在Androidmainfest中对各个Activity进行注册。切记。标签:&&&&&&原文:http://blog.csdn.net/urtheappleinmyeye/article/details/
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!}

我要回帖

更多关于 五子棋雾化器多久换芯 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信