C#  -  Jogo : Pedra, Papel , Tesoura


Hoje temos um joguinho bem simples para relaxar. O Famoso Pedra, Papel, Tesoura ou jokenpô feito na linguagem C#.

Este jogo muito antigo também conhecido como Jokenpô é de origem japonesa e é muito fácil de jogar.

Para quem não sabe do que se trata, o jogo  pedra, papel e tesoura é um joguinho que se joga com as mãos, formando símbolos:

  1. punho fechado para pedra, 

  2. mão aberta para papel

  3. dedos indicador e médio em formato de “V”, para tesoura.

Os jogadores devem ficar com as mãos para trás e, ao sinal, mostram os símbolos escolhidos.

Quem ganha de quem ?

  • O papel ganha da pedra porque a embrulha;
  • A tesoura ganha do papel porque o corta e a pedra,
  • A pedra ganha da tesoura porque a quebra.

Simples assim, tudo que você tem que fazer é prever a estratégia do oponente.

No programa de exemplo você escolhe uma opção e aleatória o computador escolha a outra, e aplica-se as regras acima para indicar quem é o vencedor.

O programa usa o recurso de sintetizador de voz, usando os recursos da classe SpeechSynthesizer que lê os textos presentes nos arquivos: perdedor.txt, vencedor.txt, escolha.txt e saudações.txt que estão na pasta /bin/Debug do projeto.

Como este jogo é adaptado de um origem criado por Dave Bowlin deixei nos arquivos textos o texto original em inglês e a tradução.

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2019 Community e crie um novo projeto (File-> New Project) usando a linguagem VB .NET e o template Windows Forms Application.

Informe um nome a seu gosto. Eu vou usar o nome Pedra_Papel_Tesoura;

No formulário padrão Form1.cs inclua os controles :

  • 6 Labels

  • 6 PictureBox

  • 2 Buttons - btnIr e btnNovaGuia

  • 2 Timer

Disponha os controles conforme o leiaute da figura abaixo:

Vamos agora definir o código do formulário usando os eventos dos controles e a classe SpeechSynthesizer.

Definindo o código do projeto

Variáveis globais definidas no formulário

int venceu, perdeu, empate, compEscolha = 0;
SpeechSynthesizer sintVoz = new SpeechSynthesizer();

List<string> escolha;
List<string> vencedor;
List<string> perdedor;
List<string> saudacoes;

Random acaso = new Random();

1- Código do evento Load do formulário

       private void Form1_Load(object sender, EventArgs e)
        {
            GetVoz();
            timerContador.Interval = 3000;
            escolha = File.ReadAllLines(@"escolha.txt").ToList();
            vencedor = File.ReadAllLines(@"vencedor.txt").ToList();
            perdedor = File.ReadAllLines(@"perdedor.txt").ToList();
            saudacoes = File.ReadAllLines(@"saudacoes.txt").ToList();
            Saudacoes();
            NovoJogo();
        }

2- Código do método NovoJogo() :

        private void NovoJogo()
        {
            compEscolha = acaso.Next(1, 4);
            labelStatus.Text = "Fiz minha escolha, agora é você...";
            btn1.BackgroundImage = Properties.Resources.rock;
            btn2.BackgroundImage = Properties.Resources.paper;
            btn3.BackgroundImage = Properties.Resources.scissors;
            picComp1.Image = Properties.Resources.question;
            picComp2.Image = Properties.Resources.question2;
            picComp3.Image = Properties.Resources.question3;
            btn1.Enabled = true;
            btn2.Enabled = true;
            btn3.Enabled = true;
    }

3- Código do método GetVoz()

        private void GetVoz()
        {
            // obtem as vozes instaladas e escolhe uma 
            List<string> vozComputador = new List<string>();
            foreach(InstalledVoice voz in sintVoz.GetInstalledVoices())
            {
                VoiceInfo info = voz.VoiceInfo;
                vozComputador.Add(info.Name);
            }
            int x = acaso.Next(0, vozComputador.Count);
            string y = vozComputador[x];
            sintVoz.SelectVoice(y);
        }

3- Código dos métodos : Escolha(), Venceu(), Perdeu() e Saudacoes()

        private void Escolha()
        {
            int x = acaso.Next(0, escolha.Count);
            string y = escolha[x];
            labelStatus.Text = y;
            sintVoz.SpeakAsync(y);
        }
        private void Venceu()
        {
            int x = acaso.Next(0, vencedor.Count);
            string y = vencedor[x];
            labelStatus.Text = y;
            sintVoz.SpeakAsync(y);
        }
        private void Perdeu()
        {
            int x = acaso.Next(0, perdedor.Count);
            string y = perdedor[x];
            labelStatus.Text = y;
            sintVoz.SpeakAsync(y);
        }
        private void Saudacoes()
        {
            int x = acaso.Next(0, saudacoes.Count);
            string y = saudacoes[x];
            sintVoz.SpeakAsync(y);
        }

4- Código do evento Click do botão Btn1

Define conforme a escolha o recurso que vai carregar para exibir a imagem e ativar o sintetizador de voz:

        private void Btn1_Click(object sender, EventArgs e)
        {
            btn1.Enabled = false;
            btn2.BackgroundImage = Properties.Resources.x;
            btn3.BackgroundImage = Properties.Resources.x;
            btn2.Enabled = false;
            btn3.Enabled = false;
            switch (compEscolha)
            {
                case 1:
                    empate++;
                    picComp1.Image = Properties.Resources.rock;
                    Escolha();
                    labelTie.Text = empate.ToString();
                    timerContador.Start();
                    break;
                case 2:
                    perdeu++;
                    picComp2.Image = Properties.Resources.paper;
                    Perdeu();
                    labelLscore.Text = perdeu.ToString();
                    timerContador.Start();
                    break;
                case 3:
                    venceu++;
                    picComp3.Image = Properties.Resources.scissors;
                    Venceu();
                    labelWScore.Text = venceu.ToString();
                    timerContador.Start();
                    break;
                default:
                    labelStatus.Text = "Umm... vamos tentar de novo.";
                    timerContador.Start();
                    break;
            }
        }

5- Código do evento Click do botão Btn2

       private void Btn2_Click(object sender, EventArgs e)
        {
            btn2.Enabled = false;
            btn1.BackgroundImage = Properties.Resources.x;
            btn3.BackgroundImage = Properties.Resources.x;
            btn1.Enabled = false;
            btn2.Enabled = false;
            switch (compEscolha)
            {
                case 1:
                    venceu++;
                    picComp1.Image = Properties.Resources.rock;
                    Venceu();
                    labelWScore.Text = venceu.ToString();
                    timerContador.Start();
                    break;
                case 2:
                    empate++;
                    picComp2.Image = Properties.Resources.paper;
                    Escolha();
                    labelTie.Text = empate.ToString();
                    timerContador.Start();
                    break;
                case 3:
                    perdeu++;
                    picComp3.Image = Properties.Resources.scissors;
                    Perdeu();
                    labelLscore.Text = perdeu.ToString();
                    timerContador.Start();
                    break;
                default:
                    labelStatus.Text = "Umm... vamos tentar novamente.";
                    timerContador.Start();
                    break;
            }
        }

6- Código do evento Click do botão Btn3

        private void Btn3_Click(object sender, EventArgs e)
        {
            btn3.Enabled = false;
            btn1.BackgroundImage = Properties.Resources.x;
            btn2.BackgroundImage = Properties.Resources.x;
            btn1.Enabled = false;
            btn2.Enabled = false;
            switch (compEscolha)
            {
                case 1:
                    perdeu++;
                    picComp1.Image = Properties.Resources.rock;
                    Perdeu();
                    labelLscore.Text = perdeu.ToString();
                    timerContador.Start();
                    break;
                case 2:
                    venceu++;
                    picComp2.Image = Properties.Resources.paper;
                    Venceu();
                    labelWScore.Text = venceu.ToString();
                    timerContador.Start();
                    break;
                case 3:
                    empate++;
                    picComp3.Image = Properties.Resources.scissors;
                    Escolha();
                    labelTie.Text = empate.ToString();
                    timerContador.Start();
                    break;
                default:
                    labelStatus.Text = "Umm... vamos tentar de novo.";
                    timerContador.Start();
                    break;
            }
        }

Executando o projeto teremos o seguinte resultado:

Temos assim um jogo bem simples feito com poucos recursos.

Pegue o projeto do jogo aqui :  Pedra_Papel_Tesoura.zip

"E (Jesus) disse-lhes: Acautelai-vos e guardai-vos da avareza; porque a vida de qualquer não consiste na abundância do que possui.""
Lucas 12:15

 

 

Referências:


José Carlos Macoratti