Dividindo ruas monopolistas em grupos

5

Sou novo na programação orientada a objetos, no java e na programação em geral, e como meu primeiro projeto real estou tentando programar o jogo de tabuleiro Monopólio.

O que eu tenho até agora é uma matriz que pode armazenar objetos da classe Square (que tem várias subclasses, como propriedades, ferrovias, cartões de chance etc.). Os objetos dos jogadores se revezam ao se moverem no tabuleiro, chamando um método landedOn () para qualquer quadrado em que aterrissem. As propriedades podem ser marcadas com um proprietário e, portanto, esse proprietário receberá dinheiro se alguém pousar em sua propriedade.

Tudo está indo bem até agora, mas há uma coisinha que me incomoda. Não tenho certeza sobre como dividir elegantemente as casas em grupos ou cores. Há alguns grupos de ruas no tabuleiro e você só pode comprar casas se possuir todas as propriedades do grupo. Eu posso imaginar como programar isso, mas a solução parece um pouco suja e "não geral" para mim. Como faço uma boa solução geral?

Para limpar: Quero poder verificar se todas as propriedades de um tipo são de propriedade do mesmo player, de modo geral, para que, se os grupos forem alterados, uma propriedade seja adicionada ou um grupo de alterações, etc. Eu não teria que mudar muito código.

    
por zxz 10.06.2013 / 23:17
fonte

2 respostas

4

A resposta mais elegante é provavelmente um Enum .

Crie um valor enum para cada grupo de cores, e quando você criar seu objeto Property (que herda de Square ), passe o grupo de cores como um parâmetro construtor (já que é um obrigatório valor para ter um Property válido). Railroad , Utility e similares não aceitam esse parâmetro, pois não têm grupos e também herdam diretamente de Square (não Property ). *

Para verificar se um jogador tem todas as propriedades de um determinado grupo, você pode usar um Expressão lambda se você estiver usando o Java 8, ou simplesmente ter um loop foreach ao longo das linhas

for (property: allProperties)
{
   if (property.getGroup() == targetGroup && property.getOwner() != targetOwner) return false;
}
return true;

* Também seria válido ter uma classe GroupedSquare entre Property e Square , com Railroad e Utility herdando também e passando um valor enum codificado, mas acho que menos elegante.

    
por 10.06.2013 / 23:57
fonte
2

Uma alternativa a um enum de Bobson pode ser ter os grupos como objetos independentes. Por isso, você não precisa fazer uma iteração sobre todas as cadeias para ver se um grupo omplte, mas pode verificar apenas o grupo individual. No Pseudocódigo, a implementação pode ser assim:

class Group {
    Set<Road> roads;

    bool hasAll(Player player) {
        for (road: roads) {
            if (road.getOwner() != player) {
                return false;
            }
        }
        return true;
  }
}

class Road {
    Player owner;
    Group group;

    bool canBuildHouses(Player player) {
        return group.hasAll(player);
    }
}

Sobre a abordagem enum, isso tem o benefício de poder mover toda a lógica específica do grupo na classe Group.

Agora os projetos OO ainda não serão assim, devido à dependência cíclica (um Grupo precisa conhecer seus Roads e um Road tem que conhecer seu Grupo), o que pode ser resolvido por uma abordagem baseada em eventos, o que tornaria esse problema específico notavelmente mais complexo, mas dando mais flexibilidade para adicionar regras especiais, como se poderia adicionar regras extras, como bônus, se um jogador contiver um lado cheio do tabuleiro ou todas as estradas começando com a mesma letra ou algo facilmente.

    
por 11.06.2013 / 00:52
fonte