TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, void ( * ExcluirValor ) ( void * pDado ) ) { LIS_tppLista vtCasa[24]; // vetor de casas auxiliar tppPeca vtPecaB[15]; // vetor de peças brancas tppPeca vtPecaP[15]; //vetor de peças pretas int i, jb = 0,jp = 0; *pTab = (TAB_tppTabuleiro)malloc(sizeof(TAB_tpTabuleiro)); (*pTab)->Casas = LIS_CriarLista(ExcluirValor); /* Cria 15 peças brancas */ for(i = 0; i < 15; i++) { if(Pec_CriarPeca(&vtPecaB[i], 'b')!=Pec_CondRetOK) return TAB_CondRetErro; } /* Cria 15 peças pretas */ for(i = 0; i < 15; i++) { if(Pec_CriarPeca(&vtPecaP[i], 'p')!=Pec_CondRetOK) return TAB_CondRetErro; } /* Cria 24 listas que representam cada casa do tabuleiro*/ for(i = 0; i < 24; i++) vtCasa[i] = LIS_CriarLista(ExcluirValor); // Pretas LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; // Brancas LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; for(i = 0; i < 5; i++) { // Pretas LIS_InserirElementoApos(vtCasa[5], vtPecaP[jp]); jp++; LIS_InserirElementoApos(vtCasa[12], vtPecaP[jp]); jp++; // Brancas LIS_InserirElementoApos(vtCasa[11], vtPecaB[jb]); jb++; LIS_InserirElementoApos(vtCasa[18], vtPecaB[jb]); jb++; } for(i = 0; i < 3; i++) { // Pretas LIS_InserirElementoApos(vtCasa[7], vtPecaP[jp]); jp++; // Brancas LIS_InserirElementoApos(vtCasa[16], vtPecaB[jb]); jb++; } // Alocar as 24 casas na lista do tabuleiro for(i = 0; i < 24; i++) LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); return TAB_CondRetOK; }
BAR_tpCondRet BAR_AdicionarPeca(BAR_tppCapturadas pBAR) { char cor = pBAR->cor; tppPeca newPeca; if(Pec_CriarPeca(&newPeca, cor) != Pec_CondRetOK) { printf("Erro ao criar peca (BAR) \n"); return BAR_CondRetErro; } if(LIS_InserirElementoApos(pBAR->ListaCapturadas, newPeca) != LIS_CondRetOK) { printf("Erro ao inserir peça na lista (BAR) \n"); return BAR_CondRetErro; } pBAR->tamanho++; return BAR_CondRetOK; }
TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) { tppPeca pecatemp1, pecatemp2; char cor; LIS_tppLista listatemp; int mov = casaDestino - casaOrigem; // Checa a validade das casas de origem e destino if((casaOrigem < 0) || (casaOrigem > 23)) { printf("casaOrigem inválida \n"); return TAB_CondRetErro; } if((casaDestino < 0) || (casaDestino > 23)) { printf("casaDestino inválida \n"); return TAB_CondRetErro; } // Ir para a casa de origem IrInicioLista(pTab->Casas); LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); // Obter referência para a lista nela armazenada listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); // Obter a cor da peca na lista temp pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); // se pecatemp1 == NULL entao a lista está vazia if(pecatemp1 == NULL) { printf("casa de origem esta vazia \n"); return TAB_CondRetErro; } else // se nao { Pec_ObterCor(pecatemp1, &cor); } // Excluir uma peça da lista temp if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) { printf("Erro ao excluir peca da casa de orgiem\n"); return TAB_CondRetErro; } // Avança para a casa destino. LIS_AvancarElementoCorrente(pTab->Casas, mov); // Obtem a referencia para a lista nela armazenada listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); // Criar uma peça com a mesma cor q a peça antiga if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) { printf("Erro ao criar a peca na casa destino \n"); return TAB_CondRetErro; } // Adiciona esta peça na casa de destino if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) { printf("Erro ao adicionar peca na casa destino \n"); return TAB_CondRetErro; } return TAB_CondRetOK; }