Android&java的成长之路之六(2048小游戏②)

紧接着上一章,我们说到了要把卡片部署到GridLayout上。我们玩正规的2048游戏的时候,看上去是卡片移动来叠加数字,实则不然,它只是添加了动画效果,其实是之前已经全部铺满地卡片,只是能够重叠的时候数字发生了改变而已。接下来说下添加卡片的方法:

这个方法主要写在GameView类中的:

    //改变布局的宽高
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        int cardWidth = (Math.min(w, h) - 10) / 4;//得到每一张卡片的宽高
        addCards(cardWidth, cardWidth);
        startGame();
    }

    //添加卡片
    private void addCards(int cardWidth, int cardHeight) {
        Card c;
        for (int y = 0; y < 4; y++) {
            for (int x = 0; x < 4; x++) {
                c = new Card(getContext());
                c.setNum(0);
                addView(c, cardWidth, cardHeight);
                cardMap[x][y] = c;
            }
        }
    }

其中 addCards()函数是简单的添加 但是并没有限制每一张卡片的宽高  所以在onSizeChanged函数中 获得GridLayout这个控件的宽高,用来得出每一张卡片的边长。

卡片添加成功之后就可以开始游戏了 就是startGame函数:

    //开始游戏
    private void startGame() {
        MainActivity.getMainActivity().clearScore();
        for (int y = 0; y < 4; y++) {
            for (int x = 0; x < 4; x++) {
                cardMap[x][y].setNum(0);
            }
        }
        //随机添加两个卡片
        addRandomNum();
        addRandomNum();
    }
开始游戏的时候又要随机添加两张卡片(addRandomNum)  这玩过2048的都懂得:

 //添加随机数字并且只添加一张卡片
    private void addRandomNum() {
        emptyPoints.clear();
        for (int y = 0; y < 4; y++) {
            for (int x = 0; x < 4; x++) {
                if (cardMap[x][y].getNum() <= 0) {
                    emptyPoints.add(new Point(x, y));
                }
            }
        }
        Point p = emptyPoints.remove((int) (Math.random() * emptyPoints.size()));
        cardMap[p.x][p.y].setNum(Math.random() > 0.1 ? 2 : 4);
        setCardBGColor();
    }


当然了 这些步骤实现的时候还要有很多的变量和辅助功能性的函数:

用来存放每张卡片的数字 :

private Card[][] cardMap = new Card[4][4];//用来存放每张卡片
    private List<Point> emptyPoints = new ArrayList<>();

还有函数:

   //循环遍历 然后根据每个卡片的数字来设置背景颜色
    private void setCardBGColor() {
        for (int x = 0; x < 4; x++) {
            for (int y = 0; y < 4; y++) {
                cardMap[x][y].setBGColor(cardMap[x][y].getNum());
            }
        }
    }

这些主要实现了卡片类的部署以及相关功能。其主要核心功能在下节会详细说明。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值