Como eu chamo uma variável final em java?

16 respostas
java
C

Estou estudando criação de jogos em java a pouco tempo. Estou criando um jogo baseado em texto os famosos Text-Adventure, porém eu queria criar uma variavel final para meu player, para que o valor maximo de vida não seja ultrapassado. Ex.: final int vida = 100; Entretanto quando eu quero chamar essa variavel final no codigo não consigo/não sei como executar… Alguém poderia me ajudar :slight_smile:

16 Respostas

S

O modificador final quando utilizado em variáveis determina que o valor atribuído àquela variável não pode ser alterado.
Acho que não é isso que você quer.

C

Ah sim. Pois é não é isso, na verdade eu quero criar uma vida para o player e que o valor dessa variavel não seja ultrapassado, por exemplo, a vida do meu player é de 100, dai ele toma um dano que o deixa com 92 de vida, caso eu tome uma poção que recupera 30 de hp o meu player vai ficar com 122, ultrapassando assim o 100 que ele começa. Eu queria algo que quando eu utilizasse a cura nao ultrapassasse os 100.
Espero que tenha intendi kkk

S

É só você fazer essa validação no seu método que aumenta o HP.

Exemplo:

void aumentarHp(int quantidade) {
    hp += quantidade;
    if (hp > 100) {
        hp = 100;
    }
}

Ou então

void aumentarHp(int quantidade) {
    hp = Math.min(100, hp + quantidade);
}
C

Valeu cara! Usei o primeiro e deu certo. Muito obrigado.

C

Cara, eu tenho outra duvida, no caso eu tava simulando resultado de futebol com dois times e tudo certo, porem quando adicionei mais times eu percebi que estava repetindo o mesmo time quando selecionado aleatoriamente, exemplo, timeA x timeB & timeA x timeC. Eu queria uma solucção que não repetisse os times, que fosse AxB e CxD. Pode me ajudar? :slight_smile: :slight_smile:

S

Não tem como adivinhar a forma que você implementou, posta o seu código atual e não esqueça de formatar ele com o botão "</>".

C
package football_text_adventure;

import java.util.Random;

public class Times {
		
		public static void main(String[] args) {
			Random rand = new Random();
			
			int placarTime1 = 0;
			int placarTime2 = 0;
			int placarTime3 = 0;
			int placarTime4 = 0;
			
			String[] times = {"Corinthians", "São Paulo", "Santos", "Palmeiras"};
			
			String time1 = times[rand.nextInt(times.length)];
			String time2 = times[rand.nextInt(times.length)];
			String time3 = times[rand.nextInt(times.length)];
			String time4 = times[rand.nextInt(times.length)];
			
			placarTime1 = rand.nextInt(10);
			placarTime2 = rand.nextInt(10);
			placarTime3 = rand.nextInt(10);
			placarTime4 = rand.nextInt(10);
			
				System.out.println("-----------------------------------------------------------------");
					
					System.out.println(time1 + " " + placarTime1 + " X " + placarTime2 +" " + time2);
					System.out.println(time3 + " " + placarTime3 + " X " + placarTime4 +" " + time4);
					System.out.println("-----------------------------------------------------------------");
					
					if((placarTime1 > placarTime2)&&(placarTime3 > placarTime4)) {
						System.out.println(time1 + " e " + time3 + " venceram!");
					}else if ((placarTime1 == placarTime2)&(placarTime3 == placarTime4)) {
						System.out.println(time1 + " e " + time2 + "\n" + time3 + " e " + time4 +  " empataram!");
					}else if((placarTime1 > placarTime2)&&placarTime3 == placarTime4) {
						System.out.println(time1 + " venceu e " + time3 + " e " + time4 + " empataram!");
					}else if((placarTime1 == placarTime2)&&placarTime3 > placarTime4) {
						System.out.println(time1 + " e " + time2 + " empataram e " + time3 + " venceu");
					}else if((placarTime1 > placarTime2)&&placarTime3 < placarTime4) {
						System.out.println(time1 + " e " +  time4 + " venceram!");
					}else if((placarTime1 == placarTime2)&&placarTime3 < placarTime4) {
						System.out.println(time1 + "  e " + time2 + " empataram e \n" + time4 + " venceu!");
					}else if((placarTime1 < placarTime2)&&placarTime3 > placarTime4) {
						System.out.println(time2 + "  e " + time3 +" venceram!");
					}else if((placarTime1 < placarTime2)&&placarTime3 == placarTime4) {
						System.out.println(time2 + " venceu e " + time3 + " e " + time4 + " empataram!");
					}else {
						System.out.println(time2 + " e " + time4 + " venceram!");
					}
				
		}
	
	
}

Quando carrego o codigo, tem vez que repete a String, eu tentei cria uma condição if(time1 == time2){ time1 = times[rand.nextInt(times.length)]; time2 = times[rand.nextInt(times.length)];
} porém não funcionou. Tentei tbm com while, mas não funciona, ainda repete.

H

É claro que vai repetir. Cada chamada de nextInt é “independente” e não há garantia nenhuma de que duas chamadas seguidas não retornem o mesmo número. É como jogar um dado duas vezes seguidas, pode ser que saia o mesmo número nas duas vezes (a chance é pequena, mas não é zero).

Uma abordagem mais simples é embaralhar o array, e depois você pega as posições fixas:

String[] times = {"Corinthians", "São Paulo", "Santos", "Palmeiras"};
Collections.shuffle(Arrays.asList(times)); // embaralha o array
// como agora está embaralhado, posso pegar as posições fixas
String time1 = times[0];
String time2 = times[1];
String time3 = times[2];
String time4 = times[3];

Como o array está embaralhado, eu posso pegar as posições fixas sem problema, assim eu garanto que não haverá repetição.

Para o placar, não tem problema continuar usando nextInt, já que o placar pode se repetir.


Dito isso, eu não gosto dessa solução de usar time1, time2, placarTime1, etc. E se mudar a quantidade de times, como você fará? Vai ficar criando trocentas variáveis novas? Sem contar a quantidade de if/else que terá que adicionar, o que ficará impraticável para verificar todas as possibilidades.

Quando você tem variáveis como “algumaCoisa1”, “algumaCoisa2”, etc, é um forte indício de que talvez deva usar arrays/listas. Aproveite e crie uma classe que representa um jogo, assim fica mais fácil deixar o código extensível para qualquer quantidade de times:

public class Jogo {
    private String time1, time2;
    private int placar1, placar2;
    public Jogo(String time1, String time2, int placar1, int placar2) {
        this.time1 = time1;
        this.time2 = time2;
        this.placar1 = placar1;
        this.placar2 = placar2;
    }

    public String placar() {
        return String.format("%s %d X %d %s", time1, placar1, placar2, time2);
    }

    public String descricao() {
        if (placar1 > placar2) {
            return String.format("%s venceu", time1);
        } else if (placar1 < placar2) {
            return String.format("%s venceu", time2);
        }
        return String.format("%s e %s empataram", time1, time2);
    }
}

Ou seja, a classe Jogo possui dois times e seus respectivos placares, além de métodos para retornar o placar formatado e o resultado (quem venceu ou empatou).

Desta forma, fica simples pegar o array de times e criar jogos a partir dele:

Random rand = new Random();
String[] times = {"Corinthians", "São Paulo", "Santos", "Palmeiras", "Guarani", "Ponte Preta", "Santo André", "São Bernardo"};
// cada jogo possui 2 times, então a quantidade de jogos é a metade da quantidade de times
Jogo[] jogos = new Jogo[times.length / 2];
// embaralha o array e distribui os times entre os jogos
Collections.shuffle(Arrays.asList(times));
for (int i = 0; i < jogos.length; i++) {
    jogos[i] = new Jogo(times[2 * i], times[2 * i + 1], rand.nextInt(10), rand.nextInt(10));
}

// mostra o placar de cada jogo
for (Jogo jogo : jogos) {
    System.out.println(jogo.placar());
}
System.out.println("-------------------------------------------------------------");
// mostra a descrição de cada jogo
for (Jogo jogo : jogos) {
    System.out.println(jogo.descricao());
}

Exemplo de saída (como o embaralhamento e os placares são aleatórios, obviamente será diferente a cada execução):

São Paulo 7 X 7 Ponte Preta
Santo André 8 X 3 Palmeiras
São Bernardo 8 X 2 Guarani
Santos 3 X 0 Corinthians
-------------------------------------------------------------
São Paulo e Ponte Preta empataram
Santo André venceu
São Bernardo venceu
Santos venceu
C

Cara muito obrigado! Eu estou iniciando no java e então estou testando coisas novas, por isso um código muito mal estruturado. Mas muito obrigado por me ajudar a sanar essa duvida.

C

No caso eu consigo trabalhar com esse mesmo codigo, porem ao inves de um Array ser com ArrayList? No caso eu criaria uma classes times e dentro da classe eu criaria um ArrayList. Por exemplo

public class Times {
		
	public static void main(String[] args) {
		ArrayList<String> times = new ArrayList<String>();
		times.add("Corinthians");
		times.add("São Paulo");
		times.add("Santos");
		times.add("Palmeiras");
		times.add("Botafogo");
		times.add("Flamengo");
		times.add("Fluminense");
		times.add("Vasco");
		times.add("Cruzeiro");
		times.add("Atlético Mineiro");
		times.add("América Mineiro");
		times.add("Boa Esporte");
		
	}
}

Eu fiz essa classe, porem nao estou sabendo chama-la no public class Game{} para realizar o sorteio.

H

Sim, em arrays você faz array[i] para pegar o elemento na posição i, e com listas você faz lista.get(i).

No seu caso, para embaralhar os times, basta fazer Collections.shuffle(times).

S

Em princípio essa classe parece desnecessária, até porque ela não tem nada, somente um método main com uma variável local.

É só você substituir essa linha aqui:

String[] times = {"Corinthians", "São Paulo", "Santos", "Palmeiras", "Guarani", "Ponte Preta", "Santo André", "São Bernardo"};

Pelo código que você fez no método main dessa classe Times.

C

Obrigado a vocês pela ajuda, mas como eu ainda sou iniciante infelizment não consegui executar o codigo com ArrayList, eu troquei o Array por uma ArrayList:

public static void main(String[] args) {
	    		  	
	 ArrayList times = new ArrayList();
	times.add("Corinthians");
	times.add("São Paulo");
	times.add("Santos");
	times.add("Palmeiras");
	times.add("Botafogo");
	times.add("Flamengo");
	    			times.add("Fluminense");
	times.add("Vasco");
	times.add("Cruzeiro");
	times.add("Atlético Mineiro");
	times.add("América Mineiro");
	times.add("Boa Esporte");
 // cada jogo possui 2 times, então a quantidade de jogos é a metade da quantidade de times
	 int jogos = times.size() / 2;
 // embaralha o array e distribui os times entre os jogos 
	 Collections.shuffle(times);
	  for (int i = 0; i < times.size(); i++) {
	   
        }

Cheguei até o for mas não consigo sair disso, não sei oq fazer mais kkk. Mas mesmo muito obrigado!

S

Falta fazer o mesmo que você havia feito com array.
Com array você acessa as posições assim:

meuArray[posicaoDesejada]

Com List vai acessar assim:

meuList.get(posicaoDesejada)
H

Não, vc tem que criar uma lista de jogos. Só que como listas são flexíveis, não precisa criar uma com o tamanho correto, dá pra ir adicionando dinamicamente.

Se usarmos a mesma classe Jogo que eu fiz acima, ficaria assim:

Random rand = new Random();
List<String> times = Arrays.asList("Corinthians", "São Paulo", "Santos", "Palmeiras",
        "Botafogo", "Flamengo", "Fluminense", "Vasco", "Cruzeiro", "Atlético Mineiro",
        "América Mineiro", "Boa Esporte");

// listas crescem dinamicamente, não precisa colocar o tamanho
List<Jogo> jogos = new ArrayList<>();
// embaralha a lista e distribui os times entre os jogos
Collections.shuffle(times);
for (int i = 0; i < times.size() / 2; i++) {
    jogos.add(new Jogo(times.get(2 * i), times.get(2 * i + 1), rand.nextInt(10), rand.nextInt(10)));
}

// O resto é igual
for (Jogo jogo : jogos) {
    System.out.println(jogo.placar());
}
System.out.println("-------------------------------------------------------------");
for (Jogo jogo : jogos) {
    System.out.println(jogo.descricao());
}

Outra alternativa é usar um Iterator:

List<String> times = Arrays.asList("Corinthians", "São Paulo", "Santos", "Palmeiras",
        "Botafogo", "Flamengo", "Fluminense", "Vasco", "Cruzeiro", "Atlético Mineiro",
        "América Mineiro", "Boa Esporte");
List<Jogo> jogos = new ArrayList<>();
Collections.shuffle(times);
Iterator<String> iterator = times.iterator();
while (iterator.hasNext()) {
    jogos.add(new Jogo(iterator.next(), iterator.next(), rand.nextInt(10), rand.nextInt(10)));
}

// o resto é igual

Um detalhe é que a quantidade de times deve ser um número par (o código não está verificando isso). Se não for, vai dar erro quando tentar montar o último jogo (pois vai tentar acessar um time que não existe).

C

Valeu cara, me ajudou bastante. Continuando no game de futebol, como eu posso fazer para pegar os times vencedores e realizar novos jogos? Aproveitando como crio um cronometro e depois que ele chegar a um determinado tempo ele acrescer mais um valor (igual a tempo do futebol quando dão acrescimos depois dos 45min ou 90min). Fiz o temporizador com sucesso só nao estou conseguindo acrescer um valor a mais.

obs: Esse valor seria obtido randomicamente entre 0 e 5.

Criado 19 de maio de 2022
Ultima resposta 9 de jun. de 2022
Respostas 16
Participantes 3