Не понял, что не удовлетворяет валидатор. При попытке проверить код, получаю сообщение:
"Проверь, что метод onKeyPress(Key) завершается сразу после вызова метода gameOver(). "
@Override
public void onKeyPress(Key key){
if (!isGameStopped){
// SKIP
if (!canUserMove()){
gameOver();
return;
}
}
}
флаг isGameStopped принимает значение true и не сможет измениться. Наличие или отсутствие return не изменяет поведение валидатора.package com.javarush.games.game2048;
import com.javarush.engine.cell.*;
public class Game2048 extends Game{
private static final int SIDE=4;
private int[][] gameField=new int[SIDE][SIDE];
private boolean isGameStopped=false;
@Override
public void onKeyPress(Key key){
if (!isGameStopped){
if (key==Key.LEFT){
moveLeft();
drawScene();
}
if (key==Key.RIGHT){
moveRight();
drawScene();
}
if (key==Key.UP){
moveUp();
drawScene();
}
if (key==Key.DOWN){
moveDown();
drawScene();
}
if (!canUserMove()){
gameOver();
return;
}
}
}
private boolean canUserMove(){
boolean lZeroCell=false;
boolean lEqCell=false;
for(int i=0;i<SIDE;i++){
for (int j=0;j<SIDE;j++){
if (gameField[i][j]==0){
return true;
}
}
}
for (int i=0;i<(SIDE-1);i++){
for (int j=0;j<(SIDE-1);j++){
if ((gameField[i][j]==gameField[i+1][j]) ||
(gameField[i][j]==gameField[i][j+1])){
return true;
}
}
}
if ((gameField[SIDE-1][SIDE-1]==gameField[SIDE-1][SIDE-2]) ||
(gameField[SIDE-1][SIDE-1]==gameField[SIDE-2][SIDE-1])){
return true;
}
return false;
}
private void win(){
showMessageDialog(Color.RED,"YOU WIN!!!",Color.WHITE,50);
isGameStopped=true;
}
private void gameOver(){
showMessageDialog(Color.BLACK,"GAME OVER!!!",Color.RED,50);
isGameStopped=true;
}
private int getMaxTileValue(){
int max=gameField[0][0];
for (int i=0;i<SIDE;i++){
for (int j=0;j<SIDE;j++){
if (max<gameField[i][j]){
max=gameField[i][j];
}
}
}
return max;
}
private void rotateClockwise(){
int[][] newArr=new int[SIDE][SIDE];
for (int i=0;i<SIDE;i++){
for (int j=0;j<SIDE;j++){
newArr[i][j]=gameField[(SIDE-1)-j][i];
}
}
for (int i=0;i<SIDE;i++){
for (int j=0;j<SIDE;j++){
gameField[i][j]=newArr[i][j];
}
}
}
private void rotateCounterClockwise(){
int[][] newArr=new int[SIDE][SIDE];
for (int i=0;i<SIDE;i++){
for (int j=0;j<SIDE;j++){
newArr[i][j]=gameField[j][(SIDE-1)-i];
}
}
for (int i=0;i<SIDE;i++){
for (int j=0;j<SIDE;j++){
gameField[i][j]=newArr[i][j];
}
}
}
private void moveRight(){
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
}
private void moveLeft(){
boolean moved=false;
boolean[][] change=new boolean[SIDE][3];
for(int iRow=0;iRow<gameField.length;iRow++){
change[iRow][0]=compressRow(gameField[iRow]);
change[iRow][1]=mergeRow(gameField[iRow]);
change[iRow][2]=compressRow(gameField[iRow]);
moved=moved || change[iRow][0] || change[iRow][1] || change[iRow][2];
}
if (moved){
createNewNumber();
}
}
private void moveUp(){
rotateClockwise();
rotateClockwise();
rotateClockwise();
moveLeft();
rotateClockwise();
}
private void moveDown(){
rotateClockwise();
moveLeft();
rotateClockwise();
rotateClockwise();
rotateClockwise();
}
private void createGame(){
createNewNumber();
createNewNumber();
}
private boolean mergeRow(int[] row){
boolean change=false;
int i=0;
while(i<(row.length-1)){
if((!(row[i]==0)) && (row[i]==row[i+1])){
row[i]=row[i]+row[i+1];
row[i+1]=0;
i++;
change=change || true ;
}
i++;
}
return change;
}
private boolean compressRow(int[] row){
boolean change=false;
int c;
for(int i=0;i<(row.length-1);i++){
if((row[i]==0) && (row[i+1]!=0)){
change=true;
c=row[i];
row[i]=row[i+1];
row[i+1]=c;
}
}
if (change){
change=compressRow(row) || change;
}
return change;
}
private Color getColorByValue(int value){
Color[] clColorTable= {
Color.BLACK, Color.BLUE, Color.CYAN, Color.RED,
Color.GREEN, Color.MAGENTA, Color.YELLOW, Color.GRAY,
Color.ORANGE, Color.PINK, Color.WHITE, Color.LIGHTGRAY
};
int clrIndex=0;
if (!(value==0)){
while (!((value >> ++clrIndex)==1)){
;
}
}
return clColorTable[clrIndex];
}
private void setCellColoredNumber(int x,int y, int value){
setCellValueEx(x,y,getColorByValue(value),(value==0)?"":Integer.toString(value));
}
private void createNewNumber(){
if (getMaxTileValue()==2048){
win();
} else {
if (!canUserMove()){
int x;
int y;
do{
x=getRandomNumber(SIDE);
y=getRandomNumber(SIDE);
} while(!(gameField[y][x]==0));
gameField[y][x]=(getRandomNumber(10)==9)?4:2;
}
}
}
private void drawScene(){
for(int x=0;x<SIDE;x++){
for(int y=0;y<SIDE;y++){
setCellColoredNumber(x,y,gameField[y][x]);
}
}
}
@Override
public void initialize(){
setScreenSize(SIDE,SIDE);
createGame();
drawScene();
}
}