Métodos em run()

5 respostas
R

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()

5 Respostas

TerraSkilll

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.

J

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();

R

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);
        
}
TerraSkilll

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.

R

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

Criado 24 de fevereiro de 2016
Ultima resposta 24 de fev. de 2016
Respostas 5
Participantes 3