小项目:三子棋
这篇博客将教大家在Android平台上写简单的三子棋游戏,需要用到的知识有,Android基本按钮控件的使用,Android表格布局,很多基本的知识也会用在实现三子棋和评估算法上。
首先在开始动手之前先梳理一下大致思路,要想写出这样的界面,首先需要棋盘,可以用3×3的9个按钮来组成,用户按下后,按钮上面就会显示 “O” 或者 “X” ,之后写出相应评估输赢和平局的函数,这样每次用户放过旗子之后,都运行一次评估函数来检测是否游戏结束,如果结束的话就显示赢家,还需要一个按钮来重置游戏。
棋盘
整个项目的逻辑代码应该被单独保存在一个类里面,这里我将他命名为 Board ,也就是棋盘类,这个类应该被当做游戏的逻辑控制类,保存棋盘当前的状况,知道当前的玩家是谁,评估游戏的输赢,都是这个类来完成。
具体怎么实现呢,我的方法是这样的,整个棋盘的状态使用一个3×3的二维数组来保存,初始时候元素的9个元素都是0。
当玩家1下子后,落子的元素就更新为1,当玩家2下子后元素则更新为5来区分。这样一切就变得方便了,评估输赢的时候,程序只要判断 二维数组的每一行的元素和,每一列的元素和,和两个对角线的元素和的值就可以得出结果,如果和是3的话,就代表玩家1连成了3个子,如果和是15,则代表玩家2连成了三个子。
经过刚在的讲述,那么这个类应该具有已下元素。
- 一个二维数组,用来储存当前棋盘状况
- 一个计数器,初始化为1,每次下子后自加1。这样只要将计数器的值与2进行模运算就可以知道当前的玩家是谁,0是玩家2,1是玩家1.
- 评估函数
- 得到当前玩家的函数
- 下子的函数,用被调用来更新二维数组
这样的话,每新建一次游戏就实例化一个Board的对象就可以了。
以下是这个类的框架。具体代码可以到这里看 :点击进入
public class Board { int[][] gameBoardArr=new int[3][3]; private int playCounter=1; public boolean gameOver = false; public void placePiece(int position){} public int getCurrentPlayer() {} public int getGameResult(){} public List getAvailableSlots(){} }
用户界面实现
棋盘布局
开始时候提到棋盘用3×3的9个按钮控件完成,就像一个表格一样,所以可以使用Android的TableLayout表格布局来当做这9个按钮控件的父布局,并且要为每一个按钮添加一个标志,这样的话,用户按下按钮之后游戏才能知道用户按下了哪个键,从而得出下子的位置。
那么怎么样来区分这9个不同的按钮呢?这个时候就应该使用 setTag函数来为按钮来添加标签,在初始化生成9个按钮的时候分别为这9个按钮添加标签1-9来区分。
动态生成部这个局的代码:
private void initGameBoard(){ mTableLayout= (TableLayout) findViewById(R.id.table_layout); int counter = 1; for(int row=0;row<3;row++) { TableRow tableRow=new TableRow(this); for(int col=0;col<3;col++) { Button button=new Button(this); button.setTag(counter); button.setOnClickListener(this); tableRow.addView(button); counter++; } mTableLayout.addView(tableRow, new TableLayout.LayoutParams(FP, WC)); } }
刚在在写棋盘类的时候有 public void placePiece(int position) 方法,这个方法就是传进去当前按钮的Tag就可以下出相应的棋子了。
之后就是简单地编写点击事件的Listener接口,重写onClick方法,当按钮点击后应该做以下的事情
- 调用Board类实例的 placePiece 方法
- 检查游戏状态,这个函数也在棋盘类里
- 如果游戏结束,更新TextView显示赢家
具体代码可以到这里看 :点击进入
以上就是开发这个三子棋游戏大概的过程,可以看出我这样编写代码使得业务层和逻辑层是分开的,这样的好处就是代码会变得模块化,便于维护。
有游戏编写经验的人会发现,棋盘类就像游戏的控制器(GM)一样 (游戏开发者一般会写一个GameManager类来控制整个游戏的公共部分),掌控所有的游戏逻辑,更细棋盘的数组,评估棋盘,测算当前的玩家。
而更新界面和点击事件的代码就是保存在MainActivity类中,这个类只用来控制GUI和用户交互。
大家可以去我的GitHub查看整个工程的详细的代码:点击进入。
之后的文章将会编写这个游戏的AI,到时候就可以体现出编写出一个棋盘类是多麽的方便了。