[duvida]jogo em java

19 respostas
J

Olá pessoal estou fazendo um jogo da forca começei do zero a 2 dias atraz estou com algumas duvidas… estou utilizando o netbeans 7.0
bem vou dizer como funciona

  1. o programa le um arquivo existente com as palavras e sorteia uma randonicamente.
  2. ele pega o tamanho da palavra e faz os traços por ex. casa faz _ _ _ _
  3. ai ta pegando… eu queria saber como posso fazer as comparações se a letra (char) digitada tiver na palavra por ex. se for casa dneovo e eu digitar A exibir asim _ A _ A

nao estou fazendo a parte grafica ainda estou fazendo as funções funcionarem corretamento depois parteirei para a parte grafica, ele rodando no terminal é a meta agora! ^^

vou postar meu codigo aqui abaixo

quem puder me ajudar agradeço muito,

** para melhor entendimento do código eu criei um arquivo .txt com as palavras ai a primeira linha é um numero dizendo quantas palavras possuem o arquivo…, pq nao estava conseguindo fazer ler o arquivo e sortear a palavra de forma randonica… ai eu converti para Int e fiz pelo Math.random
por ex. **

3
casa
arvore
automovel

package jogo_forca;

import <a href="http://java.io">java.io</a>.*;

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Scanner;

import javax.swing.JOptionPane;

/**
*

  • @author pepis
    */
    public class Jogo_forca {
    //minhas variaveis locais
    static String palavra_completa, tracos;
public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);

String palavra, nome;

int opt;

do {

//menu do programa
opt = Integer.parseInt(JOptionPane.showInputDialog(" menu\n 0.Fim\n "

  • “1.Jogar sorteio palavra (aleatorio)”
  • “\n 2.Sortear Palavra por idice\n”
  • " 3.Exibe numero de erros\n "
  • "4.Ver minha Pontuação\n "
  • “5. Resetar meus pontos”));

switch (opt) {

case 0:

//finalizar o programa

System.exit(0);

break;

case 1:

break;

case 2:
JOptionPane.showMessageDialog(null, “.::Instruções.::”+"\n o Jogador pode errar até "
+"\n 6 vezes caso contrario perde")
;

nome = JOptionPane.showInputDialog("Nome: ");

sortearpalavra();

desenharPalavra();

alterarTracos();

break;

case 3:
break;

case 4:
break;

case 5:
break;

}
} while (opt != 5);

}

// sorteio das palavras… jogo…

public static void sortearpalavra() {

int linhas = 0;

int max = 0;

String linha, palavras [];

String nomeArquivo = /temp/palavras.txt;

try {

FileReader arqTexto = new FileReader(nomeArquivo);

BufferedReader leitor = new BufferedReader(arqTexto);
max = Integer.parseInt(leitor.readLine());

palavras = new String[max];

System.out.println("Total de palavras: " + max);
int i = 0;

while ((linha = leitor.readLine()) != null) {

palavras[i] = linha;

<a href="//System.out.println">//System.out.println</a>("Palavra: " + palavras[i]);

linhas++;

i++;

}

int n = (int) (Math.random() * max);

System.out.println("Palavra Sorteada: " + palavras[n].toLowerCase());
//verificando o tamanho da palavra escolhida

int tam_palavrasort = palavras[n].length();

//convertendo a palavra toda para minuscula

palavra_completa = palavras[n].toLowerCase();

tracos = “”;

//transformando a palavra nos traços

for(i=0; i<tam_palavrasort; i++)

tracos +=" _ ";

// vendo o tamanho da palavra sorteada

System.out.println("Tamanho da palavra sorteada: " +tam_palavrasort);

} catch(IOException e){

System.out.print(Erro! Não foi possível concluir a pesquisa.);

}

}

public static void desenharPalavra(){

JOptionPane.showMessageDialog(null, “Palavra a ser advinhada”+tracos);

}

public static void alterarTracos(){

char letra;

int i;

String entrada=JOptionPane.showInputDialog(null,“Digite a Letra”);
letra = entrada.charAt(0);

for(i = 0; i < palavra_completa.length(); i++)
if(palavra_completa.charAt(i) == letra);

// duvidas aqui,

}

}

19 Respostas

L

Olá junior_pepis!

Nossa que legal! Você está fazendo um jogo! Eu também atualmente ando trabalhando um pouco com essas coisas e fiz um joguinho bem besta de nave, tipo “space invaders”. :lol:

Com relação a sua dúvida, por se tratar de um jogo, eu sugiro que você utilize o molde clássico para se fazer um jogo, crie uma classe e faça ela ser filha de Thread. Trabalhe com double-buffer para melhor desempenho de sua aplicação. Você pode fazer com que o usuário digite uma palavra numa JTextArea, por exemplo, ou que ele clique nos espaços desenhados por você e digite uma letra para confirmação. Tem muitas idéias para se fazer esse tipo de jogo.

Com relação a sua dúvida sobre o algoritmo, eu acho que você realmente poderia criar uma variável String para atuar como palavra atual em procura. Quando o usuário digitar uma letra, você pode até dar um for na palavra e ir verificando se a variável tem a letra e também ver qual a posição de cada letra. Você pode até fazer isso, de repente, com recursão. Como eu falei, tem muitas idéias para se resolver isso, basta você usar a sua criatividade.

Se você quiser algum material sobre criação de jogos e etc, eu posso até fazer um resuminho aqui para você em txt ou rtf e te mandar via pm o link ou, te indicar sites na internet que tenham esse tipo de material.

OBS: Coloque seu código entre as tags de código que fica melhor para a gente te ajudar. :wink:

Litium.

J

litium vlw por responder… cara meu jogo é bem simples é mais para aprender do que pra fazer… eu preciso aprender umas coisa de parte grafica por isso optei pelo game, desculpa não coloca entre as tags de codigo pq ainda nao to familharizado com o forum…, eu nem começei a parte grafica quero fazer rodar em terminal por agora depois vou implementar a parte grafica
abraçoo se puder ajudar…

se ficar ruim de visualizar o codigo favor entrar aki
http://pastebin.com/1Ghj4uB7


código abaixo.

V

Cadê a indentação do seu código? :shock:

J

ficou mais organizado asim??

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogo_forca;

import java.io.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import javax.swing.JOptionPane;

/**
 *
 * @author pepis
 */
public class Jogo_forca {
    //minhas variaveis locais

    static String palavra_completa, tracos;

    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        String palavra, nome;

        int opt;



        do {

            //menu do programa
            opt = Integer.parseInt(JOptionPane.showInputDialog(" menu\n 0.Fim\n "
                    + "1.Jogar sorteio palavra (aleatorio)"
                    + "\n 2.Sortear Palavra por idice\n"
                    + " 3.Exibe numero de erros\n "
                    + "4.Ver minha Pontuação\n "
                    + "5. Resetar meus pontos"));

            switch (opt) {

                case 0:
                    //finalizar o programa
                    System.exit(0);
                    break;

                case 1:

                    break;

                case 2:
                    JOptionPane.showMessageDialog(null, ".::Instruções.::" + "\n o Jogador pode errar até "
                            + "\n 6 vezes caso contrario perde"
                            + "\n Jogo desenvolvido para diciplina" + "\n estrutura de dados"
                            + "\n Pelo aluno José Carlos S. dos Reis Jr" + "\n faculdade de tecnologia senac - pelotas");


                    nome = JOptionPane.showInputDialog("Nome: ");
                    sortearpalavra();
                    desenharPalavra();
                    alterarTracos();
                    break;

                case 3:
                    break;

                case 4:
                    break;

                case 5:
                    break;




            }
        } while (opt != 5);

    }

// sorteio das palavras.... jogo....    
    public static void sortearpalavra() {
        int linhas = 0;
        int max = 0;
        String linha, palavras[];
        String nomeArquivo = "/temp/palavras.txt";
        try {
            FileReader arqTexto = new FileReader(nomeArquivo);
            BufferedReader leitor = new BufferedReader(arqTexto);

            max = Integer.parseInt(leitor.readLine());
            palavras = new String[max];
            System.out.println("Total de palavras: " + max);

            int i = 0;
            while ((linha = leitor.readLine()) != null) {
                palavras[i] = linha;
                //System.out.println("Palavra: " + palavras[i]);
                linhas++;
                i++;
            }
            int n = (int) (Math.random() * max);
            System.out.println("Palavra Sorteada: " + palavras[n].toLowerCase());

            //verificando o tamanho da palavra escolhida
            int tam_palavrasort = palavras[n].length();
            //convertendo a palavra toda para minuscula
            palavra_completa = palavras[n].toLowerCase();
            tracos = "";
            //transformando a palavra nos traços
            for (i = 0; i < tam_palavrasort; i++) {
                tracos += " _ ";
            }

            // vendo o tamanho da palavra sorteada


            System.out.println("Tamanho da palavra sorteada: " + tam_palavrasort);




        } catch (IOException e) {
            System.out.print("Erro! Não foi possível concluir a pesquisa.");
        }

    }

    public static void desenharPalavra() {

        JOptionPane.showMessageDialog(null, "Palavra a ser advinhada" + tracos);




    }

    public static void alterarTracos() {
        char letra;
        int i;

        String entrada = JOptionPane.showInputDialog(null, "Digite a Letra");
        letra = entrada.charAt(0);


        for (i = 0; i < palavra_completa.length(); i++) {
            if (palavra_completa.charAt(i) == letra);
        }

// duvidas aqui,,




    }
}
L

E aí junior_pepis.

Tá, então você quer deixar o seu jogo funcional, feito de forma gráfica simples só para estudo, não é? Bem, assim também dá para fazer. Se não entendi errado, você quer implementar o algoritmo. Eu não vou te dar o algoritmo pronto de bandeja, pois acho que isso é mal acostumar a pessoa. Mas posso te dar idéia para que você trace seu próprio caminho para resolver este problema.

Vejamos, você colocou o loop (a repetição) de seu jogo dentro do laço do-while. O usuário entra com uma escolha e o switch tem o dever de tratar essa escolha. Você pode usar esta instrução para carregar arquivos de forma que estes estejam dentro do seu arquivo jar:

String caminho = this.getClass().getClassLoader().getResource("caminho");

Eu uso muito essa instrução e fica muito confortável de se trabalhar com ela. Cria uma pasta no seu pacote para colocar os arquivos que serão lidos. Outra coisa, você está usando uma variável int de nome max para contar o total de palavras que existem nesse arquivo, correto? Se eu fosse você, eu organizaria cada palavra nesse arquivo com um prefixo para indentificar que aquela linha tem uma palavra para ser lida. Meu arquivo poderia ficar assim:

# - Casa
# - Caminhão
# - Velocidade
# - Mouse
# - Papai_noel

Fazendo isso, toda linha que estivesse com o primeiro caractere igual a #, seria considerado uma palavra. Você poderia usar o método subString() para poder resgatar esta palavra do arquivo. Depois que você encontrasse a palavra, você fazia:

max++;

Afinal, não é “max” quem irá definir o tamanho do array com suas palavras? Você também poderia usar a classe Random do pacote java.util para sortear a sua palavra em uso no seu jogo de forca. assim você limitaria o random com o número da variável max:

Random random = new Random();
random.nextInt(max);

Agora que notei, você criou uma variável “a toa”. A variável “tam_palavrasort” não precisa estar ali. Você dentro do for mesmo pode usar palavras[n].length(). Assim você gasta mais memória para a sua aplicação reduzindo seu desempenho.

Você também poderia fazer com que uma String aparecesse numa janela (exemplo: _ _ _ _ _ _ ). Essa String poderia ficar no começo do seu código…

Pensando bem…

Você poderia criar uma outra classe para fazer todo esse trabalho e deixar o seu método main só iniciar o programa dessa outra classe. Essa outra classe teria variáveis de instância privada com devidos métodos para interagir com elas e demonstrar as janelas para o usuário. Em minha opinião pessoal como programador, é muito ruim trabalhar com variáveis na classe main com outros métodos tentando manipular elas (isso seguindo o meu exemplo). Seu código pode ficar muito mais organizado e muito mais otimizado fazendo isso.

Eis a minha idéia:

Cria uma outra classe chamada Jogo (por exemplo), e faça seus métodos ali. Crie um método de início para jogo, algo tipo, “public void iniciarJogo(){}”. Esse método prepara objetos, e inicia o loop de sua aplicação (o qual pode estar em outro método, se você desejar). O seu método main é quem deve criar uma instância dessa classe e chamar este método. Assim seu código fica visualizado de melhor forma e até através dessa organização, você pode ver mais coisas de como o seu programa vai trabalhar.

Você também pode deixar tudo na classe com o método main. Você pode usar variáveis de instância e um contrutor para fazer tudo direitinho. Aí o teu main só faria construir um objeto da própria classe, dessa forma:

public class Forca
{
    // Variáveis de instância para trabalho viriam aqui.
    private int max;
    ...

    public Forca()
    {
         // Seu construtor poderia preparar as variáveis e iniciar um loop em outro método.
         ...
         // Depois dos objetos estarem prontos, seu método de loop de jogo poderia ser chamado.
         this.iniciarJogo();
    }

    public void iniciarJogo()
    {
         do
         {
              // Seu loop de jogo ficaria aqui
         } while(condição);
    }

    public static void main(String args[])
    {
         new Forca();
    }
}

Tenta fazer assim, se tiver com dúvida ainda, se precisar de ajuda, coloca aqui que a gente dá umas dicas. :wink:

Litium.

J

sim eu vou criar uma class com todos meus metados para ficar mais organizado mas a duvida seria como eu mudaria… a

vamos ver o programa ele sortiou uma palavra e akela variavel global la em cima “tracos” é os tracos “_” que ele vai desenhar de acordo com o tamanho da palavra
a palavra sorteada seria Palavra_completa seria a palavra sorterteada e os tracos seriam os _ _ _ , como eu poderia exibir os tracos com o char digitado por exemplo por casa exibir _ A A, seria com substring e está certo minha comparação ai embaixo?

public static void alterarTracos() {
        char letra;
        int i;

        String entrada = JOptionPane.showInputDialog(null, "Digite a Letra");
        letra = entrada.charAt(0);


        for (i = 0; i < palavra_completa.length(); i++) {
            if (palavra_completa.charAt(i) == letra);
        }
L

Oi junior_pepis.

De duas coisas você vai precisar, uma variável representando a palavra escolhida no sorteio (se for usar array com palavras, use só no momento da procura de uma palavra. Não vale a pena guardar várias palavras na memória SE elas não forem usadas futuramente ou, se você não terá que ler novamente o arquivo), e de uma outra variável que possa ser modificada.

“Por que modificada?” - Você perguntaria.

Esta outra variável pode começar como “_ _ _ _ _ ", por exemplo, e conforme o usuário for acertando as letras, esta variável pode mudar para " A _ _ _ A”. Daí, você pode pensar em usar uma StringBuffer (e não uma String - Lembre-se, Strings são imutáveis!). Você teria algo assim:

private String palavraCH; // CH de chave.
private StringBuffer palavraPS; // PS de pesquisa.

Aí, digamos, o usuário digita uma letra e você faz (como eu falei antes) um for na palavraCH verificando se existe a letra e pegando a sua posição. Com isso, você pode alterar as posições na palavraPS digitando cada letra adquirida e casa posição certinha. Não tem mistério.

Seu código acima, ao meu ver, não tem nada de errado. Você poderia declarar o “int i” dentro do for, assim dando a variável “char letra” um maior destaque visual. Seu laço for está dizendo algo como: “Se a palavra completa tiver algum char com a letra escolhida…” - está certo. Agora falta implementar e adquirir a posição de cada letra na palavra (caso elas existam).

Agora, eu como seu colega de programação, sugiro que você procure desde já organizar o seu código da melhor forma o possível e visível. Confesso que da primeira vez que vi seu código, tive de forçar a vista (e eu uso óclus). Separe mais as linhas com espaço e comentários para melhor compreensão. Se não, lá na frente quando você for fazer programas maiores, tipo uma classe com 5 mil linhas, você terá muita dificuldade e muita preguiça em programar naquele seu código pois, você mal vai enchergar as coisas. Acredite, eu já passei por isso e foi frustrante! Tive uma baita dor de cabeça.

Deixa eu te dar um exemplo bacana. Vamos dizer que a gente tem uma classe Pessoa representando uma pessoa qualquer. Veja como eu, no meu ponto de vista, organizaria essa classe:

public class Pessoa
{
    // #################
    //  Dados pessoais
    // #################
    private String nome;
    private int idade;

    // #############################################################
    //                                                CONSTRUTOR
    // #############################################################
    public Pessoa(String nome , int idade)
    {
          this.nome = nome;
          this.idade = idade;
    }

    // #############################################################
    //                                      MÉTODOS MODIFICADORES
    // #############################################################
    public void setNome(String nome){ this.nome = nome; }
    public void setIdade(int idade){ this.idade = idade; }

    // #############################################################
    //                                          MÉTODOS ACESSORES
    // #############################################################
    public String getNome(){ return this.nome; }
    public int getIdade(){ return this.idade; }

}

É muito importante manter o código o mais organizado o possível. Além de melhor visualização, você tem melhor entendimento do problema (a ponto de saber a resposta) e também tem vontade de programar em cima daquilo ali.

Se precisar de algo, estamos aqui. :wink:

Litium.

R

é possivel conhecer este jogo de space invaders… ??

R

segue aí meu joguinho de forca…
zip pois tem uma lib
coments? codes?

R

faltou as imagens que vai na pasta c:

L

E aí raghy.

Olá. Você perguntou sobre o meu jogo de “space invaders”, não foi? Bem, aqui tem um vídeo que eu coloquei na internet:

O jogo está bem simples mesmo com pouquíssima coisa de interessante (para quem já sabe fazer um jogo bobo como esse, por exemplo). Fiz muita coisa experimental nele só por fazer mesmo, sem a menor organização. Veja, estou tendo problemas nas colisões dos objetos e acredito que seja por estar trabalhando com imagens e elas terem um AffineTrasform para poderem funcionar. Ainda tem muita coisa que eu não sei fazer.

Por enquanto é só isso.

Litium.

R

mas nao tem como ver o jar ou o codigo quem sabe… para poder jogar mesmo?

tenho alguns jar… que fiz de jogos. quer? trocar, conhecer, sei la… ?

L

Oi raghy.

E aí, tudo bom? Rapaz, o meu código fonte não tem nada de monstruoso não para quem já trabalhou com alguma coisa de desenvolvimento de jogos. Eu tenho uma classe que estende JPanel e implementa Runnable. Essa classe é abstrata e tem dois métodos abtratos, um que atualiza os gráficos do jogo e outro que atualiza a lógica do jogo. Nas variáveis de instância eu tenho:

// Double Buffer.
private BufferedImage imgTela;
private Graphics2D grafTela;

// Dimensões de tela.
private int largura;
private int altura;

// Tarefa.
private boolean tarefaRodando;
private Thread tarefa;

O construtor dessa classe recebe parâmetros de largura e altura e inicia o double buffer e a Thread respectivamente. No meu método run, tenho um laço com a condição “while(isTarefaRodando){}” e dentro faço uma chamada para o método da própria classe de atualizar gráficos e lógica. Depois dou um “repaint()”, onde tem um método paint na própria classe que pinta a BufferedImage apenas, e por fim, “Thread.sleep();”.

Se eu quero que exista alguma classe para trabalhar com essas funções, eu apenas crio a classe e faço ela ser filha dessa classe aí de cima, no final, só tenho que me preocupar com o método de atualização gráfica e o outro de atualização lógica.

Também tenho uma com nome de, por exemplo, “EntidadeIMG” que tem posições X e Y e uma Image. Essa classe serve para pintar imagens sem animações na tela. Nada de mais.

Mas essa maneira que faço isso tudo, isso não está totalmente certo. Eu dessa forma não tenho como manter a velocidade do jogo constante dependendo do SO do jogador. Dei uma olhada no site do Vini (PontoV) e lá tem um artigo falando sobre o loop de animação de jogo com um tópico de “Velocidade Constante”. Problema é que tô custando para entender aquele tópico.

Com relação as imagens do jogo… As naves eu peguei de um site chamado “http://www.spriters-resource.com/”. Esse site tem imagens de vários objetos e personagens de vários jogos para muitos consoles. Dê uma olhada nele, ele é bem completo. Mas lembre-se que não é legal trabalhar com imagens de outras empresas que não te autorizaram a usá-la, isso caso você pretendar criar um jogo com elas e vender esse jogo no mercado.

Se você tem algum jogo feito em Java, mostra umas imagens aqui no fórum com a tag de imagem, ou coloca um vídeo para visualização. Aí a gente bate um papo cabeça sobre isso e troca conhecimento. Eu pelo menos, tô precisando de umas aulas sobre isso.

Té mais! :-o

Litium.

R

vou buscar meus jogos aqui, futuramente posto. neste post, ja tem o da forca, ja olhou[url]?

L

- CiladaBino

Se você está querendo dizer que jogos em Java não valem a pena de serem feitos, hehehehehehe… Cuidado que o pessoal daqui que gosta de programar jogos vai pegar no seu pé ein! :-o

Eu não vou falar nada pois não tenho tanta experiência assim em programação de jogos em Java. Mas quem entende do assunto, oh lá, ein!

Se você não quis dizer isso…

Não faço idéia do que você quis dizer… :frowning:

EDIT: Tinha um carinha aqui que postou um comentário falando algo como: “Jogo em Java? Isso é cilada bino”. Removeram o comentário dele? Hum…

Litium.

R

vc está falando de quem? de mim?

L

E aí raghy.

Não! não tava falando de você. Tinha um usuário aqui de nome CiladaBino que postou aquilo que falei ali em cima. O pessoal da moderação deve ter removido o post do cara. Atualmente não tenho tido tempo para ver muita coisa, agora mesmo tô no curso de redes aqui estudando. Faz que nem eu, coloca umas imagens aqui no fórum ou vídeos. Assim fica melhor para a gente ver. Sem contar que tenho muitos arquivos já para me preocupar aqui. Tantos projetos e tantas coisas no meu Eclipse… O loko… :shock:

Até.

Litium.

J

aew pessoal consegui... tava cheio de coisas para fazer que nem deu tempo para postar aqui...., o metado vai ler uma char

e vai exibir a JOptionPane asim

_ _ _ _ _ _ _

digite uma letra

[digite aqui]

e já vai alterando a propria janela..., agora vou fazer algumas alterações, colocar os metados numa class separada, fazer um contador de pontos, erros, e verificar se o char já foi digitado,.. mas isso só semana que vem, por que estou cheio de coisas da faculdade pra fazer.!!,
Obrigado a todos que me ajudaram...

public static void alterarTracos() {
        char letra;
        int i;
                
        do{
        String entrada = JOptionPane.showInputDialog(null, tracos+"\n \nDigite a Letra");
        letra = entrada.charAt(0);
            
     

        for (i = 0; i < palavra_completa.length(); i++) {
              if (palavra_completa.charAt(i) == letra) {  
            tracos = tracos.substring(0, 3*i+1) + letra + tracos.substring(3*i+2);
            
            
            
           
            
        }
        }



        }while(true);
L

E aí junior_pepis.

Fico feliz que tenha obtido sucesso em suas pesquisas e em seus estudos. Só uma observação:

1 - Não esqueça de organizar seu código!!! :shock:

Abraços e boa sorte nos estudos! :-o

Litium.

Criado 11 de abril de 2011
Ultima resposta 12 de abr. de 2011
Respostas 19
Participantes 4