示例#1
0
/*****************************************************************************
 * Movimenta uma carta de [A-H] para [W-Z]
 *****************************************************************************/
void movimentaNormalParaSuperiorEsquerda(Carta cartasSuperiorEsquerda[], Pilha* pilhasNormais[], unsigned short int indiceColunaOrigem, unsigned short int indiceColunaDestino, char mensagemErro[], unsigned short int *jogadaJogador){
  if(cartasSuperiorEsquerda[indiceColunaDestino].numero == 0){
    Carta cartaColunaOrigem = topoPilha(pilhasNormais[indiceColunaOrigem]);
    cartasSuperiorEsquerda[indiceColunaDestino] = cartaColunaOrigem;
    removePilha(pilhasNormais[indiceColunaOrigem]);
    (*jogadaJogador)++;
  } else {
    strcpy(mensagemErro, "As colunas [W-Z] so podem ter uma carta por vez.");
  }
}
示例#2
0
/*****************************************************************************
 * Movimenta uma carta de [A-H] para [A-H]
 *****************************************************************************/
void movimentaNormalParaNormal(Pilha* pilhasNormais[], unsigned short int indiceColunaOrigem, unsigned short int indiceColunaDestino, char mensagemErro[], unsigned short int *jogadaJogador){
  Carta cartaColunaOrigem = topoPilha(pilhasNormais[indiceColunaOrigem]);
  unsigned short int corCartaColunaOrigem = checaCorNaipe(cartaColunaOrigem.naipe);

  Carta cartaColunaDestino = topoPilha(pilhasNormais[indiceColunaDestino]);
  unsigned short int corCartaColunaDestino = checaCorNaipe(cartaColunaDestino.naipe);

  if(corCartaColunaDestino != corCartaColunaOrigem){
    if(cartaColunaOrigem.numero == cartaColunaDestino.numero-1 || pilhasNormais[indiceColunaDestino]->qntd == 0){
      inserePilha(pilhasNormais[indiceColunaDestino], cartaColunaOrigem);
      removePilha(pilhasNormais[indiceColunaOrigem]);
      (*jogadaJogador)++;
    } else {
      strcpy(mensagemErro, "Voce so pode agrupar cartas em ordem decrescente.");
    }
  } else {
    strcpy(mensagemErro, "Voce so pode agrupar cartas cujos naipes tenham cores diferentes.");
  }
}
示例#3
0
/*****************************************************************************
 * Movimenta uma carta de [A-H] para [0-3]
 *****************************************************************************/
void movimentaNormalParaSuperiorDireita(Pilha* pilhasNormais[], Pilha* pilhasSuperiorDireita[], unsigned short int indiceColunaOrigem, unsigned short int indiceColunaDestino, char mensagemErro[], unsigned short int *jogadaJogador, unsigned short int *colunasFormadas){
  Carta cartaColunaOrigem = topoPilha(pilhasNormais[indiceColunaOrigem]);
  Carta cartaColunaDestino = topoPilha(pilhasSuperiorDireita[indiceColunaDestino]);

  if(cartaColunaOrigem.naipe == cartaColunaDestino.naipe || pilhasSuperiorDireita[indiceColunaDestino]->qntd == 0){

    if(cartaColunaOrigem.numero == cartaColunaDestino.numero+1 || pilhasSuperiorDireita[indiceColunaDestino]->qntd == 0 && cartaColunaOrigem.numero == 1){
      (*jogadaJogador)++;
      inserePilha(pilhasSuperiorDireita[indiceColunaDestino], cartaColunaOrigem);
      removePilha(pilhasNormais[indiceColunaOrigem]);

      if(cartaColunaOrigem.numero == MAIOR_VALOR_CARTA){
        colunasFormadas++;
      }

    } else {
      strcpy(mensagemErro, "Nas colunas [0-3], voce so pode agrupar cartas em ordem crescente.");
    }
  } else {
    strcpy(mensagemErro, "Nas colunas [0-3], as cartas precisam ser sempre do mesmo naipe.");
  }
}
示例#4
0
void infixToPostfix(char expr[], Pilha *p, char post[]) {
    int i = 0;
    int count = 0;
    int abriuParentesis = 0; // flag para indicar se abriu parentesis
     
    // limpar o post
    post[0] = '\0';
     
    // para evitar: a+b+
    char ultimo = expr[strlen(expr) - 1];
     
     
    // Garante que a string possui somente caracteres validos
    i = 0;
    while (i < MAX && expr[i] != '\0' && expr[i] != '\n') {
        if (!operadorValido(expr[i])) {
            strcpy(post,"Lexical Error!");
            return;
        }
        i++;
    }
     
    i = 0;
    while (i < MAX && expr[i] != '\0' && expr[i] != '\n') {
        // do infix to postfix
        if (simbolo(expr[i])) {
             
            // para evitar: aa+bb, a(b+c)
            if (i+1 != MAX && (simbolo(expr[i + 1]) || expr[i + 1] == '(')) {
                strcpy(post,"Syntax Error!");
                return;
            }
             
            // concatena o na string posfixa
            post[count] = expr[i];
            post[count + 1] = '\0';
            count++;
        } else {
             
            // para evitar: a++b
            if (expr[i]=='(' && !simbolo(expr[i+1]) || (expr[i]!='(' && expr[i]!=')') && (expr[i+1]!='(' && expr[i+1]!=')') && !simbolo(expr[i+1]) ) {
                strcpy(post,"Syntax Error!");
                return;
            }
             
            if (pilhaVazia(p) || expr[i]=='(' || abriuParentesis) {
                inserePilha(p, expr[i]);
                abriuParentesis = expr[i] == '(' ? 1 : 0;
            } else if (expr[i] == ')') {
                while (!pilhaVazia(p) && topo(p) != '(') {
                    // remove da pilha e insere na string
                    post[count] = removePilha(p);
                    post[count + 1] = '\0';
                    count++;
                }
                 
                // caso encontre o '(' remove da pilha
                if (pilhaVazia(p)) {
                    strcpy(post,"Syntax Error!");
                    return;
                } else {
                    removePilha(p);
                    abriuParentesis = 0;
                }
             
            } else {
                if (temPrecedencia(topo(p), expr[i])) {
                    do {
                        post[count] = removePilha(p);
                        post[count + 1] = '\0';
                        count++;
                    } while (!pilhaVazia(p) && temPrecedencia(topo(p), expr[i]));
                   
                    inserePilha(p, expr[i]);
                } else {
                    inserePilha(p, expr[i]);
                }
            } 
        }
        i++;
    } 
     
    if (operadorValido(ultimo) && !simbolo(ultimo) && ultimo != ')') {
        strcpy(post,"Syntax Error!");
        return;
    }
     
    while(!(pilhaVazia(p))) {
        post[count] = removePilha(p);
        post[count + 1] = '\0';
        count++;
    }
     
    // verifica se faltou fechar algum parentesis
    for (i = 0; i < count; i++) {
        if (post[i] == '(') {
            strcpy(post,"Syntax Error!");
            return;
        }
    }
}