Como eu chamo uma variável final em java?

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:

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.

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

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

1 curtida

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:

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 "</>".

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.

É 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

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.

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.

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

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.

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!

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)

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

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.