O algoritmo anterior é muito agradável: é muito simples e muito rápido de implementar, mas infelizmente, é também bastante errado! Em alguns casos, nunca para, o que é obviamente ruim. Se não acredita, simplesmente copie e cole o seu código anterior e aperte no botão executar. O primeiro mundo deste exercício é uma destas situações infelizes que deixam endoidar o algoritmo anterior.
Portanto temos que encontrar outro algoritmo, preferencialmente um que funcione em todos os casos.
Para isto, a melhor solução é começar de um algoritmo bem conhecido ao invés de tentar inventar um novo do zero como fizemos. Quando pensa um pouco sobre este problema, ele pode ser muito similar a um problema de ordenação: apenas se certifique de que todos os jogadores estão ordenados pelas cores deles. E enquanto fazemos isto, vamos generalizar o jogo para poder ter mais de 4 bases.
Vamos adaptar o selection sort para nossa situação. As linhas grandes do algoritmo se tornam "para cada base, selecione os jogadores que devem ocupar esta base e garanta que eles venham às posições deles". Desta forma, vamos aumentar uma área ordenada onde todos os jogadores já estão ordenados (e nunca deixam de estar) enquanto a área não-ordenada se reduz.
Selecionar o jogador não deve ser um problema; Não hesite para definir
alguns métodos como findPlayer()
ou
findPlayerBase()
. Isto vai garantir que o seu código permaneça
entendível.
O aspeto mais problemático é mover os jogadores selecionados para as posições deles. Para isto, tem que mover o espaço vazio à posição onde o jogador está e depois mover ambos os jogadores e o espaço vazio à base que estiver próxima do objetivo do jogador (provavelmente com um loop) e finalmente pôr o jogador na posição correta da base favorita dele.
Como é comum em programação, o diabo esconde-se nos detalhes: existe um conjunto de casos particulares que deve detetar e lidar corretamente, como os casos onde o jogador já está na base (mas não na posição que gostaria), ou quando o buraco está à direita do jogador (provavelmente quando ordena a primeira base). Mas vai caçar tais coisas enquanto depurar o seu código.