/** * 合并相同的Item * * @param row */ private void mergeItem(List<Game2048Item> row) { if (row.size() < 2) return; for (int j = 0; j < row.size() - 1; j++) { Game2048Item item1 = row.get(j); Game2048Item item2 = row.get(j + 1); if (item1.getmNumber() == item2.getmNumber()) { isMergeHappen = true; int val = item1.getmNumber() + item2.getmNumber(); item1.setmNumber(val); // 加分 mScore += val; if (mGame2048Listener != null) { mGame2048Listener.onScoreChange(mScore); } // 向前移动 for (int k = j + 1; k < row.size() - 1; k++) { row.get(k).setmNumber(row.get(k + 1).getmNumber()); } row.get(row.size() - 1).setmNumber(0); return; } } }
/** 产生一个数字 */ public void generateNum() { if (checkOver()) { Log.e("TAG", "GAME OVER"); if (mGame2048Listener != null) { mGame2048Listener.onGameOver(); } return; } if (!isFull()) { if (isMoveHappen || isMergeHappen) { Random random = new Random(); int next = random.nextInt(16); Game2048Item item = mGame2048Items[next]; while (item.getmNumber() != 0) { next = random.nextInt(16); item = mGame2048Items[next]; } item.setmNumber(Math.random() > 0.75 ? 4 : 2); isMergeHappen = isMoveHappen = false; } } }
/** 根据用户运动,整体进行移动合并值等 */ private void action(ACTION action) { // 行|列 for (int i = 0; i < mColumn; i++) { List<Game2048Item> row = new ArrayList<Game2048Item>(); // 行|列 // 记录不为0的数字 for (int j = 0; j < mColumn; j++) { // 得到下标 int index = getIndexByAction(action, i, j); Game2048Item item = mGame2048Items[index]; // 记录不为0的数字 if (item.getmNumber() != 0) { row.add(item); } } // 判断是否发生移动 for (int j = 0; j < mColumn && j < row.size(); j++) { int index = getIndexByAction(action, i, j); Game2048Item item = mGame2048Items[index]; if (item.getmNumber() != row.get(j).getmNumber()) { isMoveHappen = true; } } // 合并相同的 mergeItem(row); // 设置合并后的值 for (int j = 0; j < mColumn; j++) { int index = getIndexByAction(action, i, j); if (row.size() > j) { mGame2048Items[index].setmNumber(row.get(j).getmNumber()); } else { mGame2048Items[index].setmNumber(0); } } } // 生成数字 generateNum(); }
/** * 检测当前所有的位置都有数字,且相邻的没有相同的数字 * * @return */ private boolean checkOver() { // 检测是否所有位置都有数字 if (!isFull()) { return false; } for (int i = 0; i < mColumn; i++) { for (int j = 0; j < mColumn; j++) { int index = i * mColumn + j; // 当前的Item Game2048Item item = mGame2048Items[index]; // 右边 if ((index + 1) % mColumn != 0) { Log.e("TAG", "RIGHT"); // 右边的Item Game2048Item itemRight = mGame2048Items[index + 1]; if (item.getmNumber() == itemRight.getmNumber()) return false; } // 下边 if ((index + mColumn) < mColumn * mColumn) { Log.e("TAG", "DOWN"); Game2048Item itemBottom = mGame2048Items[index + mColumn]; if (item.getmNumber() == itemBottom.getmNumber()) return false; } // 左边 if (index % mColumn != 0) { Log.e("TAG", "LEFT"); Game2048Item itemLeft = mGame2048Items[index - 1]; if (itemLeft.getmNumber() == item.getmNumber()) return false; } // 上边 if (index + 1 > mColumn) { Log.e("TAG", "UP"); Game2048Item itemTop = mGame2048Items[index - mColumn]; if (item.getmNumber() == itemTop.getmNumber()) return false; } } } return true; }