Pessoal, estou tentando fazer um jogo de cartas em Java utilizando threads. Entre cada jogador desse jogo há duas pilhas: a da direita usada para o jogador pegar uma carta, e a da esquerda para descartar. As pilhas serão tratadas como variáveis compartilhadas para sincronização. O jogo possui 4 jogadores e 4 pilhas. Queria saber se no meu método run() da classe Jogador posso ter os métodos pegaDireita() e sacaEsquerda()
Poste o seu código até então, para entendermos o que você quer fazer
Dentro de um método você pode chamar outros sim. Só não entendi por que você precisa usar threads.
Abraço.
sim, voce vai criar os metodos com toda á lógica, e logo após vs vai implementar esses metodos no seu construtor e depois vs irá implementar os metodos com seus paramentos dentro do metodo run:, vs vai implementar todos os seus metodos de logica do jogo , no metodo run();
Tenho que usar threads porque quero sincronizá-las para que os jogadores não utilizem uma pilha ao mesmo temo. Cada jogador tem uma ação de puxar uma carta da pilha da direita e imediatamente pôr uma carta na pilha esquerda. To com mta dificuldade em fazer isso. Esses são os métodos da minha classe Pilha
public synchronized void adicionaEsq (Carta cartaAdicionada) throws InterruptedException
{
if(pilhaCartas.size() == tamanho)
{
System.out.println("PILHA CHEIA");
wait();
}
pilhaCartas.add(cartaAdicionada);
System.out.printf("CARTA %s ADICIONADA NA PILHA",cartaAdicionada);
notifyAll();
}
public synchronized void removeDir () throws InterruptedException
{
if(pilhaCartas.isEmpty())
{
System.out.println("PILHA VAZIA");
wait();
}
System.out.println("Removendo elemento");
pilhaCartas.remove();
notifyAll();
}
`identar texto pre-formatado em 4 espaços`
Esses é o método run da classe jogador:
public void run()
{
try
{
Thread.sleep(generator.nextInt(3000));//a thread dorme
pilhaDireita.removeDir();
pilhaEsquerda.adicionaEsq(cartasMao.remove());
} catch (InterruptedException ex) {
Logger.getLogger(Jogador.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void mostraCartas ()
{
System.out.printf("\n\n\nAs cartas de %s:\n",nome);
for (Carta jogador : cartasMao)
System.out.printf("%s\n",jogador);
}
Mas, se cada jogador tem seu turno (vez de jogar), não existe a situação de a pilha ser usada ao mesmo tempo. Você parece estar tentando resolver um problema que não existe, ou não está explicando direito seu problema. Por exemplo, se é a vez do João de pegar uma carta e descartar outra, os outros jogadores deve aguardar até ele fazer essas duas operações. Até ele fazer isso, nenhum outro jogador faz nada. Então não existe o risco de a pilha ser usada ao mesmo tempo: o jogo está parado enquanto é o turno do João e mais ninguém tem acesso à pilha. Esse cenário não precisa de threads (o que não quer dizer que não possa usá-las).
Abraço.
Nesse problema que o professor passou, todos os jogadores jogam. Não existe vez de ninguém. Todo mundo joga ao mesmo tempo. Acho que ele fez isso pra forçar uma condição de corrida e quer que a gente resolva isso