/***************************************************************************** * 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."); } }
/***************************************************************************** * 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."); } }
/***************************************************************************** * 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."); } }
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; } } }