2016-05-31 2 views
-3

Я пишу небольшой проект на Java, который похож на игру 2048 года, которая в значительной степени основана только на манипуляции с массивами. Я написал решение проблемы, которая у меня была, и она отлично работает, однако код невероятно запутан. Если кто-нибудь может помочь с его очисткой, возможно, используя другую технику или что-то в этом роде, это всего лишь несколько утверждений.Java - Очистка много операторов if

// This bit gets rid of the empty tiles between numbers. 
    // Eg {2,2,0,4} becomes {2,2,4,0}. 
    for(int i =1; i<row.length; i++) { 

     if(row[i-1] == 0) 
     { 
      row[i-1] = row[i]; 
      row[i] = 0; 
     } 
    } 

    for(int j=row.length-1; j>=1; j--) { 
     if(row[j-1] == 0) { 
      row[j-1] = row[j]; 
      row[j] = 0; 
     } 
    } 

    int nonEmpty = 0; // Count the number of non empty tiles 
    for(int i=0; i<row.length; i++) { 
     if(row[i] != 0) 
      nonEmpty++; 
    } 

    if(nonEmpty == 2) { 
     if(row[1] == row[0]) { 
      row[0] *= 2; 
      row[1] = 0; 
     } 
    } 
    else if(nonEmpty == 3) { 
     if(row[1] == row[0]) { 
      row[0] *= 2; 
      row[1] = row[2]; 
      row[2] = 0; 
     } 
     else if(row[2] == row[1]) { 
      row[1] *= 2; 
      row[2] = 0; 
     } 
    } 
    else if(nonEmpty==4) { 
     if(row[1] == row[0]) { 
      row[0] *= 2; 
      row[1] = 0; 

      if(row[2] == row[3]) { 
       row[2] *= 2; 
       row[3] = 0; 
      } 
     } 
     else if(row[2] == row[1]) { 
      row[1] *= 2; 
      row[2] = row[3]; 
      row[3] = 0; 
     } 
     else if(row[3] == row[2]) { 
      row[2] *= 2; 
      row[3] = 0; 
     } 

    } 

    // Get rid of 0s between numbers again. 
for(int i =1; i<row.length; i++) { 

     if(row[i-1] == 0) 
     { 
      row[i-1] = row[i]; 
      row[i] = 0; 
     } 
    } 

    for(int j=row.length-1; j>=1; j--) { 
     if(row[j-1] == 0) { 
      row[j-1] = row[j]; 
      row[j] = 0; 
     } 
    } 

Каждое утверждение if/else if имеет решающее значение, поскольку оно заботится обо всех ситуациях. Я не прошу кого-нибудь пройти и очистить все, но если бы у меня были просто какие-то указатели или примеры, которые были бы замечательными.

Спасибо, ребята

+1

Выглядит хорошо для меня. Неважно, сколько у вас/else/условных операторов. – Li357

+0

да, выглядит довольно круто для меня тоже – Leo

+0

Вы можете использовать 'swtich()' вместо всех операторов if-else if – Aradhna

ответ

1

Попробуйте

void set(int indexFrom, int... values) { 
    for (int v : values) 
     row[indexFrom++] = v; 
} 

И перепишем

if(row[1] == row[0]) { 
    row[0] *= 2; 
    row[1] = row[2]; 
    row[2] = 0; 
} 
else if(row[2] == row[1]) { 
    row[1] *= 2; 
    row[2] = 0; 
} 

в

if (row[1] == row[0]) 
    set(0, row[0] * 2, row[2], 0); 
else if (row[2] == row[1]) 
    set(1, row[1] * 2, 0);