android 五子棋实验总结

来源:互联网 发布:金税三期软件服务热线 编辑:程序博客网 时间:2024/05/06 11:31

作者:郭涵川


      在这次的Android课堂实验中,我实现了五子棋游戏中的人机对战模式。在这次的实验中我遇到了很多困难,在克服这些困难的过程中学到了很多的知识,让我对Android有了更深层次的了解。


       五子棋游戏逻辑十分简单,可以明显的分为四个部分:白棋下、判断白棋是否获胜、黑棋下、判断黑棋是否获胜;在判断获胜的两个部分可以使用相同的方法,所以总结起来我们只需完成白棋下、黑棋下、判断获胜三个部分。而如果是人人对战模式,那么白棋下与黑棋下的实现逻辑将完全相同。所以我在选择实现顺序的时候选择先实现人机对战的模式来练习。


       我个人认为人机对战的实现相对于人人对战模式更加复杂,人机对战模式的实现相对于人人模式增加了游戏AI,而且仅仅是增加了游戏AI,所以在这个实现中对游戏AI的实现成为了重点。通过在网上的查找和总结,知道最通用的实现五子棋游戏AI的算法就是:根据五子棋游戏规则指定在不同情况下每个位置的权值,然后在Bot开始下棋时在地图上计算权值最大的位置即可。经过对五子棋游戏的简单研究,之后又在网上查找了相关算法的实现资料,自己实现了一个简单的五子棋算法。虽然不能有很高的AI不过已经可以达到初级玩家的水平。


       在实现游戏时,除了Bot下棋的算法,还有就是在棋盘上下棋这个过程。我首先是尝试了ImageView作为游戏棋盘的空间载体,但是在实现过程中发现,由于需要对棋盘图片做很多操作,由ImageView实现的棋盘很难满足我自己定制的方法,最后不得不放弃这个控件。经过在网上的查找,我最后通过继承ImageView这个控件,自己定义一个新的控件mapView,来满足自己的各种操作。

对地图的操作首先就是获得鼠标(手)点击的位置,因为mapView是继承自ImageView的自定义控件,所以可以直接重写ImageView的鼠标点击事件响应的




在这个方法中,可以添加对按下、抬起、移动三个事件的响应,在这里根据通常的五子棋游戏设计,我只实现了按下的事件响应,然后通过按下事件获得按下位置的(X,Y)坐标,之后通过换算成棋盘上的位置来实现下棋。除此之外,棋子的画法也是一个问题,在我的实现中我没有使用图片,而是重写了ImageView的画图方法:




       这个方法获得了ImageView的canvas,这样我们就可以利用canvas在mapView上画出想要的图形。因为五子棋都是圆形的,所以我们可以直接在相应的位置上画圆。

那么最后一个部分,就是判断游戏是否结束。这个判断的实现非常简单,就是在四个方向上(上下、左右、上左下右、上右下左)判断是否存在五个连续的棋子,如果有那么游戏就结束。对于这个验证方法不做过多介绍,我主要来说一下在已经判断出游戏结束的情况下,如何实现游戏界面的跳转。因为在之前的开发过程中,我都是使用点击事件来实现游戏界面的跳转,但是在这个问题中出现了一个问题,就是我判断游戏是否结束是在mapView类中实现的,而不是哪一个Activity中,所以无法拿到前一个Activity,无法实现跳转。在我查看ImageView源码时,我看到了ImageView构造函数中的Context类型对象,经过在网上的查找,发现它就是我日思夜想的对象,之后我重写了ImageView的三个构造函数:




之后,我就可以使用初始化过程中传过来的context来控制界面的跳转了。

       在实现了这些之后,我觉得五子棋游戏可以结束了。但是,在我想推出游戏的时候,我发现按返回按钮,它会一层一层的返回上层界面,这显然不是一个游戏应该有的结束方式。之后,我在网上查找,发现Android有一个堆栈,存放每一个Activity,所以按返回的过程就是堆栈弹出栈的过程。在网上查找之后,我找到了只要在跳转之后加上语句





原创粉丝点击