int main() { int joga; inicializa(); joga=primeiraJogada();//buga quando ninguém tem a primeira peça //1 = maquina joga; 0 = Player joga do{ system("clear"); if (joga == 0){ joga=jogando(); if(contaLista(playerHand)==0){ system("clear"); printf("\nVocê Ganhou!\n"); break; } } else if (joga == 1){ joga=AI(); if(contaLista(machineHand)==0){ system("clear"); printf("você perdeu!\n"); break; } } } while (1); return 0; }
void imprimeLista(lista *inicio, int posLista, int posLista2, int enter) { lista *aux; int i = 1, numLista; aux = inicio; numLista = contaLista(inicio); printf("\n______________"); printf("\n| Lista"); printf("\n|-------------"); printf("\n|pos| Valores"); printf("\n|-------------"); while (aux != NULL) { printf("\n| %d | %d", i, aux->valor); if ((posLista > 0 && posLista <= numLista) || posLista2 > 0 && posLista2 <= numLista){ if (i == posLista || i == posLista2){ printf(" <---"); } } printf("\n|-------------"); aux = aux->prox; i++; } printf("\nSua lista retornou com %d nodos.", numLista); if (enter == 1){ printf("\nPressione ENTER para continuar.."); getch(); } }
lista *inserePosN(lista *inicio){ lista *novo, *anterior, *proximo; int num, pos; int numLista = contaLista(inicio); do{ printf("\nInsira a posicao da lista na qual voce deseja adicionar um nodo: "); scanf("%d", &pos); if (pos < 0 || pos > numLista+1){ printf("\nA lista possui %d posicoes, insira uma posicao compativel para inserir um nodo!"); } } while (pos < 0 || pos > numLista+1); if (isPrimeiro(pos)){ inicio = insereInicio(inicio); } else if (pos == numLista+1){ inicio = insereFim(inicio); } else{ printf("\nDigite um valor para inserir no novo nodo: "); scanf("%d", &num); novo = getMallocLista(); anterior = pegaNodoN(inicio, pos - 1); proximo = pegaNodoN(inicio, pos + 1); if (novo != 0){ novo->valor = num; novo->prox = anterior->prox; anterior->prox = novo; } imprimeLista(inicio, pos, 0, 1); } return inicio; }
lista *insereFim(lista *inicio) { lista *novo, *aux; int num; aux = inicio; printf("\nDigite um valor para inserir no novo nodo: "); scanf("%d", &num); novo = getMallocLista(); if (novo != 0){ novo->valor = num; novo->prox = NULL; if (aux == NULL){ inicio = novo; } else{ while (aux->prox != NULL){ aux = aux->prox; } aux->prox = novo; } } imprimeLista(inicio,contaLista(inicio), 0, 1); return inicio; }
bool isUltimo(lista *inicio, int pos){ if (pos == contaLista(inicio)){ return true; } else { return false; } }
void imprimeTela (){ int i; system("clear"); printf("peças da mesa: "); imprimePecas(mesa); printf("peças da mão: "); imprimePecas(playerHand);printf(" "); for(i=1; i<=contaLista(playerHand); i++) if(i<10)printf(" [%d] ", i);else printf(" [%d] ", i); printf("\n//////////////////////\n/ escolha uma peça /\n//////////////////////\n"); }
//Função que copia uma lista duplamente encadeada para um array //recebe o cabeçalho da lista e o endereço onde vai ser armazenada a quantidade de elementos //e retorna o cabeçalho do array Node *toArray(Node *noh, int *quantidade) { Node *pecas, *temp=noh; int i=0, tamanhoDaLista; *quantidade = contaLista(temp); tamanhoDaLista=contaLista(temp); if (quantidade == 0) return NULL; pecas=(Node *) malloc (tamanhoDaLista * sizeof (Node)); while (temp->right != NULL ) { pecas[i]=*temp; temp=temp->right; i++; } pecas[i]=*temp; return pecas; }
void trocaPos(lista *inicio){ int pos, pos2, numLista, confirma, aux; numLista = contaLista(inicio); if (numLista > 1){ do{ printf("\nInsira a posicao do nodo que deseja trocar: "); scanf("%d", &pos); if (pos < 1 || pos > numLista){ printf("\nA lista possui %d posicoes comecando pelo indice 1, o nodo selecionado não existe!", numLista); } } while (pos < 1 || pos > numLista); do{ printf("\nInsira a posicao do nodo que deseja trocar pelo primeiro: "); scanf("%d", &pos2); if (pos2 < 1 || pos2 > numLista){ printf("\nA lista possui %d posicoes comecando pelo indice 1, o nodo selecionado não existe!", numLista); } else if (pos2 == pos){ printf("\nInsira um valor diferente do primeiro!"); } } while ((pos < 1 || pos > numLista) || pos2 == pos); do{ imprimeLista(inicio, pos, pos2, 0); printf("\n\nDeseja trocar o nodos selecionados? (1.Sim - 0.Nao)"); scanf("%d", &confirma); if (confirma == 1){ aux = pegaNodoN(inicio, pos)->valor; pegaNodoN(inicio, pos)->valor = pegaNodoN(inicio, pos2)->valor; pegaNodoN(inicio, pos2)->valor = aux; } } while (confirma != 1 && confirma != 0); } else{ printf("\nPara trocar nodos de posicao voce precisa ter ao menos 2 nodos na lista!"); printf("\nPressione ENTER para continuar.."); getch(); } }
lista *deletaNodo(lista *inicio){ lista *anterior, *aux; int pos, confirma; int numLista = contaLista(inicio); if (numLista > 1){ do{ printf("\nInsira a posição do nodo que você quer excluir da lista: "); scanf("%d", &pos); if (pos < 1 || pos > numLista){ printf("\nA lista possui %d posicoes comecando pelo indice 1, insira uma posicao compativel para deletar um nodo!", numLista); } } while (pos < 1 || pos > numLista); if (isPrimeiro(pos)){ do{ imprimeLista(inicio, pos, 0, 0); printf("\n\nDeseja deletar o nodo selecionado? (1.Sim - 0.Nao)"); scanf("%d", &confirma); if (confirma == 1){ aux = pegaNodoN(inicio, 2); free(pegaNodoN(inicio, 1)); inicio = aux; } } while (confirma != 1 && confirma != 0); } else if (isUltimo(inicio, pos)){ do{ imprimeLista(inicio, pos, 0, 0); printf("\n\nDeseja deletar o nodo selecionado? (1.Sim - 0.Nao)"); scanf("%d", &confirma); if (confirma == 1){ aux = pegaNodoN(inicio, numLista); pegaNodoN(inicio, numLista - 1)->prox = NULL; free(aux); } } while (confirma != 1 && confirma != 0); } else{ do{ imprimeLista(inicio, pos, 0, 0); printf("\n\nDeseja deletar o nodo selecionado? (1.Sim - 0.Nao)"); scanf("%d", &confirma); if (confirma == 1){ anterior = pegaNodoN(inicio, pos - 1); aux = pegaNodoN(inicio, pos); anterior->prox = aux->prox; free(aux); } } while (confirma != 1 && confirma != 0); } } else{ imprimeLista(inicio, 1, 0, 0); printf("\n\nA sua lista possui apenas 1 nodo, deseja deletar ele? (1.Sim - 0.Nao)"); printf("\n(Se for deletado, o programa pedira para voce adicionar o primeiro nodo da lista de novo):\n"); scanf("%d", &confirma); if (confirma == 1){ inicio = NULL; } } return inicio; }
int jogando(){ Node *temp=mesa; int auxI, auxII,primeiroNumero=temp->numberLeft, ultimoNumero,jogada, i;//joga = 1, pesca = 0; //Salva os dois números das extremidades da lista de dominós na mesa. while (temp!=NULL){ ultimoNumero=temp->numberRight; temp=temp->right; } imprimeTela(); //esse loop verifica se existe uma peça compativel para a jogada, caso não, pesca e repete a verificação do { for(temp=playerHand; temp!=NULL; temp=temp->right) { if(temp->numberLeft == primeiroNumero || temp->numberRight == primeiroNumero || temp->numberLeft == ultimoNumero || temp->numberRight == ultimoNumero) break; } if(temp == NULL){ playerHand=pescaDoMonte(playerHand); imprimeTela(); printf("peça pescada por falta de jogadas possíveis!\n"); return 1; } break; }while (1); //esse loop pega a peça selecionada do{ scanf("%d", &jogada); if(jogada > 0 && jogada <= contaLista(playerHand)){ i=1; for (temp = playerHand; i<jogada; temp=temp->right) i++; if (temp->numberLeft == primeiroNumero || temp->numberRight == primeiroNumero || temp->numberLeft == ultimoNumero || temp->numberRight == ultimoNumero) break; else { imprimeTela(); printf("Jogada inválida! Escolha outra peça: \n"); continue; } } else continue; break; } while (1); //essa parte faz os reaponteiramentos para dar um "pull" de uma lista pra outra. if (temp->left == NULL && temp->right == NULL){ playerHand=NULL; temp->left=NULL; temp->right=NULL; } else if (temp->left == NULL ){ playerHand=playerHand->right; playerHand->left = NULL; temp->right=NULL; } else if (temp->right==NULL) { temp->left->right=NULL; temp->left=NULL; } else { temp->left->right= temp->right; temp->right->left= temp->left; temp->left=NULL; temp->right=NULL; } //falta excluir o nó da lista da mão do { printf("onde jogar?(1 - esquerda (%d); 2 - direita (%d)\n", primeiroNumero, ultimoNumero); scanf("%d", &jogada); if (jogada == 1) { if(temp->numberRight==primeiroNumero) { temp->right=mesa; mesa=temp; break; } else if (temp->numberLeft==primeiroNumero) { auxI=temp->numberLeft; auxII=temp->numberRight; temp->numberLeft=auxII; temp->numberRight=auxI; temp->right=mesa; mesa=temp; break; } else { printf("jogada invalida!\n"); continue; } } else { Node *ultimo; for (ultimo=mesa; ultimo->right!=NULL; ultimo=ultimo->right); if (temp->numberLeft==ultimoNumero){ ultimo->right=temp; temp->left=ultimo; break; } if (temp->numberRight==ultimoNumero) { auxI=temp->numberLeft; auxII=temp->numberRight; temp->numberLeft=auxII; temp->numberRight=auxI; ultimo->right=temp; temp->left=ultimo; break; } else { printf("jogada inválida!\n"); continue; } } } while (1); return 1; }