Seu algoritmo funciona, mas realmente está muito grande e com muita repetição de código, também acredito que a ideia é criar algo mais orientado à objetos, não sei se você pode trabalhar com vetores mas seria bom em vez de ficar repetindo e inicializando variáveis para substituir o vetor.
Segue o código:
Classe Mesa(Representando uma Mesa):
public class Mesa {
private boolean[] lugares; //vetor com os lugares da mesa
public Mesa() //construtor inicializa a mesa com os lugares desocupados
{
lugares = new boolean[6];
}
public void setOcupado(int l)//seta um lugar da mesa como ocupado
{
if(!lugares[l])
{
lugares[l] = true;
}
}
public int Length() //retorna o número de lugares da mesa
{
return lugares.length;
}
public int numeroDeReservas() //retorna o número de lugares reservados na mesa
{
int aux = 0;
for(int i = 0; i < lugares.length; i++)
{
if(lugares[i])
{
aux++;
}
}
return aux;
}
public boolean isFull() //retorna se a mesa está com todos os lugares ocupados
{
int aux = 0;
for(int i = 0; i < lugares.length; i++)
{
if(lugares[i])
{
aux++;
}
}
if(aux == lugares.length)
{
return true;
}
return false;
}
public boolean getOcupacao(int l) //verifica se um lugar está ocupado ou livre
{
return new Boolean(lugares[l]);
}
public String toString() //metodo toString() da classe
{
String form = "";
for(int i = 0; i < lugares.length; i++)
{
form += "Lugar "+(i+1)+": "+((lugares[i])? "ocupado" : "livre") + "\n";
}
return form;
}
}
Classe Casa(Representando uma Casa de Espetáculos):
public class Casa {
private Mesa[] mesas;//vetor com as mesas
public Casa()// construtor, inicializa 40 mesas
{
mesas = new Mesa[40];
for(int i = 0; i < mesas.length; i++)
{
mesas[i] = new Mesa();
}
}
public boolean fazerReserva(int mesa, int lugares)//faz a reserva na mesa com o número de lugares especificado, retorna true se reservou ou false se não reservou
{
if(mesa <= 0 || mesa > 40) //se o número da mesa estiver fora da escala de mesas retorna false
return false;
else if(lugares <= 0 || lugares > 6)// se o número de lugares desejados for menor ou igual a 0, ou mais que 6 em uma mesa, retorna false
return false;
Mesa m = mesas[mesa-1]; //pega a mesa desejada do vetor
if(m.isFull()) //se ela estiver cheia não reserva
{
return false;
}
else
{
int[] aux = new int[m.Length()]; //vetor auxiliar
for(int i = 0; i < aux.length; i++) //inicializa o vetor auxiliar com -1
{
aux[i] = -1;
}
int aux2 = 0; //variável auxiliar
for(int i = 0; i < m.Length(); i++)
{
if(aux2 == lugares) //se variável auxiliar tem o mesmo número que lugares significa que a mesa tem o número de lugares desejados
{
break;
}
else
{
if(!m.getOcupacao(i)) //verifica se o lugar especificado está livre
{
aux[i] = i; //salva no vetor a posição da mesa
aux2++; //incrementa variável auxiliar
}
}
}
if(lugares == aux2) //se o número de lugares for o mesmo que o número de cadeiras desocupadas, reserva
{
for(int i = 0; i < aux.length; i++) //percorre o vetor auxiliar
{
if(aux[i] != -1) //se o número que o vetor auxiliar possui for diferente de -1
{
m.setOcupado(aux[i]); //significa que o vetor possui a posição desejada na mesa, então reserva
}
}
//após reservar os lugares, retorna true
return true;
}
return false; //se a mesa não dispor do número de lugares desejados não reserva
}
}
public String toString()//método toString() da classe
{
String form = "";
for(int i = 0; i < mesas.length; i++)
{
form += "Mesa "+(i+1)+":"+"\n";
form += mesas[i].toString();
}
return form;
}
}
Classe App(Representando a classe Aplicação do programa):
import javax.swing.JOptionPane;
public class App {
public static void main(String[] args)
{
Casa c = new Casa();
int mesa = -1; //valor aleatório diferente de 0 para não encerrar o programa
int lugares;
do
{
try
{
mesa = Integer.parseInt(JOptionPane.showInputDialog("Digite a mesa que desejas fazer a reserva:"));
if(mesa == 0)
{
JOptionPane.showMessageDialog(null, "Fim do Programa");
continue;
}
lugares = Integer.parseInt(JOptionPane.showInputDialog("Digite a quantidade de lugares desejados:"));
if(c.fazerReserva(mesa, lugares))
{
JOptionPane.showMessageDialog(null, "Mesa "+mesa+" com "+lugares+" lugares reservados.");
}
else
{
JOptionPane.showMessageDialog(null, "Não foi possível realizar a reserva.");
}
}catch(NumberFormatException nfex)
{
JOptionPane.showMessageDialog(null, "Você deve inserir números para reservar os lugares.");
}
}while(mesa != 0);
}
}
Na classe App segui o exemplo do exercício que você passou e utilizei JOptionPane, não sei se é isso que você precisa.
Obs.: Tem um método na classe Mesa que não foi utilizado, o numeroDeReservas() que retorna o número de reservas de uma mesa, mas acabei deixando ele ali.
Qualquer dúvida sobre o código ou problema posta aí.