Listas Encadeadas?

Vou desenvolver um jogo de tabuleiro, e surgiu a dúvida de como armazenaria o tabuleiro. Matriz, ArrayList e etc. E o que foi sugerido foram listas encadeadas. Alguém pode me dar um exemplo de como usaria isso? O que são listas encadeadas?

Valeu :smiley:

P.S.: Net bloqueada sucks!

Qual o jogo? Dependendo, dá pra usar listas encadeadas ou não.


Uma lista encadeada é uma estrutura de dados onde cada elemento possui uma referência para o próximo.
Exemplo:

class Node { Object value; Node nextNode; }
O último elemento não possui referência pra ninguém, ou seja, nextNode é null.

No site do Caelum tem uma boa apostila de estruturas de dados em Java: http://www.caelum.com.br/curso/cs-14-algoritmos-estruturas-dados-java/

Minha net tá bloqueada, não consigo acessar a apostila da caelum. O jogo é o Ludo. Jogo antigo e tal. Mas aí eu usaria as listas encadeadas para montar o tabuleiro?

Se tiver procurando pela implementação dessas listas na API do Java:

http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html

Tomemos como exemplo o jogo de trilha. Veja uma imagem do tabuleiro aqui.

O tabuleiro de trilha tem 24 posições, e cada posição possui suas vizinhanças. Numerando todas as casas de 1 a 24, percebemos que a casa número 1, por exemplo, tem vizinhança com as casas 2 e 10.

Então uma casa do jogo de trilha, em Java, ficaria assim:

class Casa { Peca peca; List<Casa> vizinhos; }
Essa seria uma situação para usar listas encadeadas. Se você vai fazer em Java, não precisa criar uma lista do zero, pode usar as collections que a tecnologia oferece.

No caso de ludo, não sei se seria adequado, porque são muito mais casas e muito mais vizinhanças pra modelar.

A menos que seu tabuleiro seja gigantesco, use um vetor bidimensional para tabuleiros quadrados (damas, xadrez, ludo, etc).

No caso do gamão, onde existem duas “linhas”, pode ser dois vetores unidimensionais, um para cada lado do tabuleiro. Ou mesmo um vetor unidimensional só, acessado de maneira circular, já que o gamão tem essa característica.

Caso seja enorme (maior do que 1000x1000 casa, por exemplo), pense na possibilidade de usar uma matriz esparsa, como a implementada nesse tópico:
http://www.guj.com.br/posts/list/60930.java#320623

é um tabuleiro padrão ?? de 8x8 ?? dakeles em que um lado é letras e o outro é numero ?? tipo movimento de b6 para c7 ??

eu usaria maps…

primeiro, qual objeto vc vai por no tabuleiro ?? peças ??? vamos chamar o objeto de Peca

[code]import java.util.Map;
import java.util.TreeMap;
import Peca.VAZIO; //uma peça que representa que não há peça la =x

public class Tabuleiro {
private Map<String,Map<Integer, Peca>> tabuleiro = new TreeMap<String,Map<Integer,Peca>>(8);

public Tabuleiro() {
for(int i = (int)‘a’; i <= (int)‘h’; i++) {
Map casas = new TreeMap<Integer,Peca>(8);
tabuleiro.put(String.valueOf((char)i),casas);
for(int j = 1; i<= 8; i++)
casas.put(j,VAZIO);
}
}

public Peca getPeca(String letra,Integer casa) {
return tabuleiro.get(letra).get(casa);
}

//coloca a peça no lugar, e retorna a peça que estava la
public Peca setPeca(String letra,Integer casa,Peca peca) {
return tabuleiro.get(letra.toLowerCase()).put(casa,peca);
}
}[/code]

Eu fiz na mão, então pode ser que não compile…

agora fica simples de usar

[code]Tabuleiro tabuleiro = new Tabuleiro();

Peca peca = tabuleiro.getPeca(“A”,4);
Peca foiRemovida = tabuleiro.setPeca(“A”,5,peca);[/code]

a partir dai, vc cria seu movimento sua logica, faz o que kizer ^^

Eu diria que em um tabuleiro não tem por que implementar todas as casas. O importante mesmo é saber a posição das peças e aplicar as regras ao movimentá-las.

O teu tabuleiro acaba sendo implementado somente como um conjunto de regras, sem matriz nem nada.

No máximo mesmo só precisa saber onde estão as peças.

.

Esse Map, TreeMap seria um exemplo de lista encadeada ou um jeito bom para gerar um tabuleiro? Estou na idéia da Lista encadeada pq foi sugerido que esse seria o melhor método de fazer esse trabalho e não usando matriz. Ludo tem tabuleiro de 30x30 eu acho ou 20x20, não sei bem.

Para a implementação gráfica do mesmo, eu teria que atribuir uma imagem para cada dimensão pro JFrame inserir quando carregar?

Valeu :smiley:

Eu concordo com a idéia de usar Map<Posições, Peças>, mas não concordo em encher casas com vazio.

Um get de uma chave “Posição” deveria retornar somente nulo caso não haja uma peça na casa.

[quote=Bruno Laturner]Eu concordo com a idéia de usar Map<Posições, Peças>, mas não concordo em encher casas com vazio.

Um get de uma chave “Posição” deveria retornar somente nulo caso não haja uma peça na casa.[/quote] sendo VAZIO uma instancia public static final, não sei o comprometimento que pode gerar em performance… (quando digo não sei é pq não sei mesmo auhahu)…

enfim, VAZIO, null, ou ate mesmo não colocar nada, a ideia principal é + ou - a mesma…

caso não for colocar nada, vc precisa guardar em uma variável as dimensões limites de linhas e colunas, ai para verificar se tem 1 peça la… basta testar c a Key existe… outra coisa importante, é que vc precisa pagar a KEY sempre que mover a peça, pq não preencher todo o tabuleiro, e depois ficar deixando espaço VAZIO ou nulo pra traz, pode ser um problema… enfim… é uma ideia… o resto é com vc ^^

boa sorte…

sobre a parte visual, vc pode ter imagem para as peças, ai no teu Objeto Peço, pode ter algo como getImage, ou ate mesmo ele pode extender um objeto ImageIcon,

boa sorte

Só lembrando: em nenhum momento eu falei que usar listas seria a melhor escolha. Dei o exemplo do jogo de trilha que usei uma vez, só pra ele se basear. Eu precisei modelar o jogo de trilha dessa forma porque o adversário iria jogar contra o computador, e eu precisei gerar a árvore de jogo pra calcular a melhor jogada que o computador poderia fazer.

Sobre a estratégia de usar um Map, foi exatamente a que eu usei pra modelar um jogo de batalha naval uma vez. No final, pode ser generalizado pra qualquer jogo. Mas no caso do ludo, essas coordenadas não existem: elas seriam utilizadas apenas internamente pra posicionar as peças.

Dê uma olhada no tabuleiro aqui: http://pt.wikipedia.org/wiki/Ludo

É, no ludo as peças irão se mover pelo número tirado no dado.

Minha net é bloqueada, não consigo acessar a wiki. Vou tentar no final de semana. Mas vocês acham que eu devia usar a estrutura de Map para fazer o tabuleiro? Listas Encadeadas não passo pela cabeça de ninguém? :smiley:

[quote=[BlacK]]É, no ludo as peças irão se mover pelo número tirado no dado.

Minha net é bloqueada, não consigo acessar a wiki. Vou tentar no final de semana. Mas vocês acham que eu devia usar a estrutura de Map para fazer o tabuleiro? Listas Encadeadas não passo pela cabeça de ninguém? :D[/quote]

o que vc entende por listas encadeadas ??

não sei o significado conceitual deste termo, porem uma lista de listas pra mim é uma lista encadeada… sendo assim, a solução com maps usa listas encadeadas…

vc tem 1 MAP de linhas e cada linha do map, contem 1 map de colunas … assim vc tem 1 lista de litas…

vc chama o a linha 2, e ele te traz outro a lista, que é a coluna, ai vc da a coluna 8 … ai vc xega a ponto no teu espaço … o ponto (2,8) …

não era isso que vc keria ?

[quote=Lavieri]o que vc entende por listas encadeadas ??

não sei o significado conceitual deste termo, porem uma lista de listas pra mim é uma lista encadeada… sendo assim, a solução com maps usa listas encadeadas…

vc tem 1 MAP de linhas e cada linha do map, contem 1 map de colunas … assim vc tem 1 lista de litas…

vc chama o a linha 2, e ele te traz outro a lista, que é a coluna, ai vc da a coluna 8 … ai vc xega a ponto no teu espaço … o ponto (2,8) …

não era isso que vc keria ?[/quote]
Lista de listas não é o mesmo que listas encadeadas. Veja o meu primeiro post neste tópico.
Mais informações aqui: http://pt.wikipedia.org/wiki/Lista_ligada

Não entendo pq uma lista ou um simples array não seria igualmente adequado para esse caso.
Ok, muitas casas estarão vazias, mas estamos falando do que 1k? 10k?

A menos que ele esteja programando ludo pro Atari, acho que dificilmente isso será um problema.

[quote=ViniGodoy]Não entendo pq uma lista ou um simples array não seria igualmente adequado para esse caso.
Ok, muitas casas estarão vazias, mas estamos falando do que 1k? 10k?

A menos que ele esteja programando ludo pro Atari, acho que dificilmente isso será um problema.[/quote]
Também acho que uma simples matriz seria o suficiente.

[quote=Lavieri][quote=[BlacK]]É, no ludo as peças irão se mover pelo número tirado no dado.

Minha net é bloqueada, não consigo acessar a wiki. Vou tentar no final de semana. Mas vocês acham que eu devia usar a estrutura de Map para fazer o tabuleiro? Listas Encadeadas não passo pela cabeça de ninguém? :D[/quote]

o que vc entende por listas encadeadas ??

não sei o significado conceitual deste termo, porem uma lista de listas pra mim é uma lista encadeada… sendo assim, a solução com maps usa listas encadeadas…

vc tem 1 MAP de linhas e cada linha do map, contem 1 map de colunas … assim vc tem 1 lista de litas…

vc chama o a linha 2, e ele te traz outro a lista, que é a coluna, ai vc da a coluna 8 … ai vc xega a ponto no teu espaço … o ponto (2,8) …

não era isso que vc keria ?[/quote]

Não entendo nada por lista encadeadas e não sei bem o que eu quero. aieuheaiuahae mal ae. Baixei o material da calum sobre essas listas e to lendo, vou ver se consigo fazer o estilo do tabuleiro usando maps ou algo do tipo.

sei que o tabuleiro do ludo é uma cruz e cada braço contém. 3 colunas e em cada coluna existe 6 espaços.