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