dgadelha / Portugol-Webstudio

IDE online para o Portugol
https://portugol.dev
GNU General Public License v3.0
259 stars 51 forks source link

Problema com os operadores lógicos #244

Closed cristiantebaldi closed 2 months ago

cristiantebaldi commented 2 months ago

Descrição do problema

Estou fazendo um trabalho da faculdade sobre um jogo de cartas, porém identifiquei um problema com os operadores lógico "E" e o "OU"

Veja a estrutura:

linha 40: faca{ //lógica do código } linha 68: enquanto( )

Estou usando ao final a seguinte comparação:

_faça{ //lógica do código }enquanto(contador_vitoria_mao_jog1 != 3 ou _contador_vitoria_mao_jog2 != 3) //Porém não funciona

Essa duas variáveis globais: linha 33: _inteiro contador_vitoria_mao_jog1 = 0 linha 34: _inteiro contador_vitoria_mao_jog2 = 0

Elas são incrementadas na seguinte função: Linha: 187 _funcao vencedormao(){ //lógica do código } QUANDO UMA DELAS CHEGAR A 3 O JOGO DEVERIA PARAR

Então utilizo o operador lógico "OU" porém não funciona mas se utilizo a estrutura "E" funciona, mas não deveria.

Veja abaixo:

Estou usando ao final a seguinte comparação: _faça{ //lógica do código }enquanto(contador_vitoria_mao_jog_1 != 3 e contador_vitoria_mao_jog2 != 3) //Mas não poderia funcionar

Não sei se é alguma limitação do portugol ou eu que estou fazendo alguma coisa errada, mas testei vários métodos diferentes e o erro persiste acredito que algo esteja errado na IDE do PortugolWeb.

Código

programa {
  inclua biblioteca Util --> u
  inclua biblioteca Texto --> t
  inteiro contador = 0
  cadeia jogador1[3]
  cadeia jogador2[3]

  cadeia opcao
  cadeia jogador_1_menu
  cadeia jogador_2_menu

  inteiro jogada = 0
  inteiro acha_posicao = 0

  inteiro carta_escolhida_1 = 0
  inteiro carta_escolhida_2 = 0

  logico uso_da_carta[40]
  cadeia nome_de_cartas[40] = {
  "1 DE PAUS", "2 DE PAUS", "3 DE PAUS", "4 DE PAUS", "5 DE PAUS", "6 DE PAUS", "7 DE PAUS", "10 DE PAUS", "11 DE PAUS", "12 DE PAUS",
  "1 DE OURO", "2 DE OURO", "3 DE OURO", "4 DE OURO", "5 DE OURO", "6 DE OURO", "7 DE OURO", "10 DE OURO", "11 DE OURO", "12 DE OURO",
  "1 DE ESPADA", "2 DE ESPADA", "3 DE ESPADA", "4 DE ESPADA", "5 DE ESPADA", "6 DE ESPADA", "7 DE ESPADA", "10 DE ESPADA", "11 DE ESPADA", "12 DE ESPADA",
  "1 DE COPAS", "2 DE COPAS", "3 DE COPAS", "4 DE COPAS", "5 DE COPAS", "6 DE COPAS", "7 DE COPAS", "10 DE COPAS", "11 DE COPAS", "12 DE COPAS"}
  inteiro pontuacao_das_cartas[40] = {
  39, 36, 37, 28, 29, 30, 31, 32, 33, 34,
  35, 36, 37, 28, 29, 30, 37, 32, 33, 34,
  40, 36, 37, 28, 29, 30, 38, 32, 33, 34,
  35, 36, 37, 28, 29, 30, 31, 32, 33, 34}

  inteiro pontos_jogador1 = 0
  inteiro pontos_jogador2 = 0

  inteiro contador_vitoria_mao_jog_1 = 0
  inteiro contador_vitoria_mao_jog_2 = 0

  funcao inicio() {
    inteiro mao = 1

    menu()
    faca{
      escreva("\n-------- VAMO INCIAR A: ", mao++, "ª MÃO ---------")
      entrega_tres_cartas(jogador1)
      entrega_tres_cartas(jogador2)
      para(inteiro rodada = 1; rodada < 4; rodada++) {
        escreva("\n\n:::: JOGADA ", rodada, " :::::\n")
        escreva("VEJA SUAS CARTAS: ", jogador_1_menu, "\n")
        mostra_carta_para_jogadores(jogador1)
        escreva("QUAL VOCÊ DESEJA JOGAR: ")
        leia(jogada)
        verificar_erro()
        encontra_pontuacao_da_carta(jogador1)
        verifica_jogada(jogador1, verdadeiro)
        // Jogador 2
        escreva("\n\nVEJA SUAS CARTAS: ", jogador_2_menu, "\n")          
        mostra_carta_para_jogadores(jogador2)
        escreva("QUAL VOCÊ DESEJA JOGAR: ")
        leia(jogada)
        verificar_erro()
        encontra_pontuacao_da_carta(jogador2)
        verifica_jogada(jogador2, falso)
        // Resultado da rodada
        vitoria_da_mao()
      }
      // Resultado final do jogo
      vencedor_mao()
      reseta_cartas()
      placar_do_jogo()
    }enquanto(contador_vitoria_mao_jog_1 != 3 e contador_vitoria_mao_jog_2 != 3) //Comparação errada
    verifica_ganhador()
  }

  funcao cadeia entrega_tres_cartas(cadeia vetor[]){
    inteiro carta_sorteada
    para(contador = 0; contador < 3; contador){
      carta_sorteada = u.sorteia(0, 39)
      se(uso_da_carta[carta_sorteada] == verdadeiro){
      }senao{
          vetor[contador] = nome_de_cartas[carta_sorteada]
          contador++
          uso_da_carta[carta_sorteada] = verdadeiro
        }  
      }
    retorne vetor
  }

  funcao verifica_ganhador(){
    escreva("\nJOGO FINALIZADO! \n")
    se(contador_vitoria_mao_jog_1 > contador_vitoria_mao_jog_2){
      escreva("PARABÉNS, JOGADOR 1!")
    }senao{
      escreva("PARABÉNS, JOGADOR 2!")
    }
  }

  funcao reseta_cartas(){
    para(inteiro i = 0; i < 40; i++){
      uso_da_carta[i] = falso
    }
    pontos_jogador1 = 0
    pontos_jogador2 = 0
  }

  funcao placar_do_jogo(){
    escreva("\n__ACOMPANHE O PLACAR DO JOGO__\n")
    escreva("JOGADOR 01: ", contador_vitoria_mao_jog_1)
    escreva("\nJOGADOR 02: ", contador_vitoria_mao_jog_2)
  }

  funcao vitoria_da_mao(){
    se(carta_escolhida_1 > carta_escolhida_2){
      escreva("\n\nVITÓRIA! PLAYER 01")
      pontos_jogador1++
    }
    senao se(carta_escolhida_2 > carta_escolhida_1){
      escreva("\n\nVITÓRIA! PLAYER 02")
      pontos_jogador2++
    }
    senao{
      escreva("\n\nEMPATE")
    }
  }

  funcao cadeia mostra_carta_para_jogadores(cadeia jogador[]){
    para(inteiro i = 0; i < 3; i++){
      se(jogador[i] != " "){
        escreva("[",i + 1,"] ", jogador[i], "\n")
      }
    }
    retorne jogador
  }

  funcao cadeia encontra_pontuacao_da_carta(cadeia jogador[]){
    para(inteiro i = 0; i < 40; i++){
      se(jogador[jogada - 1] == nome_de_cartas[i]){
        acha_posicao = i
      }
    }
    retorne jogador
  }

  funcao verifica_jogada(cadeia jogador[], logico carta_escolhida){
    se(jogada == 1){
      escreva(jogador[0], " --> ", pontuacao_das_cartas[acha_posicao], " PONTOS")
       se(carta_escolhida){
        carta_escolhida_1 = pontuacao_das_cartas[acha_posicao]
      }senao{
        carta_escolhida_2 = pontuacao_das_cartas[acha_posicao]
      }
      jogador[0] = " "
    }
    se(jogada == 2){
      escreva(jogador[1], " --> ", pontuacao_das_cartas[acha_posicao], " PONTOS")
       se(carta_escolhida){
        carta_escolhida_1 = pontuacao_das_cartas[acha_posicao]
      }senao{
        carta_escolhida_2 = pontuacao_das_cartas[acha_posicao]
      }
      jogador[1] = " "
    }
    se(jogada == 3){
      escreva(jogador[2], " --> ", pontuacao_das_cartas[acha_posicao], " PONTOS")
       se(carta_escolhida){
        carta_escolhida_1 = pontuacao_das_cartas[acha_posicao]
      }senao{
        carta_escolhida_2 = pontuacao_das_cartas[acha_posicao]
      }
      jogador[2] = " "
    }
  }

  funcao menu(){
    escreva("::::::::: MENU :::::::::\n")
    escreva("OLÁ!!!\n","SEJA BEM-VINDO[A] AO NOSSO JOGO\n", "[S] - Sim ou [N] - Não\n","DESEJA INICIAR O JOGO? ")
    leia(opcao)
    opcao = t.caixa_alta(opcao)
    se(opcao == "S" ou opcao == "SIM"){
      limpa()
      escreva("--> ÓTIMO! INSIRA OS JOGADORES <--\n")
      escreva("DIGITE O NOME DO 1º JOGADOR: ")
      leia(jogador_1_menu)
      escreva("DIGITE O NOME DO 2º JOGADOR: ")
      leia(jogador_2_menu)
    }
    escreva("\nPLAYER 01: ", jogador_1_menu, "\nPLAYER 02: ", jogador_2_menu, "\n")
  }

  funcao vencedor_mao(){
    escreva("\n\n:::: RESULTADO FINAL :::::\n")
    escreva("Pontuação do Jogador 1: ", pontos_jogador1, "\n")
    escreva("Pontuação do Jogador 2: ", pontos_jogador2, "\n")
    se(pontos_jogador1 > pontos_jogador2) {
      escreva("VITÓRIA DA MÃO! JOGADOR 1")
      contador_vitoria_mao_jog_1++
    } senao se(pontos_jogador2 > pontos_jogador1) {
      escreva("VITÓRIA DA MÃO! JOGADOR 2")
      contador_vitoria_mao_jog_2++
    } senao {
      escreva("EMPATE FINAL")
    }
  }

  funcao verificar_erro(){
    enquanto(jogada > 3 ou jogada < 1){
      escreva("OPS! OPÇÃO INVÁLIDA\n")
      escreva("QUAL VOCÊ DESEJA JOGAR: ")
      leia(jogada)
    }
  }
}

Comentários adicionais

No response