Android开发入门:三子棋游戏

feature

这篇博客将教大家在Android平台上写简单的三子棋游戏,需要用到的知识有,Android基本按钮控件的使用,Android表格布局,很多基本的知识也会用在实现三子棋和评估算法上。

首先在开始动手之前先梳理一下大致思路,要想写出这样的界面,首先需要棋盘,可以用3×3的9个按钮来组成,用户按下后,按钮上面就会显示 “O” 或者 “X” ,之后写出相应评估输赢和平局的函数,这样每次用户放过旗子之后,都运行一次评估函数来检测是否游戏结束,如果结束的话就显示赢家,还需要一个按钮来重置游戏。

Screen Shot 2016-01-20 at 5.07.01 PM

棋盘

整个项目的逻辑代码应该被单独保存在一个类里面,这里我将他命名为 Board ,也就是棋盘类,这个类应该被当做游戏的逻辑控制类,保存棋盘当前的状况,知道当前的玩家是谁,评估游戏的输赢,都是这个类来完成。

具体怎么实现呢,我的方法是这样的,整个棋盘的状态使用一个3×3的二维数组来保存,初始时候元素的9个元素都是0。

emptyboard

当玩家1下子后,落子的元素就更新为1,当玩家2下子后元素则更新为5来区分。这样一切就变得方便了,评估输赢的时候,程序只要判断 二维数组的每一行的元素和,每一列的元素和,和两个对角线的元素和的值就可以得出结果,如果和是3的话,就代表玩家1连成了3个子,如果和是15,则代表玩家2连成了三个子。

Untitled-1

经过刚在的讲述,那么这个类应该具有已下元素。

  • 一个二维数组,用来储存当前棋盘状况
  • 一个计数器,初始化为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来区分。

Layout

动态生成部这个局的代码:

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方法,当按钮点击后应该做以下的事情

  1. 调用Board类实例的 placePiece 方法
  2. 检查游戏状态,这个函数也在棋盘类里
  3. 如果游戏结束,更新TextView显示赢家

具体代码可以到这里看 :点击进入

以上就是开发这个三子棋游戏大概的过程,可以看出我这样编写代码使得业务层和逻辑层是分开的,这样的好处就是代码会变得模块化,便于维护。
有游戏编写经验的人会发现,棋盘类就像游戏的控制器(GM)一样 (游戏开发者一般会写一个GameManager类来控制整个游戏的公共部分),掌控所有的游戏逻辑,更细棋盘的数组,评估棋盘,测算当前的玩家。
而更新界面和点击事件的代码就是保存在MainActivity类中,这个类只用来控制GUI和用户交互。

大家可以去我的GitHub查看整个工程的详细的代码:点击进入

之后的文章将会编写这个游戏的AI,到时候就可以体现出编写出一个棋盘类是多麽的方便了。

打赏

Leave a Reply

Your email address will not be published. Required fields are marked *