紧接着上一章,我们说到了要把卡片部署到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());
}
}
}
这些主要实现了卡片类的部署以及相关功能。其主要核心功能在下节会详细说明。