我的机器上安装了包括最新版在内的好几个版本的SDK,其中包括我现在手机以及以前手机(2.2)的版本。这样能应用能在大多数设备上运行。这里的最低版本我选择了2.2。
下一步,我创建了一些文件,没有太多需要注意的地方。我在创建项目的时候犯了点小错误,项目名不太对。我已经在一个xml文件里修正了这个问题,不过最终决定不在整个项目里都进行修改(部分原因是我已经在GitHub上用这个名字创建了一个项目)。
我做的下一件事情是设计应用的布局。我的文件是自动生成的,文件名为main.xml,位于res文件夹下的layout子文件夹。也许在Eclipse的项目里它可能叫别的名字,但是应该是一个孤零零的文件在那个子文件夹里(译注:Eclipse通常为res/layout/activity_main.xml)。
Idea拥有一个非常好用的UI设计工具(Eclipse也有类似的工具),这让UI设计变得非常好上手。我最终的效果如下:
我也修改了AndroidManifest.xml文件(位于项目的根目录)来防止这个应用程序旋转成横向的。在Activity标签里添加如下代码:
当你开始一个新的Android项目时,你可能看到一个如下的java文件(为了减少错误和格式):
我们的第一个工作点是如何确定如果去表示游戏的各种状态。所以为了做到这一点,我们需要建立一些具体的数值;这里只有两种角色(X和O),放置在一个3X3的画板上,网格中只有X,O或者空白。
另一个种替代使用char数组的方式是使用枚举类型,不过这里为了简单先使用char数组。同样我也可以使用枚举的确定谁是轮到
现在我们知道了如何表示游戏的状态了,我们要弄清楚如果现在人与游戏的交互。具体代码实现上,我已经决定通过使用多个在同一TableLayout(表格布局)中的Button和一个在外部的表示开始有些的Button。
我决定首先要实现每个Button都是可交互的;改变Button上的文字和当点击事具体要做的响应。写代码实际上比我想的要更为复杂。最初我以为会有一个简单的调用来获得元素TableLayout在某一个,有点像getViewAt(int x,int y)但是没有。这是因为TableLayout可以包含不在行和列中的数据。它能够在下方或者在两个普通的TableRows中间包含一个EditText元素。
实际上可能会派上用场,当你思考布局时,这样的设计就是情理之中,这意味着你可以朝网格的不同部分延伸。
所以为了得到每个Button的,我们不得不查看每个TableRow对象所包含的Button,同时使用他们的y和x的position值分别做为y和x轴的坐标值。
我马上就会解释PlayOnClick,怎样通过代码绑定tableLayout,遍历它的子控件以及遍历它子控件的子控件,并设置点击事的处理。我需要通过编写我的TableLayout同时给它一个ID,为的是我们能通过findViewById()找到他。我在xml文件中简单的设置android:id属性如下:
PlayOnClick是我为了这个项目自动的OnClickListener的实现。我可以创建九个不同的方法(每个方法对应一个Button),同时是着每个Button的,但是通过实现OnClickListener动态的设置每个button的使用是最好的选择,没有之一。
如果现在运行此程序,它是可玩的,尽管没有任何得分统计和获胜检查。而且,“新游戏”按钮没有作用,让我们改变这种状况。
使用 UI 编辑器,我设置了“新游戏”按钮来调用相应的方法,现在,当我点击它,网格将被清除。 同时我也在 onCreate() 方法中添加了对 resetButtons() 的调用,确保所有的按钮都被绑定。
现在,如何进行获胜检查呢?恩,我知道,只要一条线个格匹配,则玩家胜利。因此,我们应该编写一个计算方法,并在合适的地方调用。
下面是我用来检测玩家是否已经赢得游戏的方法实现,支持各种格子数的游戏。当然还可以改进为只剩下单循环,但是理解起来就非常有难度:
当有玩家获胜时,disableButtons()方法简单地禁用棋盘上所有的按钮,这样就能玩家继续玩下去。
推荐: