Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.88 KB | None | 0 0
  1. // JOGO DA VELHA EM C
  2. // AUTOR: João Antônio Hamerski Copetti - joãohamerski@hotmail.com
  3. // GitHub: github.com/JoaoHamerski
  4. // TESTESTESTE
  5.  
  6. #include <stdio.h>
  7. #include <locale.h>
  8.  
  9. #define SYSTEM_PAUSE \
  10. printf("\nPressione qualquer tecla para continuar..."); \
  11. getch();
  12.  
  13. #define CLEAR_SCR system("cls");
  14. #define MAX 3
  15.  
  16.  
  17. // Usando o laço FOR, cria o tabuleiro do jogo da velha que será exibido.
  18. void exibe_tabuleiro(char tab[][MAX], int p1, int p2) {
  19. int i, j;
  20. printf("PONTUAÇÃO\n");
  21. printf("JOGADOR UM: %d\t\t\t JOGADOR DOIS: %d\n", p1, p2);
  22.  
  23. printf("\n\n");
  24. printf("==================================================\n");
  25. printf("\t\t TABULEIRO\n");
  26. printf("==================================================\n\n");
  27.  
  28. for(i = 0; i < MAX; i++) {
  29. printf("\t\t ");
  30.  
  31. for(j = 0; j < MAX; j++) {
  32. printf(" %c ", tab[i][j]);
  33.  
  34. if (j < MAX-1) {
  35. printf("|");
  36. }
  37. }
  38. printf("\n");
  39. }
  40. }
  41.  
  42. void menu() {
  43. printf("\n JOGO DA VELHA \n");
  44. printf("__________________________________________________\n\n");
  45. printf("\t\t 1. JOGAR\n");
  46. printf("\t\t 0. SAIR\n\n");
  47. printf("\t\t Nº Desejado: ");
  48. }
  49.  
  50. // Verifica se a posição escolhido pelo usuário já está ocupada.
  51. int verificaPos(char tab[][MAX], int lin, int col) {
  52.  
  53. if(tab[lin][col] == 'X' || tab[lin][col] == 'O')
  54. return 1;
  55. else
  56. return 0;
  57. }
  58.  
  59. // Verifica as linhas verticais, procurando uma série de três 'O' ou 'X' iguais na vertical, para determinar um ganhador.
  60. int verificaVertical(char tab[][MAX]) {
  61. int i = 0, j = 0;
  62. int cont = 0;
  63.  
  64. do {
  65. if(i == MAX) {
  66. j++;
  67. cont = 0;
  68. i = 0;
  69. }
  70.  
  71. for(; i < MAX; i++) {
  72. if(tab[i][j] == 'O') {
  73.  
  74. cont++;
  75. } else {
  76. if (tab[i][j] == 'X') {
  77.  
  78. cont--;
  79. }
  80. }
  81. }
  82.  
  83.  
  84. if(cont == MAX)
  85. return 1;
  86.  
  87. if(cont == -MAX)
  88. return -1;
  89.  
  90. } while(j < MAX);
  91.  
  92. return 0;
  93. }
  94.  
  95. // Verifica as linhas horizontais, procurando uma série de três 'O' ou 'X' iguais na horizontal, para determinar um ganhador.
  96. int verificaHorizontal(char tab[][MAX]) {
  97. int i = 0, j = 0;
  98. int cont = 0;
  99.  
  100. do {
  101. if(i == MAX) {
  102. j++;
  103. cont = 0;
  104. i = 0;
  105. }
  106.  
  107. for(; i < MAX; i++) {
  108. if(tab[j][i] == 'O') {
  109.  
  110. cont++;
  111. } else {
  112. if(tab[j][i] == 'X') {
  113.  
  114. cont--;
  115. }
  116. }
  117. }
  118.  
  119. if(cont == MAX)
  120. return 1;
  121.  
  122. if(cont == -MAX)
  123. return -1;
  124.  
  125. } while(j < MAX);
  126.  
  127. return 0;
  128. }
  129.  
  130. // Verifica as linhas da diagonal principal, procurando uma série de três 'O' ou 'X' iguais na diagonal, para determinar um ganhador.
  131. int verificaDiagonalP(char tab[][MAX]) {
  132. int i, j;
  133. int cont = 0;
  134.  
  135. for(i = 0, j = 0; i < MAX; i++, j++) {
  136. if(tab[i][j] == 'O') {
  137.  
  138. cont++;
  139. } else {
  140.  
  141. if(tab[i][j] == 'X') {
  142.  
  143. cont--;
  144. }
  145. }
  146. }
  147.  
  148. if(cont == MAX)
  149. return 1;
  150.  
  151. if(cont == -MAX)
  152. return -1;
  153.  
  154. return 0;
  155. }
  156.  
  157. // Verifica as linhas da diagonal principal, procurando uma série de três 'O' ou 'X' iguais na diagonal, para determinar um ganhador.
  158. int verificaDiagonalS(char tab[][MAX]) {
  159. int i, j;
  160. int cont = 0;
  161.  
  162. for(i = 0, j = MAX-1; i < MAX; i++, j--) {
  163.  
  164. if(tab[i][j] == 'O') {
  165.  
  166. cont++;
  167. } else {
  168.  
  169. if(tab[i][j] == 'X') {
  170.  
  171. cont--;
  172. }
  173. }
  174. }
  175.  
  176. if(cont == MAX)
  177. return 1;
  178.  
  179. if(cont == -MAX)
  180. return -1;
  181.  
  182. return 0;
  183. }
  184.  
  185. // Faz todas as verificações para determina se houve algum ganhador.
  186. int verificaTabuleiro(char tab[][MAX]) {
  187. if( verificaDiagonalS(tab) == 1
  188. || verificaDiagonalP(tab) == 1
  189. || verificaHorizontal(tab) == 1
  190. || verificaVertical(tab) == 1)
  191. return 1;
  192.  
  193. if( verificaDiagonalS(tab) == -1
  194. || verificaDiagonalP(tab) == -1
  195. || verificaHorizontal(tab) == -1
  196. || verificaVertical(tab) == -1)
  197. return -1;
  198.  
  199. return 0;
  200. }
  201.  
  202. // Verifica se houve empate
  203. int verificaEmpate(char tab[][MAX]) {
  204. int i, j;
  205. int cont = 0;
  206.  
  207. for(i = 0; i < MAX; i++) {
  208. for(j = 0; j < MAX; j++) {
  209. if(tab[i][j] == 'X' || tab[i][j] == 'O') {
  210.  
  211. cont++;
  212. }
  213. }
  214. }
  215.  
  216. if(cont == MAX * MAX) {
  217. if(!verificaTabuleiro(tab)) {
  218.  
  219. return 1;
  220. }
  221. }
  222.  
  223.  
  224. return 0;
  225. }
  226.  
  227. // Atribui 'O' ou 'X' na tabela
  228. void jogar(int lin, int col, char tab[][MAX], int vez) {
  229. int i, j;
  230.  
  231. if(vez == 0)
  232. tab[lin][col] = 'O';
  233.  
  234. if(vez == 1)
  235. tab[lin][col] = 'X';
  236. }
  237.  
  238. void system_pause() {
  239. printf("\nPressione qualquer tecla para continuar...");
  240. getch();
  241. }
  242.  
  243. // Reinicia o tabuleiro para a proxima jogada
  244. void zeraTabuleiro(char tab[MAX][MAX]) {
  245. int i, j;
  246. int letra = '1';
  247.  
  248. for(i = MAX-1; i >= 0; i--) {
  249.  
  250. for(j = 0; j < MAX; j++) {
  251. tab[i][j] = letra;
  252. letra++;
  253. }
  254. }
  255. }
  256.  
  257. // Atribui a linha e coluna de acordo com o número digitado pelo usuário
  258. void atribuiLinCol(char letra, int *lin, int *col) {
  259.  
  260. if(letra == '7') *lin = 0, *col = 0;
  261. else if(letra == '8') *lin = 0, *col = 1;
  262. else if(letra == '9') *lin = 0, *col = 2;
  263. else if(letra == '4') *lin = 1, *col = 0;
  264. else if(letra == '5') *lin = 1, *col = 1;
  265. else if(letra == '6') *lin = 1, *col = 2;
  266. else if(letra == '1') *lin = 2, *col = 0;
  267. else if(letra == '2') *lin = 2, *col = 1;
  268. else if(letra == '3') *lin = 2, *col = 2;
  269. else {
  270. *lin = -1, *col = -1;
  271. }
  272. }
  273.  
  274. /*
  275. * Verifica algum erro na hora da escolher a tecla para posicionar o 'X' ou 'O',
  276. * caso haja erro, a função 'atribuiLinCol()' retorna um valor que a função 'verificaErro()' possa
  277. * identificar que houve o erro
  278. */
  279. int verificaErro(int lin, int col) {
  280. if(lin < 0 || lin > MAX || col < 0 || col > MAX)
  281. return 1;
  282. else
  283. return 0;
  284. }
  285.  
  286. int main() {
  287. setlocale(LC_ALL, "Portuguese");
  288. system("mode con:cols=50 lines=17");
  289.  
  290. char tabuleiro[MAX][MAX];
  291. char opcao;
  292. int lin, col;
  293. char resp;
  294. int vez = 0;
  295. int jogadas = 0;
  296. int erro;
  297. int pt1, pt2;
  298.  
  299. do {
  300. pt1 = 0, pt2 = 0;
  301. erro = 0;
  302.  
  303. CLEAR_SCR;
  304. menu();
  305.  
  306. setbuf(stdin, NULL);
  307. scanf(" %c", &opcao);
  308.  
  309. zeraTabuleiro(tabuleiro);
  310.  
  311. if(opcao == '1') {
  312. do{
  313. CLEAR_SCR;
  314. exibe_tabuleiro(tabuleiro, pt1, pt2);
  315.  
  316.  
  317. if(vez == 0) {
  318. printf("\nVez do jogador 1 [O]\n");
  319. }
  320.  
  321. if(vez == 1) {
  322. printf("\nVez do jogador 2 [X]\n");
  323. }
  324.  
  325.  
  326. if(erro == 1) {
  327. printf("POSIÇÃO JÁ OCUPADA. PRESSIONE NOVAMENTE!!!\n");
  328. }
  329.  
  330. if(erro == 2) {
  331. printf("TECLA PRESSIONADA INVÁLIDA. PRESSIONE NOVAMENTE!!!\n");
  332. }
  333.  
  334. printf("PRESSIONE O Nº DESEJADO: ");
  335. resp = getch();
  336.  
  337. atribuiLinCol(resp, &lin, &col);
  338.  
  339. if(verificaPos(tabuleiro, lin, col)) {
  340.  
  341. erro = 1;
  342. } else {
  343. if(verificaErro(lin, col)) {
  344.  
  345. erro = 2;
  346. } else {
  347. erro = 0;
  348. jogar(lin, col, tabuleiro, vez);
  349. jogadas++;
  350. vez = jogadas % 2;
  351.  
  352. if(verificaTabuleiro(tabuleiro) == 1) {
  353.  
  354. pt1++;
  355. CLEAR_SCR;
  356. exibe_tabuleiro(tabuleiro, pt1, pt2);
  357.  
  358. printf("JOGADOR 1 VENCEU!\n");
  359.  
  360. SYSTEM_PAUSE;
  361. CLEAR_SCR;
  362. zeraTabuleiro(tabuleiro);
  363. }
  364.  
  365. if(verificaTabuleiro(tabuleiro) == -1) {
  366.  
  367. pt2++;
  368. CLEAR_SCR;
  369. exibe_tabuleiro(tabuleiro, pt1, pt2);
  370.  
  371. printf("JOGADOR 2 VENCEU!\n");
  372.  
  373. SYSTEM_PAUSE;
  374. CLEAR_SCR;
  375. zeraTabuleiro(tabuleiro);
  376. }
  377.  
  378. if(verificaEmpate(tabuleiro)) {
  379.  
  380. CLEAR_SCR;
  381. exibe_tabuleiro(tabuleiro, pt1, pt2);
  382.  
  383. printf("EMPATE!\n");
  384.  
  385. SYSTEM_PAUSE;
  386. CLEAR_SCR;
  387. zeraTabuleiro(tabuleiro);
  388. }
  389. }
  390. }
  391. }while(resp != '0');
  392. }
  393.  
  394. if(opcao != '1' && opcao != '0') {
  395. printf("ÍNDICE INVÁLIDO\nDIGITE NOVAMENTE!\n");
  396. getch();
  397. }
  398.  
  399. } while (opcao != '0');
  400.  
  401. printf("JOGO FINALIZADO!\n");
  402. return 0;
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement