Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 00002 #define MINLINHA 1 00003 #define MAXLINHA 8 00004 #define MINCOLUNA 1 00005 #define MAXCOLUNA 8 00006 #define PEDRA_NORMAL_JOGADOR1 '1' 00007 #define PEDRA_NORMAL_JOGADOR2 '2' 00008 #define PEDRA_DAMA_JOGADOR1 '3' 00009 #define PEDRA_DAMA_JOGADOR2 '4' 00010 #define VAZIO 'S' 00011 #define JOGADA 'J' 00012 #define CAPTURADA 'C' 00013 #define BORDA " " 00014 00015 #define VITORIAS 0 00016 #define EMPATES 1 00017 #define DERROTAS 2 00018 00019 #define HUMANO1 '1' 00020 #define HUMANO2 '2' 00021 #define MAQUINA1 '3' 00022 #define MAQUINA2 '4' 00023 00024 #define NOME_HUMANO1 "HUMANO1" 00025 #define NOME_HUMANO2 "HUMANO2" 00026 #define NOME_MAQUINA1 "MAQUINA1" 00027 #define NOME_MAQUINA2 "MAQUINA2" 00028 #define TAM_NOME 30 00029 00030 #define ASCII_PEDRA_NORMAL 'O' 00031 #define ASCII_PEDRA_DAMA 'D' 00032 00033 #define ENTER 13 00034 00035 //#define __PC__ 1 00036 #define __EMBARCADO__ 1 00037 00038 #ifdef __PC__ 00039 #define _CRT_SECURE_NO_WARNINGS 00040 #include <stdio.h> 00041 #include <memory.h> 00042 #include <stdlib.h> 00043 #include <windows.h> 00044 #include <conio.h> 00045 #include <string.h> 00046 #define PRINTF _cprintf 00047 #define SLEEP sleep 00048 #define FIM_DE_LINHA "\n" 00049 #define GETCHE _getche 00050 00051 #define ASCII_BLOCK 219 00052 #define ASCII_BORDER_H 205 00053 #define ASCII_BORDER_V 186 00054 #define ASCII_BORDER_TL 201 00055 #define ASCII_BORDER_TR 187 00056 #define ASCII_BORDER_BL 200 00057 #define ASCII_BORDER_BR 188 00058 00059 HANDLE hConsoleHandle; 00060 CONSOLE_SCREEN_BUFFER_INFO *ConsoleInfo; 00061 00062 #define BACKGROUND_WHITE (BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE) 00063 #define FOREGROUND_WHITE (FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE) 00064 #define BACKGROUND_BLACK 0 00065 #define FOREGROUND_BLACK 0 00066 00067 #define COR_FUNDO_BORDA BACKGROUND_BLUE 00068 #define COR_TEXTO_BORDA FOREGROUND_WHITE 00069 00070 #define COR_FUNDO_CASA_SEM_PEDRA BACKGROUND_WHITE 00071 #define COR_TEXTO_CASA_SEM_PEDRA FOREGROUND_WHITE 00072 00073 #define COR_FUNDO_CASA_COM_PEDRA BACKGROUND_GREEN 00074 #define COR_TEXTO_CASA_COM_PEDRA_VAZIO FOREGROUND_GREEN 00075 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR1 FOREGROUND_WHITE 00076 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR2 FOREGROUND_RED 00077 00078 #define COR_FUNDO_CASA_COM_PEDRA_CAPTURADA (BACKGROUND_GREEN|BACKGROUND_INTENSITY) 00079 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_VAZIO (BACKGROUND_GREEN|BACKGROUND_INTENSITY) 00080 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1 (COR_TEXTO_CASA_COM_PEDRA_JOGADOR1|BACKGROUND_INTENSITY) 00081 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2 (COR_TEXTO_CASA_COM_PEDRA_JOGADOR2|BACKGROUND_INTENSITY) 00082 00083 #define COR_FUNDO_CASA_COM_PEDRA_JOGADA BACKGROUND_BLACK 00084 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO BACKGROUND_BLACK 00085 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR1 COR_TEXTO_CASA_COM_PEDRA_JOGADOR1 00086 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR2 COR_TEXTO_CASA_COM_PEDRA_JOGADOR2 00087 00088 #define COR_FUNDO_MENSAGEM BACKGROUND_BLACK 00089 #define COR_TEXTO_MENSAGEM FOREGROUND_WHITE 00090 00091 00092 #else 00093 #include "mbed.h" 00094 #include "Terminal.h" 00095 00096 //Serial pc( USBTX, USBRX); 00097 Terminal term(USBTX, USBRX); // tx, rx 00098 //#define PRINTF pc.printf 00099 #define PRINTF term.printf 00100 #define SLEEP Thread::wait 00101 #define FIM_DE_LINHA "\r\n" 00102 #define GETCHE pega_tecla_echo 00103 00104 #define ASCII_BLOCK 219 00105 #define ASCII_BORDER_H 205 00106 #define ASCII_BORDER_V 186 00107 #define ASCII_BORDER_TL 201 00108 #define ASCII_BORDER_TR 187 00109 #define ASCII_BORDER_BL 200 00110 #define ASCII_BORDER_BR 188 00111 00112 #define WHITE 0xFFFFFF 00113 #define WHITE_DIFERENCIADO 0x888888 00114 #define BLACK 0x000000 00115 #define GREEN 0x00FF00 00116 #define GREEN_DIFERENCIADO 0x008800 00117 #define BLUE 0x0000FF 00118 #define BLUE_DIFERENCIADO 0x000088 00119 #define RED 0xFF0000 00120 #define RED_DIFERENCIADO 0x880000 00121 00122 #define COR_FUNDO_BORDA BLUE 00123 #define COR_TEXTO_BORDA WHITE 00124 00125 #define COR_FUNDO_CASA_SEM_PEDRA WHITE 00126 #define COR_TEXTO_CASA_SEM_PEDRA WHITE 00127 00128 #define COR_FUNDO_CASA_COM_PEDRA GREEN 00129 #define COR_TEXTO_CASA_COM_PEDRA_VAZIO GREEN 00130 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR1 WHITE 00131 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR2 RED 00132 00133 #define COR_FUNDO_CASA_COM_PEDRA_CAPTURADA GREEN_DIFERENCIADO 00134 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_VAZIO GREEN_DIFERENCIADO 00135 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1 WHITE_DIFERENCIADO 00136 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2 RED_DIFERENCIADO 00137 00138 #define COR_FUNDO_CASA_COM_PEDRA_JOGADA BLACK 00139 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO BLACK 00140 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR1 COR_TEXTO_CASA_COM_PEDRA_JOGADOR1 00141 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR2 COR_TEXTO_CASA_COM_PEDRA_JOGADOR2 00142 00143 #define COR_FUNDO_MENSAGEM BLACK 00144 #define COR_TEXTO_MENSAGEM WHITE 00145 00146 00147 #endif 00148 00149 char tabuleiro_controle[MAXLINHA][MAXCOLUNA], tabuleiro_jogada[MAXLINHA][MAXCOLUNA]; 00150 int jogadas = 0; 00151 int jogada_em_que_ultima_pedra_capturada = 0; 00152 int jogada_em_que_ultima_pedra_nomal_movimentada = 0; 00153 int jogada_empate_lances_especiais = 0; 00154 int placar[4][3]; 00155 //int numero_pedras_para_capturar = -1; 00156 00157 int numero_pedras_capturadas_jogador1 = 0; 00158 int numero_pedras_capturadas_jogador2 = 0; 00159 00160 int numero_pedras_capturadas_antes_jogador1 = 0; 00161 int numero_pedras_capturadas_antes_jogador2 = 0; 00162 00163 #ifdef __EMBARCADO__ 00164 00165 char pega_tecla_echo(void) { 00166 char retorno; 00167 00168 //retorno = pc.getc(); 00169 retorno = term.getc(); 00170 //pc.putc(retorno); 00171 term.putc(retorno); 00172 return retorno; 00173 } 00174 00175 #endif 00176 00177 void SELECIONA_COR(int cor_fundo, int cor_texto) { 00178 00179 #ifdef __PC__ 00180 SetConsoleTextAttribute(hConsoleHandle, cor_fundo | cor_texto); 00181 #else 00182 term.foreground(cor_texto); 00183 term.background(cor_fundo); 00184 #endif 00185 00186 } 00187 00188 void LOCATE(int coluna, int linha) { 00189 00190 #ifdef __PC__ 00191 COORD coordScreen; 00192 00193 coordScreen.X = coluna; 00194 coordScreen.Y = linha; 00195 SetConsoleCursorPosition(hConsoleHandle, coordScreen); 00196 #else 00197 term.locate(coluna, linha); 00198 #endif 00199 00200 } 00201 00202 00203 int lerIteiro(void) { 00204 00205 char buffer[100+1]; 00206 int indice; 00207 char lido; 00208 00209 memset(buffer, 0, sizeof(buffer)); 00210 00211 for(indice = 0; indice < sizeof(buffer) - 1; ++indice) { 00212 lido = GETCHE(); 00213 00214 if(lido == ENTER) { 00215 break; 00216 } else { 00217 buffer[indice] = lido; 00218 } 00219 } 00220 00221 return(atoi(buffer)); 00222 } 00223 00224 #ifdef __PC__ 00225 00226 void cls(HANDLE hConsole) 00227 { 00228 COORD coordScreen = { 0, 0 }; /* here's where we'll home the 00229 cursor */ 00230 BOOL bSuccess; 00231 DWORD cCharsWritten; 00232 CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */ 00233 DWORD dwConSize; /* number of character cells in 00234 the current buffer */ 00235 00236 /* get the number of character cells in the current buffer */ 00237 00238 SetConsoleTextAttribute(hConsoleHandle, ConsoleInfo->wAttributes); 00239 00240 bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi); 00241 dwConSize = csbi.dwSize.X * csbi.dwSize.Y; 00242 00243 /* fill the entire screen with blanks */ 00244 00245 bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR) ' ', 00246 dwConSize, coordScreen, &cCharsWritten); 00247 00248 /* get the current text attribute */ 00249 00250 bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi); 00251 00252 /* now set the buffer's attributes accordingly */ 00253 00254 bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes, 00255 dwConSize, coordScreen, &cCharsWritten); 00256 00257 /* put the cursor at (0, 0) */ 00258 00259 bSuccess = SetConsoleCursorPosition(hConsole, coordScreen); 00260 return; 00261 } 00262 00263 void LimparTela(void) { 00264 //system("CLS"); 00265 cls(hConsoleHandle); 00266 } 00267 00268 #else 00269 00270 void LimparTela(void) { 00271 //PRINTF("\033[2J\033[1;1H"); 00272 //PRINTF("\e[1;1H\e[2J"); 00273 term.cls(); 00274 } 00275 00276 #endif 00277 00278 char * retorna_nome_jogador(char opcao1, char *nome) { 00279 00280 switch (opcao1) { 00281 case HUMANO1: 00282 strcpy(nome, NOME_HUMANO1); 00283 break; 00284 case HUMANO2: 00285 strcpy(nome, NOME_HUMANO2); 00286 break; 00287 case MAQUINA1: 00288 strcpy(nome, NOME_MAQUINA1); 00289 break; 00290 case MAQUINA2: 00291 strcpy(nome, NOME_MAQUINA2); 00292 break; 00293 } 00294 00295 return nome; 00296 } 00297 00298 char * retorna_nome_jogador_tipo_jogo(int indice, char opcao1, char *nome) { 00299 00300 switch(opcao1) { 00301 case '1': 00302 if(indice == 1) { 00303 strcpy(nome, NOME_HUMANO1); 00304 } else { 00305 strcpy(nome, NOME_HUMANO2); 00306 } 00307 break; 00308 case '2': 00309 if(indice == 1) { 00310 strcpy(nome, NOME_HUMANO1); 00311 } else { 00312 strcpy(nome, NOME_MAQUINA1); 00313 } 00314 break; 00315 case '3': 00316 if(indice == 1) { 00317 strcpy(nome, NOME_MAQUINA1); 00318 } else { 00319 strcpy(nome, NOME_MAQUINA2); 00320 } 00321 break; 00322 } 00323 00324 return nome; 00325 } 00326 00327 char retorna_jogador(int indice, char opcao1) { 00328 00329 char jogador; 00330 00331 switch(opcao1) { 00332 case '1': 00333 if(indice == 1) { 00334 jogador = HUMANO1; 00335 } else { 00336 jogador = HUMANO2; 00337 } 00338 break; 00339 case '2': 00340 if(indice == 1) { 00341 jogador = HUMANO1; 00342 } else { 00343 jogador = MAQUINA1; 00344 } 00345 break; 00346 case '3': 00347 if(indice == 1) { 00348 jogador = MAQUINA1; 00349 } else { 00350 jogador = MAQUINA2; 00351 } 00352 break; 00353 } 00354 00355 return jogador; 00356 } 00357 00358 void imprime_placar(void) { 00359 00360 char nome[TAM_NOME + 1]; 00361 int indice, tamanho; 00362 00363 LimparTela(); 00364 00365 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00366 LOCATE(10, 1); 00367 PRINTF("PLACAR%s", FIM_DE_LINHA); 00368 PRINTF("%- *.*s|VITORIAS|EMPATES|DERROTAS%s", TAM_NOME, TAM_NOME, "JOGADOR", FIM_DE_LINHA); 00369 00370 tamanho = TAM_NOME + 1 + strlen("VITORIAS") + 1 + strlen("EMPATES") + 1 + strlen("DERROTAS"); 00371 00372 for (indice = 0; indice < tamanho; ++indice) { 00373 PRINTF("%c", ASCII_BORDER_H); 00374 } 00375 PRINTF("%s", FIM_DE_LINHA); 00376 00377 00378 00379 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00380 PRINTF("%- *.*s|%0*d|%0*d|%0*d%s", 00381 TAM_NOME, TAM_NOME, retorna_nome_jogador(HUMANO1, nome), 00382 strlen("VITORIAS"), placar[HUMANO1 - '1'][VITORIAS], 00383 strlen("EMPATES"), placar[HUMANO1 - '1'][EMPATES], 00384 strlen("DERROTAS"), placar[HUMANO1 - '1'][DERROTAS], FIM_DE_LINHA); 00385 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00386 PRINTF("%- *.*s|%0*d|%0*d|%0*d%s", 00387 TAM_NOME, TAM_NOME, retorna_nome_jogador(HUMANO2, nome), 00388 strlen("VITORIAS"), placar[HUMANO2 - '1'][VITORIAS], 00389 strlen("EMPATES"), placar[HUMANO2 - '1'][EMPATES], 00390 strlen("DERROTAS"), placar[HUMANO2 - '1'][DERROTAS], FIM_DE_LINHA); 00391 #if 0 00392 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00393 PRINTF("%- *.*s|%0*d|%0*d|%0*d%s", 00394 TAM_NOME, TAM_NOME, retorna_nome_jogador(MAQUINA1, nome), 00395 strlen("VITORIAS"), placar[MAQUINA1 - '1'][VITORIAS], 00396 strlen("EMPATES"), placar[MAQUINA1 - '1'][EMPATES], 00397 strlen("DERROTAS"), placar[MAQUINA1 - '1'][DERROTAS], FIM_DE_LINHA); 00398 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00399 PRINTF("%- *.*s|%0*d|%0*d|%0*d%s", 00400 TAM_NOME, TAM_NOME, retorna_nome_jogador(MAQUINA2, nome), 00401 strlen("VITORIAS"), placar[MAQUINA2 - '1'][VITORIAS], 00402 strlen("EMPATES"), placar[MAQUINA2 - '1'][EMPATES], 00403 strlen("DERROTAS"), placar[MAQUINA2 - '1'][DERROTAS], FIM_DE_LINHA); 00404 #endif 00405 00406 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00407 PRINTF("%s", FIM_DE_LINHA); 00408 PRINTF("Pressione <Qualquer Tecla>"); 00409 GETCHE(); 00410 } 00411 00412 00413 void ImprimeMenu(char &jogador1, char &jogador2) { 00414 00415 char opcao1, opcao2; 00416 int indice; 00417 char nome[TAM_NOME + 1]; 00418 00419 do { 00420 LimparTela(); 00421 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00422 PRINTF("1 - %s X %s%s", NOME_HUMANO1, NOME_HUMANO2, FIM_DE_LINHA); 00423 #if 0 00424 PRINTF("2 - %s X %s%s", NOME_HUMANO1, NOME_MAQUINA1, FIM_DE_LINHA); 00425 PRINTF("3 - %s X %s%s", NOME_MAQUINA1, NOME_MAQUINA2, FIM_DE_LINHA); 00426 #endif 00427 //PRINTF("4 - PLACAR%s", FIM_DE_LINHA); 00428 PRINTF("2 - PLACAR%s", FIM_DE_LINHA); 00429 00430 opcao1 = GETCHE(); 00431 00432 //if(opcao1 == '4') { 00433 if (opcao1 == '2') { 00434 imprime_placar(); 00435 } 00436 00437 } while( opcao1 < '1' || opcao1 > '1' ); 00438 00439 do { 00440 indice = 0; 00441 LimparTela(); 00442 ++indice; 00443 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00444 PRINTF("%d - %s INICIA O JOGO%s", indice, retorna_nome_jogador_tipo_jogo(indice, opcao1, nome), FIM_DE_LINHA); 00445 ++indice; 00446 PRINTF("%d - %s INICIA O JOGO%s", indice, retorna_nome_jogador_tipo_jogo(indice, opcao1, nome), FIM_DE_LINHA); 00447 00448 opcao2 = GETCHE(); 00449 } while( opcao2 < '1' || opcao2 > '2' ); 00450 00451 if(opcao2 == '1') { 00452 jogador1 = retorna_jogador(1, opcao1); 00453 jogador2 = retorna_jogador(2, opcao1); 00454 } else { 00455 jogador1 = retorna_jogador(2, opcao1); 00456 jogador2 = retorna_jogador(1, opcao1); 00457 } 00458 00459 LimparTela(); 00460 00461 } 00462 00463 void InicializarTabuleiro(char jogador_que_inicia, char segundo_jogador) { 00464 00465 int indice1, indice2; 00466 00467 memset(tabuleiro_jogada, VAZIO, sizeof(tabuleiro_controle)); 00468 00469 for(indice1 = 0; indice1 < MAXCOLUNA; ++indice1) { 00470 //for(indice2 = 0; indice2 < ((MAXLINHA/2)-1); ++indice2) { 00471 for (indice2 = 0; indice2 < 1; ++indice2) { 00472 if( (indice2 == 0) || (indice2 == 2) ){ 00473 if((indice1%2) == 1) { 00474 tabuleiro_jogada[indice2][indice1] = segundo_jogador; 00475 } 00476 } else { 00477 if((indice1%2) == 0) { 00478 tabuleiro_jogada[indice2][indice1] = segundo_jogador; 00479 } 00480 } 00481 } 00482 } 00483 00484 for(indice1 = 0; indice1 < MAXCOLUNA; ++indice1) { 00485 for(indice2 = (MAXLINHA - 1); indice2 > (MAXLINHA/2); --indice2) { 00486 if(indice2 == 6){ 00487 if((indice1%2) == 1) { 00488 tabuleiro_jogada[indice2][indice1] = jogador_que_inicia; 00489 } 00490 } else { 00491 if((indice1%2) == 0) { 00492 tabuleiro_jogada[indice2][indice1] = jogador_que_inicia; 00493 } 00494 } 00495 } 00496 } 00497 00498 memcpy(tabuleiro_controle, tabuleiro_jogada, sizeof(tabuleiro_jogada)); 00499 } 00500 00501 void ImprimirTabuleiro(char jogador1, char jogador2) { 00502 00503 char nome1[TAM_NOME + 1]; 00504 char nome2[TAM_NOME + 1]; 00505 int linha, coluna; 00506 00507 LimparTela(); 00508 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00509 00510 LOCATE(10, 1); 00511 PRINTF("PARTIDA DE DAMAS "); 00512 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00513 PRINTF("%s", retorna_nome_jogador(jogador1, nome1)); 00514 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00515 PRINTF("(%d) VERSUS ", numero_pedras_capturadas_jogador1); 00516 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00517 PRINTF("%s", retorna_nome_jogador(jogador2, nome2)); 00518 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00519 PRINTF("(%d) % s", numero_pedras_capturadas_jogador2, FIM_DE_LINHA); 00520 00521 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00522 PRINTF("%s", BORDA); 00523 00524 SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA); 00525 PRINTF(" 12345678 %s", FIM_DE_LINHA); 00526 00527 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00528 PRINTF("%s", BORDA); 00529 00530 SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA); 00531 PRINTF(" %c", ASCII_BORDER_TL); 00532 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 00533 PRINTF("%c", ASCII_BORDER_H); 00534 } 00535 PRINTF("%c%s", ASCII_BORDER_TR, FIM_DE_LINHA); 00536 00537 for (linha = 0; linha < MAXLINHA; ++linha) { 00538 00539 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00540 PRINTF("%s", BORDA); 00541 00542 SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA); 00543 PRINTF("%d%c", linha + 1, ASCII_BORDER_V); 00544 if (linha % 2 == 0) { 00545 // Este tipo de linha comeca com um tipo de casa na qual 00546 // as pedras nao podem se movimentar 00547 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 00548 if (coluna % 2 == 0) { 00549 SELECIONA_COR(COR_FUNDO_CASA_SEM_PEDRA, COR_TEXTO_CASA_SEM_PEDRA); 00550 PRINTF(" "); 00551 } 00552 else { 00553 switch (tabuleiro_jogada[linha][coluna]) { 00554 case PEDRA_NORMAL_JOGADOR1: 00555 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00556 PRINTF("%c", ASCII_PEDRA_NORMAL); 00557 break; 00558 case PEDRA_NORMAL_JOGADOR2: 00559 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00560 PRINTF("%c", ASCII_PEDRA_NORMAL); 00561 break; 00562 case PEDRA_DAMA_JOGADOR1: 00563 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00564 PRINTF("%c", ASCII_PEDRA_DAMA); 00565 break; 00566 case PEDRA_DAMA_JOGADOR2: 00567 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00568 PRINTF("%c", ASCII_PEDRA_DAMA); 00569 break; 00570 case VAZIO: 00571 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_VAZIO); 00572 PRINTF(" "); 00573 break; 00574 case JOGADA: 00575 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_JOGADA, COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO); 00576 PRINTF(" "); 00577 break; 00578 case CAPTURADA: 00579 switch (tabuleiro_controle[linha][coluna]) { 00580 case PEDRA_NORMAL_JOGADOR1: 00581 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1); 00582 PRINTF("%c", ASCII_PEDRA_NORMAL); 00583 break; 00584 case PEDRA_DAMA_JOGADOR1: 00585 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1); 00586 PRINTF("%c", ASCII_PEDRA_DAMA); 00587 break; 00588 case PEDRA_NORMAL_JOGADOR2: 00589 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2); 00590 PRINTF("%c", ASCII_PEDRA_NORMAL); 00591 break; 00592 case PEDRA_DAMA_JOGADOR2: 00593 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2); 00594 PRINTF("%c", ASCII_PEDRA_DAMA); 00595 break; 00596 } 00597 break; 00598 } 00599 } 00600 } 00601 SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA); 00602 PRINTF("%c", ASCII_BORDER_V); 00603 PRINTF("%s", FIM_DE_LINHA); 00604 } 00605 else { 00606 // Este tipo de linha comeca com um tipo de casa na qual 00607 // as pedras podem se movimentar 00608 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 00609 if (coluna % 2 == 1) { 00610 SELECIONA_COR(COR_FUNDO_CASA_SEM_PEDRA, COR_TEXTO_CASA_SEM_PEDRA); 00611 PRINTF(" "); 00612 } 00613 else { 00614 switch (tabuleiro_jogada[linha][coluna]) { 00615 case PEDRA_NORMAL_JOGADOR1: 00616 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00617 PRINTF("%c", ASCII_PEDRA_NORMAL); 00618 break; 00619 case PEDRA_NORMAL_JOGADOR2: 00620 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00621 PRINTF("%c", ASCII_PEDRA_NORMAL); 00622 break; 00623 case PEDRA_DAMA_JOGADOR1: 00624 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1); 00625 PRINTF("%c", ASCII_PEDRA_DAMA); 00626 break; 00627 case PEDRA_DAMA_JOGADOR2: 00628 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2); 00629 PRINTF("%c", ASCII_PEDRA_DAMA); 00630 break; 00631 case VAZIO: 00632 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_VAZIO); 00633 PRINTF(" "); 00634 break; 00635 case JOGADA: 00636 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_JOGADA, COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO); 00637 PRINTF(" "); 00638 break; 00639 case CAPTURADA: 00640 switch (tabuleiro_controle[linha][coluna]) { 00641 case PEDRA_NORMAL_JOGADOR1: 00642 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1); 00643 PRINTF("%c", ASCII_PEDRA_NORMAL); 00644 break; 00645 case PEDRA_DAMA_JOGADOR1: 00646 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1); 00647 PRINTF("%c", ASCII_PEDRA_DAMA); 00648 break; 00649 case PEDRA_NORMAL_JOGADOR2: 00650 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2); 00651 PRINTF("%c", ASCII_PEDRA_NORMAL); 00652 break; 00653 case PEDRA_DAMA_JOGADOR2: 00654 SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2); 00655 PRINTF("%c", ASCII_PEDRA_DAMA); 00656 break; 00657 } 00658 break; 00659 } 00660 } 00661 } 00662 SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA); 00663 PRINTF("%c", ASCII_BORDER_V); 00664 PRINTF("%s", FIM_DE_LINHA); 00665 } 00666 } 00667 00668 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 00669 PRINTF("%s", BORDA); 00670 00671 SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA); 00672 PRINTF(" %c", ASCII_BORDER_BL); 00673 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 00674 PRINTF("%c", ASCII_BORDER_H); 00675 } 00676 PRINTF("%c%s", ASCII_BORDER_BR, FIM_DE_LINHA); 00677 } 00678 00679 // 0 - Movimento simples 00680 // 1 - Movimento com multiplas capturas 00681 int Movimento_Multiplo(void) { 00682 00683 int linha, coluna; 00684 00685 return 0; 00686 00687 for (linha = 0; linha < MAXLINHA; ++linha) { 00688 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 00689 if (tabuleiro_jogada[linha][coluna] == JOGADA) { 00690 // nao pode jogar sem capturar em uma jogada com multiplas capturas 00691 return 1; 00692 } 00693 } 00694 } 00695 return 0; 00696 } 00697 00698 // 0 - Movimento de pedra simples nao eh para traz 00699 // 1 - Movimento de pedra simples eh para traz 00700 int Movimento_Para_Traz(int linha_origem, int linha_destino, char jogador1, char jogador_vez) { 00701 00702 int retorno = 0; 00703 00704 // O jogador 1 sempre começa o jogo e ele sempre inicia a partir da parte de baixo do tabuleiro 00705 if (jogador_vez == jogador1) { 00706 if ((linha_origem - linha_destino) <= 0) { 00707 retorno = 1; 00708 } 00709 } 00710 else { 00711 if ((linha_destino - linha_origem) <= 0) { 00712 retorno = 1; 00713 } 00714 } 00715 00716 return retorno; 00717 } 00718 00719 // retorna numero de pedras que faltam capturar 00720 int Existe_Pedra_Para_Capturar(void) { 00721 00722 return 0; 00723 #if 0 00724 if ( (numero_pedras_para_capturar == -1) || (numero_pedras_para_capturar == 0) ) { 00725 return 0; 00726 } 00727 return numero_pedras_para_capturar; 00728 #endif 00729 } 00730 00731 char Posiciona_Pedra(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino, char jogador_vez, char jogador1) { 00732 char retorno; 00733 00734 // O jogador 1 sempre começa o jogo e ele sempre inicia a partir da parte de baixo do tabuleiro 00735 if (jogador_vez == jogador1) { 00736 //if ( (linha_destino == (MINLINHA - 1)) && ( (numero_pedras_para_capturar == -1) || (numero_pedras_para_capturar == 0)) ) { 00737 if (linha_destino == (MINLINHA - 1)) { 00738 retorno = PEDRA_DAMA_JOGADOR1; 00739 } 00740 else { 00741 retorno = tabuleiro_jogada[linha_origem][coluna_origem]; 00742 } 00743 } 00744 else { 00745 //if ((linha_destino == (MAXLINHA - 1)) && ((numero_pedras_para_capturar == -1) || (numero_pedras_para_capturar == 0))) { 00746 if (linha_destino == (MAXLINHA - 1)) { 00747 retorno = PEDRA_DAMA_JOGADOR2; 00748 } 00749 else { 00750 retorno = tabuleiro_jogada[linha_origem][coluna_origem]; 00751 } 00752 } 00753 00754 return retorno; 00755 } 00756 00757 // 0 - Esta no caminho maximo de captura 00758 // 1 - Nao esta no caminho maximo de captura 00759 int Caminho_Maximo_Captura(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino) { 00760 // @todo fazer funcao 00761 //int retorno = 1; 00762 int retorno = 0; 00763 00764 return retorno; 00765 } 00766 00767 void Calcula_Quantidade_Maxima_Capturas(char jogador_vez, char jogador1, char jogador2) { 00768 00769 // @todo fazer funcao 00770 00771 return; 00772 00773 //if (numero_pedras_para_capturar > 0) { 00774 // return; // funcao ja foi executada 00775 //} 00776 00777 } 00778 00779 void contabiliza_pedra(char jogador_vez, char jogador1, char jogador2) { 00780 00781 if (jogador_vez == jogador1) { 00782 ++numero_pedras_capturadas_jogador1; 00783 } 00784 else { 00785 ++numero_pedras_capturadas_jogador2; 00786 } 00787 } 00788 00789 // 0 - Movimento Invalido 00790 // 1 - Movimento Valido 00791 int Movimento_Valido(int &linha_origem, int &coluna_origem, int &linha_destino, int &coluna_destino, char jogador_vez, char jogador1, char jogador2) { 00792 00793 char pedra_normal = 1; 00794 char pedra_normal_oponente; 00795 char pedra_dama_oponente; 00796 char pedra_normal_jogador; 00797 char pedra_dama_jogador; 00798 int unidade_linha, unidade_coluna, linha_aux, coluna_aux, pedras_capturadas; 00799 int linha_pedra_capturada, coluna_pedra_capturada; 00800 00801 // Valida se existe uma pedra deste jogador no tabuleiro de jogada na posicao de origem. 00802 // O tabuleiro de jogada server para guardar a memoria de uma jogada com multiplas capturas, 00803 // por isso que´eh utilizado para validar as jogadas. 00804 if (jogador_vez == jogador1) { 00805 pedra_normal_jogador = PEDRA_NORMAL_JOGADOR1; 00806 pedra_dama_jogador = PEDRA_DAMA_JOGADOR1; 00807 pedra_normal_oponente = PEDRA_NORMAL_JOGADOR2; 00808 pedra_dama_oponente = PEDRA_DAMA_JOGADOR2; 00809 if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_NORMAL_JOGADOR1) { 00810 } else if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_DAMA_JOGADOR1) { 00811 pedra_normal = 0; 00812 } else { 00813 return 0; // pedra nao pertence ao jogador 00814 } 00815 } 00816 else { 00817 pedra_normal_jogador = PEDRA_NORMAL_JOGADOR2; 00818 pedra_dama_jogador = PEDRA_DAMA_JOGADOR2; 00819 pedra_normal_oponente = PEDRA_NORMAL_JOGADOR1; 00820 pedra_dama_oponente = PEDRA_DAMA_JOGADOR1; 00821 if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_NORMAL_JOGADOR2) { 00822 } else if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_DAMA_JOGADOR2) { 00823 pedra_normal = 0; 00824 } 00825 else { 00826 return 0; // pedra nao pertence ao jogador 00827 } 00828 } 00829 00830 Calcula_Quantidade_Maxima_Capturas(jogador_vez, jogador1, jogador2); 00831 00832 if (pedra_normal) { 00833 // pedra jogada eh normal 00834 // valida se a coordenada de destino eh valida para uma captura 00835 if ((linha_origem - linha_destino) == 2) { 00836 if ((coluna_origem - coluna_destino) == 2) { 00837 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) { 00838 return 0; // Eh obrigatorio executar a jogada que 00839 // captura o maximo de pedras do adversario 00840 } 00841 // diagonal para cima e para esquerda 00842 if ( (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) || 00843 (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA) ) { // a posicao destino deve estar vazia ou foi uma jogada 00844 if (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_normal_oponente) { 00845 // pedra normal do oponente capturada 00846 tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] = CAPTURADA; 00847 //--numero_pedras_para_capturar; 00848 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00849 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00850 tabuleiro_jogada[linha_destino][coluna_destino] = 00851 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00852 jogador_vez, jogador1); 00853 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00854 } 00855 else if (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_dama_oponente) { 00856 // pedra dama do oponente capturada 00857 tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] = CAPTURADA; 00858 //--numero_pedras_para_capturar; 00859 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00860 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00861 tabuleiro_jogada[linha_destino][coluna_destino] = 00862 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00863 jogador_vez, jogador1); 00864 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00865 } 00866 else { 00867 // pedra capturada invalida!! 00868 return 0; 00869 } 00870 } 00871 else { 00872 return 0; // casa destino ocupada!! 00873 } 00874 } 00875 else if ((coluna_destino - coluna_origem) == 2) { 00876 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) { 00877 return 0; // Eh obrigatorio executar a jogada que 00878 // captura o maximo de pedras do adversario 00879 } 00880 // diagonal para cima e para direita 00881 if ((tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) || 00882 (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA)) { // a posicao destino deve estar vazia ou foi uma jogada 00883 if (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_normal_oponente) { 00884 // pedra normal do oponente capturada 00885 tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] = CAPTURADA; 00886 //--numero_pedras_para_capturar; 00887 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00888 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00889 tabuleiro_jogada[linha_destino][coluna_destino] = 00890 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00891 jogador_vez, jogador1); 00892 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00893 } 00894 else if (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_dama_oponente) { 00895 // pedra dama do oponente capturada 00896 tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] = CAPTURADA; 00897 //--numero_pedras_para_capturar; 00898 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00899 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00900 tabuleiro_jogada[linha_destino][coluna_destino] = 00901 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00902 jogador_vez, jogador1); 00903 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00904 } 00905 else { 00906 // pedra capturada invalida!! 00907 return 0; 00908 } 00909 } 00910 else { 00911 // casa destino ocupada!! 00912 return 0; 00913 } 00914 } 00915 else { 00916 // uma jogada de uma pedra normal apenas pode capturar uma pedra para esquerda ou para direita em diagonal 00917 return 0; 00918 } 00919 } else if ((linha_destino - linha_origem) == 2) { 00920 if ((coluna_origem - coluna_destino) == 2) { 00921 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) { 00922 return 0; // Eh obrigatorio executar a jogada que 00923 // captura o maximo de pedras do adversario 00924 } 00925 // diagonal para baixo e para esquerda 00926 if ((tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) || 00927 (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA)) { // a posicao destino deve estar vazia ou foi uma jogada 00928 if (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_normal_oponente) { 00929 // pedra normal do oponente capturada 00930 tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] = CAPTURADA; 00931 //--numero_pedras_para_capturar; 00932 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00933 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00934 tabuleiro_jogada[linha_destino][coluna_destino] = 00935 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00936 jogador_vez, jogador1); 00937 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00938 } 00939 else if (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_dama_oponente) { 00940 // pedra dama do oponente capturada 00941 tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] = CAPTURADA; 00942 //--numero_pedras_para_capturar; 00943 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00944 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00945 tabuleiro_jogada[linha_destino][coluna_destino] = 00946 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00947 jogador_vez, jogador1); 00948 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00949 } 00950 else { 00951 // pedra capturada invalida!! 00952 return 0; 00953 } 00954 } 00955 else { 00956 // casa destino ocupada!! 00957 return 0; 00958 } 00959 } 00960 else if ((coluna_destino - coluna_origem) == 2) { 00961 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) { 00962 return 0; // Eh obrigatorio executar a jogada que 00963 // captura o maximo de pedras do adversario 00964 } 00965 // diagonal para baixo e para direita 00966 if ((tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) || 00967 (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA)) { // a posicao destino deve estar vazia ou foi uma jogada 00968 if (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_normal_oponente) { 00969 // pedra normal do oponente capturada 00970 tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] = CAPTURADA; 00971 //--numero_pedras_para_capturar; 00972 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00973 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00974 tabuleiro_jogada[linha_destino][coluna_destino] = 00975 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00976 jogador_vez, jogador1); 00977 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00978 } 00979 else if (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_dama_oponente) { 00980 // pedra dama do oponente capturada 00981 tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] = CAPTURADA; 00982 //--numero_pedras_para_capturar; 00983 contabiliza_pedra(jogador_vez, jogador1, jogador2); 00984 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 00985 tabuleiro_jogada[linha_destino][coluna_destino] = 00986 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 00987 jogador_vez, jogador1); 00988 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 00989 } 00990 else { 00991 // pedra capturada invalida!! 00992 return 0; 00993 } 00994 } 00995 else { 00996 // casa destino ocupada!! 00997 return 0; 00998 } 00999 } 01000 else { 01001 // uma jogada de uma pedra normal apenas pode capturar uma pedra para esquerda ou para direita em diagonal 01002 return 0; 01003 } 01004 } 01005 else if ((linha_origem - linha_destino) == 1) { 01006 if (Movimento_Para_Traz(linha_origem, linha_destino, jogador1, jogador_vez)) { 01007 return 0; // Uma pedra simples nao pode se movimentar para traz 01008 } 01009 else if (Existe_Pedra_Para_Capturar()) { 01010 return 0; // Eh obrigatorio capturar uma pedra 01011 } 01012 else if (Movimento_Multiplo()) { 01013 return 0; // Movimento de multiplas capturas, nao pode fazer um movimento simples apos a captura 01014 } 01015 // pedra fez um movimento, nao esta capturando uma pedra 01016 if ((coluna_origem - coluna_destino) == 1) { 01017 // diagonal para cima e para esquerda 01018 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 01019 tabuleiro_jogada[linha_destino][coluna_destino] = 01020 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 01021 jogador_vez, jogador1);; 01022 jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1; 01023 tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO; 01024 } 01025 else { 01026 return 0; 01027 } 01028 } 01029 else if ((coluna_destino - coluna_origem) == 1) { 01030 // diagonal para cima e para direita 01031 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 01032 tabuleiro_jogada[linha_destino][coluna_destino] = 01033 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 01034 jogador_vez, jogador1); 01035 jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1; 01036 tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO; 01037 } 01038 else { 01039 // casa destino ocupada!! 01040 return 0; 01041 } 01042 } 01043 else { 01044 // uma jogada de uma pedra normal apenas pode andar uma casa para esquerda ou para direita em diagonal 01045 return 0; 01046 } 01047 } 01048 else if ((linha_destino - linha_origem) == 1) { 01049 if (Movimento_Para_Traz(linha_origem, linha_destino, jogador1, jogador_vez)) { 01050 return 0; // Uma pedra simples nao pode se movimentar para traz 01051 } 01052 else if (Existe_Pedra_Para_Capturar()) { 01053 return 0; // Eh obrigatorio capturar uma pedra 01054 } 01055 else if (Movimento_Multiplo()) { 01056 return 0; // Movimento de multiplas capturas, nao pode fazer um movimento simples apos a captura 01057 } 01058 if ((coluna_origem - coluna_destino) == 1) { 01059 // diagonal para baixo e para esquerda 01060 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 01061 tabuleiro_jogada[linha_destino][coluna_destino] = 01062 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 01063 jogador_vez, jogador1); 01064 jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1; 01065 tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO; 01066 } 01067 else { 01068 // casa destino ocupada!! 01069 return 0; 01070 } 01071 } 01072 else if ((coluna_destino - coluna_origem) == 1) { 01073 // diagonal para baixo e para direita 01074 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 01075 tabuleiro_jogada[linha_destino][coluna_destino] = 01076 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 01077 jogador_vez, jogador1); 01078 jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1; 01079 tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO; 01080 } 01081 else { 01082 // casa destino ocupada!! 01083 return 0; 01084 } 01085 } 01086 else { 01087 // uma jogada de uma pedra normal apenas pode andar uma casa para esquerda ou para direita em diagonal 01088 return 0; 01089 } 01090 } 01091 else { 01092 // pedra normal executou um movimento invalido!! 01093 return 0; 01094 } 01095 } else { 01096 01097 if (tabuleiro_jogada[linha_destino][coluna_destino] != VAZIO) { 01098 return 0; // A dama nao pode movimentar-se para uma casa ocupada 01099 } 01100 01101 linha_aux = linha_origem; 01102 coluna_aux = coluna_origem; 01103 if (coluna_origem > coluna_destino) { 01104 unidade_coluna = -1; 01105 } 01106 else { 01107 unidade_coluna = 1; 01108 } 01109 01110 if (linha_origem > linha_destino) { 01111 unidade_linha = -1; 01112 } 01113 else { 01114 unidade_linha = 1; 01115 } 01116 01117 pedras_capturadas = 0; 01118 01119 do { 01120 linha_aux += unidade_linha; 01121 coluna_aux += unidade_coluna; 01122 01123 if ((tabuleiro_jogada[linha_aux][coluna_aux] == pedra_normal_jogador) || 01124 (tabuleiro_jogada[linha_aux][coluna_aux] == pedra_dama_jogador)) { 01125 return 0; // Dama nao pode pular pedras do mesmo jogador 01126 } else if ((tabuleiro_jogada[linha_aux][coluna_aux] == pedra_normal_oponente) || 01127 (tabuleiro_jogada[linha_aux][coluna_aux] == pedra_dama_oponente)) { 01128 ++pedras_capturadas; // A dama capturou uma pedra do oponente 01129 linha_pedra_capturada = linha_aux; 01130 coluna_pedra_capturada = coluna_aux; 01131 } 01132 01133 if (pedras_capturadas > 1) { 01134 return 0; // A dama nao pode capturar mais de uma pedra em um unico movimento 01135 } 01136 01137 } while (linha_aux != linha_destino); 01138 01139 if ((pedras_capturadas == 0) && (Existe_Pedra_Para_Capturar() || Movimento_Multiplo())) { 01140 return 0; // Eh obrigatorio a captura 01141 } else if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) { 01142 return 0; // Eh obrigatorio executar a jogada que 01143 // captura o maximo de pedras do adversario 01144 } 01145 01146 if (pedras_capturadas == 1) { 01147 contabiliza_pedra(jogador_vez, jogador1, jogador2); 01148 jogada_em_que_ultima_pedra_capturada = jogadas + 1; 01149 tabuleiro_jogada[linha_destino][coluna_destino] = 01150 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 01151 jogador_vez, jogador1); 01152 tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA; 01153 tabuleiro_jogada[linha_pedra_capturada][coluna_pedra_capturada] = CAPTURADA; 01154 } 01155 else { 01156 tabuleiro_jogada[linha_destino][coluna_destino] = 01157 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 01158 jogador_vez, jogador1); 01159 jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1; 01160 tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO; 01161 } 01162 } 01163 01164 return 1; 01165 } 01166 01167 // 0 - Faixa invalida 01168 // 1 - Faixa valida 01169 int Faixa_Valida(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino) { 01170 01171 int retorno = 1; 01172 01173 // Testa a faixa de valores 01174 if ( (linha_origem < 0) || (linha_origem > (MAXLINHA - 1)) ) { 01175 retorno = 0; 01176 } 01177 else if ((linha_destino < 0) || (linha_destino > (MAXLINHA - 1))) { 01178 retorno = 0; 01179 } 01180 else if ((coluna_origem < 0) || (coluna_origem > (MAXCOLUNA - 1))) { 01181 retorno = 0; 01182 } 01183 else if ((coluna_destino < 0) || (coluna_destino > (MAXCOLUNA - 1))) { 01184 retorno = 0; 01185 } 01186 // Testa se eh uma casa de movimentacao de pedra 01187 else if ( (linha_origem % 2 == 0) && (coluna_origem % 2 == 0) ) { 01188 retorno = 0; 01189 } 01190 else if ((linha_destino % 2 == 0) && (coluna_destino % 2 == 0)) { 01191 retorno = 0; 01192 } 01193 else if ((linha_origem % 2 == 1) && (coluna_origem % 2 == 1)) { 01194 retorno = 0; 01195 } 01196 else if ((linha_destino % 2 == 1) && (coluna_destino % 2 == 1)) { 01197 retorno = 0; 01198 } 01199 01200 return retorno; 01201 } 01202 01203 void Entrada(int &linha_origem, int &coluna_origem, int &linha_destino, int &coluna_destino, char jogador_vez, char jogador1, char jogador2){ 01204 01205 char nome[TAM_NOME + 1]; 01206 01207 do { 01208 //LimparTela(); 01209 PRINTF("%s", FIM_DE_LINHA); 01210 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 01211 PRINTF("Jogador %s entre com a coordenada de origem da pedra a ser movida.%s", retorna_nome_jogador(jogador_vez, nome), FIM_DE_LINHA); 01212 PRINTF("Entre com o valor da linha(1-8): "); 01213 linha_origem = lerIteiro() - 1; 01214 PRINTF("%s", FIM_DE_LINHA); 01215 PRINTF("Entre com o valor de coluna(1-8): "); 01216 coluna_origem = lerIteiro() - 1; 01217 PRINTF("%s", FIM_DE_LINHA); 01218 01219 PRINTF("Jogador %s entre com a coordenada de destino da pedra a ser movida.%s", retorna_nome_jogador(jogador_vez, nome), FIM_DE_LINHA); 01220 PRINTF("Entre com o valor de linha(1-8): "); 01221 linha_destino = lerIteiro() - 1; 01222 PRINTF("%s", FIM_DE_LINHA); 01223 PRINTF("Entre com o valor de coluna(1-8): "); 01224 coluna_destino = lerIteiro() - 1; 01225 PRINTF("%s", FIM_DE_LINHA); 01226 01227 if (Faixa_Valida(linha_origem, coluna_origem, linha_destino, coluna_destino) && 01228 Movimento_Valido(linha_origem, coluna_origem, linha_destino, coluna_destino, jogador_vez, jogador1, jogador2)) { 01229 break; 01230 } else { 01231 PRINTF("%s", FIM_DE_LINHA); 01232 PRINTF("Movimento invalido!! Pressione <Qualquer Tecla>"); 01233 GETCHE(); 01234 } 01235 } while (1); 01236 } 01237 01238 void Numero_Oponentes(int &jogador1_pedra_normal, int &jogador1_pedra_dama, 01239 int &jogador2_pedra_normal, int &jogador2_pedra_dama) { 01240 01241 int linha, coluna; 01242 01243 for (linha = 0; linha < MAXLINHA; ++linha) { 01244 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 01245 switch (tabuleiro_jogada[linha][coluna]) { 01246 case PEDRA_NORMAL_JOGADOR1: 01247 ++jogador1_pedra_normal; 01248 break; 01249 case PEDRA_DAMA_JOGADOR1: 01250 ++jogador1_pedra_dama; 01251 break; 01252 case PEDRA_NORMAL_JOGADOR2: 01253 ++jogador2_pedra_normal; 01254 break; 01255 case PEDRA_DAMA_JOGADOR2: 01256 ++jogador2_pedra_dama; 01257 break; 01258 } 01259 } 01260 } 01261 } 01262 01263 // 0 - Existem oponentes 01264 // 1 - Sem oponentes 01265 int Sem_Oponentes(void) { 01266 01267 int jogador1_pedra_normal = 0, jogador1_pedra_dama = 0, 01268 jogador2_pedra_normal = 0, jogador2_pedra_dama = 0; 01269 01270 Numero_Oponentes(jogador1_pedra_normal, jogador1_pedra_dama, 01271 jogador2_pedra_normal, jogador2_pedra_dama); 01272 01273 if ( (jogador1_pedra_normal || jogador1_pedra_dama) && (jogador2_pedra_normal || jogador2_pedra_dama) ) { 01274 return 0; 01275 } 01276 return 1; 01277 } 01278 01279 // 0 - Sem condicoes especiais 01280 // 1 - Com comdicoes especiais 01281 int Codicoes_Especiais(void) { 01282 // @todo falta terminar as codicoes especiais 01283 01284 int retorno = 0; 01285 01286 int jogador1_pedra_normal = 0, jogador1_pedra_dama = 0, 01287 jogador2_pedra_normal = 0, jogador2_pedra_dama = 0; 01288 01289 Numero_Oponentes(jogador1_pedra_normal, jogador1_pedra_dama, 01290 jogador2_pedra_normal, jogador2_pedra_dama); 01291 01292 if ((jogador1_pedra_normal == 0) && 01293 (jogador2_pedra_normal == 0) && 01294 (jogador1_pedra_dama == 2) && 01295 (jogador2_pedra_dama == 2)) { 01296 // 2 damas contras 2 damas 01297 } 01298 01299 return retorno; 01300 } 01301 01302 // 0 - Sem empate 01303 // 1 - Emapate 01304 int Verifica_Empate(void) { 01305 01306 // @todo Verificar como iniciar as condicoes especiais 01307 01308 return 0; 01309 01310 int retorno = 0; 01311 01312 if( ((jogadas - jogada_em_que_ultima_pedra_capturada) == 20) || 01313 ((jogadas - jogada_em_que_ultima_pedra_nomal_movimentada) == 20) ) { 01314 // Apos 20 lances sucessivos de damas, sem captura ou deslocamento de pedra, 01315 // a partida eh declarada empatada 01316 retorno = 1; 01317 } 01318 else if ( (jogada_empate_lances_especiais) && 01319 ((jogadas - jogada_empate_lances_especiais) == 5) && 01320 Codicoes_Especiais() ) { 01321 retorno = 1; 01322 } 01323 01324 return retorno; 01325 } 01326 01327 // 0 - Existe pedra a ser movimentada 01328 // 1 - Nao existe pedra a ser movimentada 01329 int Existe_Pedra_Movimento(int linha_destino, int coluna_destino, char jogador1, char jogador2, char jogador) { 01330 01331 int retorno = 1; 01332 01333 if (jogador == jogador1) { 01334 if ((linha_destino - 1 >= 0) && 01335 (coluna_destino - 1 >= 0) && 01336 (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == VAZIO)) { 01337 retorno = 0; 01338 } 01339 else if ((linha_destino - 1 >= 0) && 01340 (coluna_destino + 1 < MAXCOLUNA) && 01341 (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == VAZIO)) { 01342 retorno = 0; 01343 } 01344 } 01345 else { 01346 if ((linha_destino + 1 < MAXLINHA) && 01347 (coluna_destino + 1 < MAXCOLUNA) && 01348 (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == VAZIO)) { 01349 retorno = 0; 01350 } 01351 else if ((linha_destino + 1 < MAXLINHA) && 01352 (coluna_destino - 1 >= 0) && 01353 (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == VAZIO)) { 01354 retorno = 0; 01355 } 01356 } 01357 return retorno; 01358 } 01359 01360 // 0 - Existe pedra a ser capturada 01361 // 1 - Nao existe pedra a ser capturada 01362 int Existe_Pedra_Capturar(int linha_destino, int coluna_destino, char jogador1, char jogador2, char jogador) { 01363 01364 int retorno = 1; 01365 char pedra_nomal, pedra_dama; 01366 01367 if (jogador == jogador1) { 01368 pedra_nomal = PEDRA_NORMAL_JOGADOR2; 01369 pedra_dama = PEDRA_DAMA_JOGADOR2; 01370 } 01371 else { 01372 pedra_nomal = PEDRA_NORMAL_JOGADOR1; 01373 pedra_dama = PEDRA_DAMA_JOGADOR1; 01374 } 01375 01376 if ((linha_destino + 2 < MAXLINHA) && 01377 (coluna_destino + 2 < MAXCOLUNA) && 01378 ((tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_nomal) || 01379 (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_dama)) && 01380 (tabuleiro_jogada[linha_destino + 2][coluna_destino + 2] == VAZIO)) { 01381 retorno = 0; 01382 } 01383 else if ((linha_destino + 2 < MAXLINHA) && 01384 (coluna_destino - 2 >= 0) && 01385 ((tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_nomal) || 01386 (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_dama)) && 01387 (tabuleiro_jogada[linha_destino + 2][coluna_destino - 2] == VAZIO)) { 01388 retorno = 0; 01389 } 01390 else if ((linha_destino - 2 >= 0) && 01391 (coluna_destino - 2 >= 0) && 01392 ((tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_nomal) || 01393 (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_dama)) && 01394 (tabuleiro_jogada[linha_destino - 2][coluna_destino - 2] == VAZIO)) { 01395 retorno = 0; 01396 } 01397 else if ((linha_destino - 2 >= 0) && 01398 (coluna_destino + 2 < MAXCOLUNA) && 01399 ((tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_nomal) || 01400 (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_dama)) && 01401 (tabuleiro_jogada[linha_destino - 2][coluna_destino + 2] == VAZIO)) { 01402 retorno = 0; 01403 } 01404 01405 return retorno; 01406 } 01407 01408 // 0 - Nao existe jogada para o jogador selecionado 01409 // 1 - Existe jogada para o jogador selecionado 01410 int Existe_Jogada(char jogador1, char jogador2, char jogador) { 01411 int retorno = 0; 01412 int linha, coluna; 01413 01414 01415 if (jogador == jogador1) { 01416 for (linha = 0; linha < MAXLINHA; ++linha) { 01417 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 01418 if (tabuleiro_jogada[linha][coluna] == PEDRA_NORMAL_JOGADOR1) { 01419 if (!Existe_Pedra_Movimento(linha, coluna, jogador1, jogador2, jogador)) { 01420 return 1; 01421 } 01422 else if (!Existe_Pedra_Capturar(linha, coluna, jogador1, jogador2, jogador)) { 01423 return 1; 01424 } 01425 } 01426 } 01427 } 01428 } 01429 else { 01430 for (linha = 0; linha < MAXLINHA; ++linha) { 01431 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 01432 if (tabuleiro_jogada[linha][coluna] == PEDRA_NORMAL_JOGADOR2) { 01433 if (!Existe_Pedra_Movimento(linha, coluna, jogador1, jogador2, jogador)) { 01434 return 1; 01435 } 01436 else if (!Existe_Pedra_Capturar(linha, coluna, jogador1, jogador2, jogador)) { 01437 return 1; 01438 } 01439 } 01440 } 01441 } 01442 } 01443 return retorno; 01444 } 01445 01446 int Analisar(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino, 01447 char &jogador_vez, char jogador1, char jogador2){ 01448 01449 int linha, coluna; 01450 char nome[TAM_NOME + 1]; 01451 int retorno = 0; 01452 01453 ++jogadas; 01454 01455 // Verifica se existem oponentes 01456 if (Sem_Oponentes()) { 01457 if (jogador_vez == jogador1) { 01458 placar[jogador1 - '1'][VITORIAS] += 1; 01459 placar[jogador2 - '1'][DERROTAS] += 1; 01460 } 01461 else { 01462 placar[jogador2 - '1'][VITORIAS] += 1; 01463 placar[jogador1 - '1'][DERROTAS] += 1; 01464 } 01465 //LimparTela(); 01466 PRINTF("%s", FIM_DE_LINHA); 01467 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 01468 PRINTF("Jogador %s VENCEU!! com %d jogadas.%s", retorna_nome_jogador(jogador_vez, nome), jogadas, FIM_DE_LINHA); 01469 PRINTF("Pressione <Qualquer Tecla>"); 01470 GETCHE(); 01471 jogadas = 0; 01472 retorno = 1; 01473 } 01474 // Verifica empate 01475 else if (Verifica_Empate()) { 01476 placar[jogador1 - '1'][EMPATES] += 1; 01477 placar[jogador2 - '1'][EMPATES] += 1; 01478 //LimparTela(); 01479 PRINTF("%s", FIM_DE_LINHA); 01480 SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM); 01481 PRINTF("Jogadores %s e %s EMPATARAM!! apos %d jogadas.%s", retorna_nome_jogador(jogador1, nome), 01482 retorna_nome_jogador(jogador2, nome), jogadas, FIM_DE_LINHA); 01483 PRINTF("Pressione <Qualquer Tecla>"); 01484 GETCHE(); 01485 jogadas = 0; 01486 retorno = 1; 01487 } 01488 // Verifica mudanca de vez de jogador 01489 else {//if ( (numero_pedras_para_capturar == 0) || (numero_pedras_para_capturar == -1) ) { 01490 01491 for (linha = 0; linha < MAXLINHA; ++linha) { 01492 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 01493 switch (tabuleiro_jogada[linha][coluna]) { 01494 case PEDRA_NORMAL_JOGADOR1: 01495 case PEDRA_DAMA_JOGADOR1: 01496 case PEDRA_NORMAL_JOGADOR2: 01497 case PEDRA_DAMA_JOGADOR2: 01498 break; 01499 default: 01500 tabuleiro_jogada[linha][coluna] = VAZIO; 01501 break; 01502 } 01503 } 01504 } 01505 memcpy(tabuleiro_controle, tabuleiro_jogada, sizeof(tabuleiro_jogada)); 01506 01507 // @todo falta verificar o caso em que o jogador nao tem casa para jogar 01508 if (jogador_vez == jogador1) { 01509 if (numero_pedras_capturadas_jogador1 > numero_pedras_capturadas_antes_jogador1) { 01510 if (Existe_Pedra_Capturar(linha_destino, coluna_destino, jogador1, jogador2, jogador1)) { 01511 jogador_vez = jogador2; 01512 } 01513 } 01514 else if (Existe_Jogada(jogador1, jogador2, jogador2)) { 01515 jogador_vez = jogador2; 01516 } 01517 } 01518 else { 01519 if (numero_pedras_capturadas_jogador2 > numero_pedras_capturadas_antes_jogador2) { 01520 if (Existe_Pedra_Capturar(linha_destino, coluna_destino, jogador1, jogador2, jogador2)) { 01521 jogador_vez = jogador1; 01522 } 01523 } 01524 else if (Existe_Jogada(jogador1, jogador2, jogador1)) { 01525 jogador_vez = jogador1; 01526 } 01527 } 01528 //numero_pedras_para_capturar = -1; 01529 01530 numero_pedras_capturadas_antes_jogador1 = numero_pedras_capturadas_jogador1; 01531 numero_pedras_capturadas_antes_jogador2 = numero_pedras_capturadas_jogador2; 01532 #if 0 01533 for (linha = 0; linha < MAXLINHA; ++linha) { 01534 for (coluna = 0; coluna < MAXCOLUNA; ++coluna) { 01535 switch (tabuleiro_jogada[linha][coluna]) { 01536 case PEDRA_NORMAL_JOGADOR1: 01537 case PEDRA_DAMA_JOGADOR1: 01538 case PEDRA_NORMAL_JOGADOR2: 01539 case PEDRA_DAMA_JOGADOR2: 01540 break; 01541 default : 01542 tabuleiro_jogada[linha][coluna] = VAZIO; 01543 break; 01544 } 01545 } 01546 } 01547 memcpy(tabuleiro_controle, tabuleiro_jogada, sizeof(tabuleiro_jogada)); 01548 #endif 01549 } 01550 01551 return(retorno); 01552 } 01553 01554 void Jogar(char jogador1, char jogador2) { 01555 01556 char fim = '0'; 01557 char jogador_vez; 01558 int linha_origem, coluna_origem, linha_destino, coluna_destino; 01559 01560 InicializarTabuleiro(jogador1, jogador2); 01561 01562 jogador_vez = jogador1; 01563 01564 do { 01565 ImprimirTabuleiro(jogador1, jogador2); 01566 01567 Entrada(linha_origem, coluna_origem, linha_destino, coluna_destino,jogador_vez, jogador1, jogador2); 01568 01569 if(Analisar(linha_origem, coluna_origem, linha_destino, coluna_destino, jogador_vez, jogador1, jogador2)) { 01570 fim = '1'; 01571 } 01572 } while(fim != '1'); 01573 } 01574 01575 int main() { 01576 01577 char jogador1, jogador2; 01578 01579 #ifdef __PC__ 01580 01581 hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 01582 ConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO(); 01583 GetConsoleScreenBufferInfo(hConsoleHandle, ConsoleInfo); 01584 01585 #else 01586 01587 //pc.baud(115200); 01588 term.baud(115200); 01589 01590 #endif 01591 01592 // Zerando o placar 01593 memset(placar, 0, sizeof(placar)); 01594 01595 while(true) { 01596 01597 ImprimeMenu(jogador1, jogador2); 01598 01599 Jogar(jogador1, jogador2); 01600 } 01601 }
Generated on Wed Jul 13 2022 22:34:28 by
1.7.2