Como travar um valor em C#?

E aí pessoal!
Estava fazendo um exercício em C# que consistia basicamente em simular uma arminha de game. Criar uma variável int com a quantidade de munição (20); a cada disparo esse valor cai em 1 e é possível recarregar (o valor volta para 20). Simples.
O problema é que, para evitar que esse valor ficasse negativo depois de chegar a 0, tive de fazer um if para o disparo, do tipo “só disparar se a munição for maior que 0”.
Mas queria que a condição (ou outra solução) fosse sobre a munição, e não sobre a função disparar. Algo do tipo “se munição chegar a 0, travar decaimento”, mas não faço ideia de como.
Como fazer isso? Como travar ou fixar um valor em um certo ponto?

Eu não vejo nada de errado com o método atual, mas você poderia fazer uma classe Munição para guardar o valor atual e com um método Consumir() (ou algum nome melhor) que retorna bool.

O Consumir checaria se o valor atual é == 0, se sim, retorna false.
Se for maior, diminui um e retorna true.
No disparar, vc chamaria

//Som de gatilho pressionado
if (municao.Consumir()) {
   //Lógica de bala saindo da arma
} else {
    //Som de sem munição
}
1 curtida

Putz cara, essa é uma boa! não tinha pensado nisso. Seria uma forma de colocar a restrição na munição.
Só ficaria menos econômico em termos de linha de código…
Fiquei vasculhando a semana inteira por uma função mais simples que só “travasse” o valor e não encontrei nada.

Mas por que você precisaria que fosse dessa forma?

Primeiro por curiosidade, mas principalmente pra fazer sentido. Colocar uma condição sobre a função disparar funciona, mas pareceu uma gambiarra. Se a munição não pode ficar negativa, então faz sentido criar alguma restrição sobre a munição, e não sobre a função de disparo. Entende?

Por que gambiarra?

Em quais situações a quantidade de munição pode mudar? Pelo que entendi, somente em duas: ao disparar e ao recarregar.

Então pra mim faz todo sentido que essas funções sejam responsáveis por verificar se a quantidade de munição atual permite que a operação seja feita.

Comece simples, fazendo a munição ser um número inteiro, e coloque o if no método que dispara. Não tem problema nenhum nisso.

Se posteriormente você tiver a necessidade de fazer uma classe para a munição, aí talvez possa passar o controle para ela. Mas baseado na descrição atual (e sem saber se há mais requisitos), não vejo motivo para complicar…

1 curtida

Dentro do princípio da modelagem do mundo real, a munição não conta se ela mesma existe. Nem o pente verifica se tem munição: a mola apenas empurra o cartucho (ou o apoio) para ser municiado na câmara.

A verificação é feita após o disparo: se não há munição na câmara, o ferrolho trava atrás, com a câmara exposta para indicar o fim da munição.

Então a verificação é feita ao tentar disparar. Não é a munição que, ao sair do pente, olha pra outra e dá tchau igual a um teletubbie; e a que fica olha pro operador e pede para não ser utilizada; ou a última sai soltando purpurina para avisar que saiu. Não é assim que acontece.

Portanto o Hugo está correto na indicação dele.
:wink:

Uma sugestão: não enfeite. Deixe teu código simples, direto e objetivo. Se tiver muito arrudeio, vai ser difícil de fazer manutenção e, se estiver trabalhando em equipe, seus colegas vão se confundir com a lógica que você usou.

1 curtida

Sim, é como o código está, com um if no método que dispara, como eu disse no início. É que eu não sei como anexar o código aqui, mas o trecho está assim:

private void btn_atirar_Click(object sender, EventArgs e)
{
if (balas > 0 )
{
balas–;
lbl_municao.Text = balas.ToString();
}

Sua colocação faz todo sentido, mas aqui não tem a questão da “necessidade” porque não é nenhum trabalho ou coisa do tipo. Estou só sendo curioso e procurando aprender. Por isso perguntei sobre um método que travasse o valor em vez de fazer um if.

Calma cara, a pergunta é bem mais simples: eu só quero saber se há um método que limite um valor a descer até certo ponto. Sei as boas práticas de programação e isso não é um trabalho nem nada ahauhsau…
Conforme eu disse, o if já está no disparo. Eu é que quero fazer de outro jeito, por pura vontade de aprender.
Inclusive, fiz como o primeiro rapaz indicou, criando uma classe, e ficou incrível.

É basicamente assim: