Problema de lógica em Java

15 respostas
cleversonc6

Só agora percebi que tenho um problemão com lógica. Pois tenho um problema especificado assim:

Simular jogo de tabuleiro com 100 posições. Casas de 01 a 100.

Deve haver 2 jogadores. Os jogadores devem ter nome.

Há 2 dados, que são lançados a cada jogada por cada jogador. O jogo inicia na casa 01 para ambos. E eles se movimentam pelo tabuleiro a partir do valor obtido no lançamento dos dados.

A cada jogada, imprimir o nome e a casa em que o jogador chegou;

- Casas 5 e 35 = avance 5 espaços;

- Casas 13 e 67 = volte para o início;

- Casas 50 e 22 = jogue novamente;

- Casas 74 e 96 = volte 5 espaços;

1 jogador joga após o outro. Quem atingir a casa 100 primeiro vence o jogo, que é então finalizado.

Ao final do jogo, imprimir mensagem indicando o vencedor.

Mas já tentei de todos jeitos (que sei) e simplesmente não funcionou de nenhum jeito (que tentei- e olha que tentei).
Alguém tem alguma ideia para resolver isto?!?!?!

15 Respostas

jaboot

Tá… nos diga o que você fez, para que a gente possa te ajudar.

Frantic_Avenger

Qual problemão de lógica que você encontrou?
Obs.: Não faça um array de 100 posições para o jogo.

cleversonc6

um dos (inúmeros) jeitos foi este:

package quest3;

import java.util.Random;


public class Quest3 
{
    private int Numcasa;
    private int face;
    private  Random dado = new Random();
    
/*-------------------------------------------------------------------------------------------------------*/
    // método que executa o jogo
    
public void game()
{        
      int i2;
      int i1;
      
         
     int tot1;
     int tot2;
    
      
      i1 = 1;
      i2 = 1;
      
      do 
      {
          System.out.println(" p1 está na casa " + i1);
          face = 1 + dado.nextInt(6);
          System.out.println(" dado play1 deu valor : " + face);
          i1 += face;
          Numcasa = i1;
          AveriguacaodeCasa1(Numcasa);
          i1 = Numcasa;
                  
          System.out.println(" p2 está na casa " + i2);
          face = 1 + dado.nextInt(6);
          System.out.println(" dado play2 deu valor : " + face);
          i2 += face;
          Numcasa = i2;
          AveriguacaodeCasa2(Numcasa);
          i2 = Numcasa;
           
                              
      } while ( i1 < 100 || i2 < 100);
      
          if (i1 == 100){ System.out.println("Player 1 é o vencendor");}
          if (i2 == 100){ System.out.println("Player 2 é o vencendor");}
}// fim game  

/*------------------------------------------------------------------------------------------------------------*/

// métodos que verificam as condições das casas especificadas

private void AveriguacaodeCasa1(int n)
                {
                   switch (Numcasa)
                           {
                                        case 5:
                                        case 35: System.out.println( "player1 avançou cinco casas");
                                                 Numcasa+=5;
                                                 break;

                                        case 79:
                                        case 94: System.out.println("player1 voltou cinco casas");
                                                 Numcasa -=5;
                                                 break;
                                        case 13:
                                        case 67: System.out.println("player1  voltou ao inicio");
                                                 Numcasa = 0;// resolvido problema desta casa
                                                 break;

                                        case 50:
                                        case 22: 
                                            while (Numcasa == 22 || Numcasa == 50)
                                            {
                                                if (Numcasa == 22)
                                                {
                                                    System.out.println("player1 está na casa : " + Numcasa);
                                                   
                                                    face = 1 + dado.nextInt(6);
                                                    Numcasa += face;
                                                    System.out.println("player1 jogada do dado:  valor: " + face);
                                                    System.out.println("player1 está na casa : " + Numcasa);

                                               }
                                               if (Numcasa == 50)
                                               {
                                                    System.out.println("player1 está na casa : " + Numcasa);
                                                   
                                                    face = 1 + dado.nextInt(6);
                                                    Numcasa += face;
                                                    System.out.println("player1 jogada do dado:  valor: " + face);
                                                    System.out.println("player1 está na casa : " + Numcasa);

                                               }
                                            } break;
                }// fim switch
                    
                }     // fim do switch para player 1







private void AveriguacaodeCasa2 (int n)
                {
                   switch (Numcasa)
                           {
                                        case 5:
                                        case 35: System.out.println( "player2 avançou cinco casas");
                                                 Numcasa+=5;
                                                 break;

                                        case 79:
                                        case 94: System.out.println("player2 voltou cinco casas");
                                                 Numcasa -=5;
                                                 break;
                                        case 13:
                                        case 67: System.out.println("player2  voltou ao inicio");
                                                 Numcasa = 0;// resolvido problema desta casa
                                                 break;

                                        case 50:
                                        case 22: 
                                            while (Numcasa == 22 || Numcasa == 50)
                                            {
                                                if (Numcasa == 22)
                                                {
                                                    System.out.println("player2 está na casa : " + Numcasa);
                                                   
                                                    face = 1 + dado.nextInt(6);
                                                    Numcasa += face;
                                                    System.out.println("player2 jogada do dado:  valor: " + face);
                                                    System.out.println("player2 está na casa : " + Numcasa);

                                               }
                                               if (Numcasa == 50)
                                               {
                                                    System.out.println("player2 está na casa : " + Numcasa);
                                                   
                                                    face = 1 + dado.nextInt(6);
                                                    Numcasa += face;
                                                    System.out.println("player2 jogada do dado:  valor: " + face);
                                                    System.out.println("player2 está na casa : " + Numcasa);

                                               }
                                            } break;
                }// fim switch
                    
                }     // fim do switch para player 2

/*---------------------------------------------------------------------------------------------------------------------------------------*/
}// fim da classe
Frantic_Avenger

cleversonc6 poderia coloca seu código entre [ code] Sem espaço [ /code] para torná-lo mais legível. Vlw.

cleversonc6

Já aprendi que neste caso não serve um array [100] !!
:-o

panthovillas

crie uma inner class Jogador com a posição, nome e um metodo jogar que cria DOIS randons e retorna true ou false caso ele alcance a casa 100;
dentro de um while(true) vc chama o metodo jogar de jogador dando um break caso retorne true;

panthovillas

ps.: teu problema não esta com java e sim com OO. :wink:

douglaskd

o que o phanthovillas disse é +/- isso:

public class Player{
    
    String Nome;
    int CasaAtual = 01;
    
    Player(string nome){
        Nome = nome;
    }

    void jogar(){
    
        dado1 = getNumeroAleatorio() //de 1 a 6
        dado2 = getNumeroAleatorio() //de 1 a 6
        
        if((dado1+dado2+CasaAtual == 5)||(dado1+dado2+CasaAtual == 35)){
            CasaAtual = CasaAtual+5;
            System.out.println("Avancei 5 Casas");
        }else if((dado1+dado2+CasaAtual == 13)||(dado1+dado2+CasaAtual == 67)){
            CasaAtual = 01;
            System.out.println("voltei ao inicio");
        }else if((dado1+dado2+CasaAtual == 50)||(dado1+dado2+CasaAtual == 22)){
            CasaAtual = CasaAtual+dado1+dado2;
            System.out.println("Avancei "+CasaAtual+" Casas e Vou jogar denovo");
            jogar();
        }else if((dado1+dado2+CasaAtual == 50)||(dado1+dado2+CasaAtual == 22)){
            CasaAtual = CasaAtual-5;
            System.out.println("Que Zica, Voltei 5 Casas");
        }
        CasaAtual = CasaAtual+dado1+dado2;
        System.out.println("Casa Atual do Jogador "+Nome+": +Casa+");
    }

    int getCasaAtual(){
        return CasaAtual;
    }
}

public class Game{

    void start(){
    
        Player Playter1 = new Player("jogador1");
        Player Playter2 = new Player("jogador2");
        
        while((Player1.getCasaAtual() != 100) && (Player2.getCasaAtual() != 100)){
            Player1.Jogar();
            Player2.Jogar();
        }
    }

}

main(){

    Game NovoJogo = new Game();
    NovoJogo.start();

}

não compilei...deve ta cheio de erro e tem que implementar algumas coisas como numeros aleatórios...e interação com o usuário

mais a base é isso, coloquei a responsabilidade no Player, mais talvez o correto fosse deixar apenas a responsabilidade de jogar os dados no player.. e a lógica ficaria no Game....mais...desse jeito também da pra entender...

jaboot

cleversonc6, (lembrei dos sobrinhos do ataíde agora)

Siga o que o amigo douglaskd informou (dando também os créditos para o phanthovillas) . Eu acho que faria da mesma forma.

O que eu acho que ficou faltando, ou um pouco complicado pra colocar no jogo da forma que você fez, é a posição do usuário. Assim que ele “lançar os dados” e se movimentar, a posição dele irá ser alterada, e então a regra atua ou não para aquela casa.

Volte ao começo do seu pensamento, mais ou menos isso: O que um usuário tem que ter?
Nome
Posição atual

O que um tabuleiro tem que ter:
posições (casas)
Regras específicas para cada casa (algumas não tem - não precisa especificar todas!)

O que o JOGO tem que fazer:
os jogadores se movimentarem (lançar dados)
saber se caiu em alguma casa com regra
Edit: e atuar caso caia em alguma delas

E assim vai… nos informe se precisar de algo!

panthovillas

jaboot:
cleversonc6, (lembrei dos sobrinhos do ataíde agora)

O que eu acho que ficou faltando, ou um pouco complicado pra colocar no jogo da forma que você fez, é a posição do usuário. Assim que ele “lançar os dados” e se movimentar, a posição dele irá ser alterada, e então a regra atua ou não para aquela casa.

é exatamente ai q eu acho q ele se perdeu.

cleversonc6

Tentei mas ainda não consegui.
A linha de pensamento do panthovillas está coretissíma…
Vou estudar com mais calma lógica e muito mias OO.
Obrigado pelas dicas.

R

tenho um jogo parecido, que tem diversos comportamentos e funciona que é uma beleza, tem dois dados, e tudo, só que é grande para mandar por aqui, posso mandar o jar,
mas vai faltar as imagens e os sons que tem que ir na pasta c://

se alguém quiser mando por email, o atachment é muito pequeno, de limite e não permite…

posto um trecho para ter uma idéia do funcionamento dos comportamentos das casas…

public void comportamentos() {
        //verifica se avança 9 casas
            if (somaTotal == 5 || somaTotal == 10 || somaTotal == 15 || somaTotal == 20 || somaTotal == 25 || somaTotal == 30 || somaTotal == 35 || somaTotal == 40 || somaTotal == 45 || somaTotal == 50 || somaTotal == 60 || somaTotal == 70 || somaTotal == 80) {
            if (soma == 1) {
             jLabelStatus2.setText("Informação: Você estava na casa " + somaAnterior + " , obteve " + soma + " ponto");
                } else {
                    jLabelStatus2.setText("Informação: Você estava na casa " + somaAnterior + " , obteve " + soma + " pontos");
                }
                jLabelStatus3.setText("Informação: Na casa " + somaTotal + " voce avanca 9 casas");

                somaTotal = somaTotal + 9;
                jTsomaTotal.setText("" + somaTotal);
                jLabelStatus.setText("STATUS: Você avancou 9 casas e foi para casa: " + somaTotal);

                //poe icone
                jComportamento.setIcon(casas9);
                   jAvancou.setIcon(avancou);
            }

            //recua 8 casas ...                    
            if (somaTotal == 9 || somaTotal == 12 || somaTotal == 16 || somaTotal == 27 || somaTotal == 32 || somaTotal == 39 || somaTotal == 41 || somaTotal == 51 || somaTotal == 66 || somaTotal == 71 || somaTotal == 83 || somaTotal == 92 || somaTotal == 97) {
                jLabelStatus2.setText("Informação: Você estava na casa " + (somaAnterior) + " , obteve " + soma + " pontos");
                jLabelStatus3.setText("Informação: Na casa " + somaTotal + " voce recua 8 casas");
                //jLabelStatus.setText("STATUS: Você irá recuar 8 casas.");

                somaTotal = somaTotal - 8;
                jTsomaTotal.setText("" + somaTotal);
                jLabelStatus.setText("STATUS: Você recuou 8 casas e foi para casa: " + somaTotal);
                //poe icone
                jComportamento.setIcon(casas8);
                   jAvancou.setIcon(recuou);
            }

            //volta ao inicio do jogo na 42

            if (somaTotal == 42) {
                jLabelStatus2.setText("Informação: Você estava na casa " + (somaAnterior) + " , obteve " + soma + " pontos");
                jLabelStatus3.setText("Informação: Na casa " + somaTotal + " voce volta ao inicio do jogo");
                //jLabelStatus.setText("STATUS: Você irá recuar 8 casas.");

                somaTotal = somaTotal - 42;
                jTsomaTotal.setText("" + somaTotal);
                jLabelStatus.setText("STATUS: Você retornou ao inicio do jogo");


                //poe icone
                jComportamento.setIcon(inicio);
                   jAvancou.setIcon(recuou);

            }

peçam o jogo que eu mando por email, é o jogo do 37, pois se cai na 37 , a pessoa vence, vai direto a casa 100.

mas o jogo por enquanto funciona para uma pessoa só. de certa forma é um protótipo. depois fui estudar 2d, e não tive muito êxito, e acabou ficando com um jogador mesmo, pelo menos, por enquanto.

jaboot
Mamão com açucar mode ON:
blá blá blá (main string args) { 

Tabuleiro tabuleiro = new Tabuleiro();
Jogador daniel = new Jogador("Daniel");
Jogador danilo = new Jogador("Danilo");
boolean acabou = false;

Enquanto (!acabou){
     
    // lança os dados para cada jogador

    // move-se com cada jogador

    // verifica se chegou no final
    se final então
         acabou = true;
    fim então

    // atua a regra da casa para cada jogador

}

sysout("ahá! ganhou o jogador" + jogador.getNome());
}
Isso foi o exemplo mais tosco que eu já fiz. Espero que te dê uma ideia.

Edit: Eu deu uma lida no seu código. Você tem que pensar mais OOmente. Por exemplo, ao invés de criar dois métodos de AveriguacaodeCasa que recebem a casa, porque não um método só, que receba um Usuário?
O usuário não tem que saber que posição ele está? :-)

R

bem meu jogo em jar, sem imagens ou sons, fica muito pobre, peçam pelo email:[email removido] que mando tudo zipado.

ele funciona com, a jogada dos dados, se estava na casa 3, deu 5, vai para 8, na oito ele ve se tem comportamentos, pois existe a casa atual ou somaatual e aí aplica, seja avançar ou regredir casas, que é o resultado da somatotal, somatotal é a casa em que se encontra o ‘peão’. em toda casa ele ve se é a somaatual e calcula o comportamento da casa. deu para entender é bem simples. não usei array nada disso.

seria bacana quem se interessa por tabuleiro e jogos, ver o funcionamento deste simples jogo, mas que pode ser base para um mais complexo.

as labels (ou casas do jogo) tem ícones, de 0 ou 1 a 100, e na verdade todas elas tem dois tipos de ícones, um só a casa e um a casa com o jogador (que é um círculo), então se a soma atual coincide com determinada casa, esta casa passa a ter o ícone (ou imagem) em que mostra que o jogador está lá, que no meu jogo nada mais é que a casa, com um círculo ao redor do número. Isto porque a imagem foi feita assim, mas poderia dedicar mais tempo para a imagem e fazer uma bela imagem, na verdade o que vai acontecer é trocar a imagem, onde o jogador estiver de fato, independente de qual seja. usando o mesmo nome de imagem da programação fica bem fácil inserir novas imagens, pretendo fazer uma nova versão.

ACho que expliquei como fiz, meu jogo bem similar a este, com 100 casas e comportamentos de avança e regride, etc.
vale conferir, e torcer pela 2 versão.

procurei estudar java 2d, mas nao obtive muito exito ainda, acho que vou fazer um jogo novo, com imagens maiores e talvez mais bonitas.
em todo caso o fato de ainda ser só com um jogador também deixa um pouco a desejar.

Na verdade o jogador só perde se não chegar a 100 com determinado número de tentativas ao jogar o dado. foi uma forma que fiz para ter alguma graça… ou sozinho nunca perderia.

é isto aí…

email:[email removido]
subject:jogo do 37

R

pela sua lógica, estou achando poucas casas com ‘comportamentos’. no meu jogo é bem similar, mas ainda tem jogue com 1 dado, ou jogue com 2 dados. ou retorne 20 casas. há grande possibilidade.

lembro do jogo imagem e ação que se encontra em
www.gametrack.com.br mas lá usa o desenho do mouse e chat.

Criado 6 de janeiro de 2012
Ultima resposta 7 de jan. de 2012
Respostas 15
Participantes 6