Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // JOGO DA VELHA EM C
- // AUTOR: João Antônio Hamerski Copetti - joãohamerski@hotmail.com
- // GitHub: github.com/JoaoHamerski
- // TESTESTESTE
- #include <stdio.h>
- #include <locale.h>
- #define SYSTEM_PAUSE \
- printf("\nPressione qualquer tecla para continuar..."); \
- getch();
- #define CLEAR_SCR system("cls");
- #define MAX 3
- // Usando o laço FOR, cria o tabuleiro do jogo da velha que será exibido.
- void exibe_tabuleiro(char tab[][MAX], int p1, int p2) {
- int i, j;
- printf("PONTUAÇÃO\n");
- printf("JOGADOR UM: %d\t\t\t JOGADOR DOIS: %d\n", p1, p2);
- printf("\n\n");
- printf("==================================================\n");
- printf("\t\t TABULEIRO\n");
- printf("==================================================\n\n");
- for(i = 0; i < MAX; i++) {
- printf("\t\t ");
- for(j = 0; j < MAX; j++) {
- printf(" %c ", tab[i][j]);
- if (j < MAX-1) {
- printf("|");
- }
- }
- printf("\n");
- }
- }
- void menu() {
- printf("\n JOGO DA VELHA \n");
- printf("__________________________________________________\n\n");
- printf("\t\t 1. JOGAR\n");
- printf("\t\t 0. SAIR\n\n");
- printf("\t\t Nº Desejado: ");
- }
- // Verifica se a posição escolhido pelo usuário já está ocupada.
- int verificaPos(char tab[][MAX], int lin, int col) {
- if(tab[lin][col] == 'X' || tab[lin][col] == 'O')
- return 1;
- else
- return 0;
- }
- // Verifica as linhas verticais, procurando uma série de três 'O' ou 'X' iguais na vertical, para determinar um ganhador.
- int verificaVertical(char tab[][MAX]) {
- int i = 0, j = 0;
- int cont = 0;
- do {
- if(i == MAX) {
- j++;
- cont = 0;
- i = 0;
- }
- for(; i < MAX; i++) {
- if(tab[i][j] == 'O') {
- cont++;
- } else {
- if (tab[i][j] == 'X') {
- cont--;
- }
- }
- }
- if(cont == MAX)
- return 1;
- if(cont == -MAX)
- return -1;
- } while(j < MAX);
- return 0;
- }
- // Verifica as linhas horizontais, procurando uma série de três 'O' ou 'X' iguais na horizontal, para determinar um ganhador.
- int verificaHorizontal(char tab[][MAX]) {
- int i = 0, j = 0;
- int cont = 0;
- do {
- if(i == MAX) {
- j++;
- cont = 0;
- i = 0;
- }
- for(; i < MAX; i++) {
- if(tab[j][i] == 'O') {
- cont++;
- } else {
- if(tab[j][i] == 'X') {
- cont--;
- }
- }
- }
- if(cont == MAX)
- return 1;
- if(cont == -MAX)
- return -1;
- } while(j < MAX);
- return 0;
- }
- // Verifica as linhas da diagonal principal, procurando uma série de três 'O' ou 'X' iguais na diagonal, para determinar um ganhador.
- int verificaDiagonalP(char tab[][MAX]) {
- int i, j;
- int cont = 0;
- for(i = 0, j = 0; i < MAX; i++, j++) {
- if(tab[i][j] == 'O') {
- cont++;
- } else {
- if(tab[i][j] == 'X') {
- cont--;
- }
- }
- }
- if(cont == MAX)
- return 1;
- if(cont == -MAX)
- return -1;
- return 0;
- }
- // Verifica as linhas da diagonal principal, procurando uma série de três 'O' ou 'X' iguais na diagonal, para determinar um ganhador.
- int verificaDiagonalS(char tab[][MAX]) {
- int i, j;
- int cont = 0;
- for(i = 0, j = MAX-1; i < MAX; i++, j--) {
- if(tab[i][j] == 'O') {
- cont++;
- } else {
- if(tab[i][j] == 'X') {
- cont--;
- }
- }
- }
- if(cont == MAX)
- return 1;
- if(cont == -MAX)
- return -1;
- return 0;
- }
- // Faz todas as verificações para determina se houve algum ganhador.
- int verificaTabuleiro(char tab[][MAX]) {
- if( verificaDiagonalS(tab) == 1
- || verificaDiagonalP(tab) == 1
- || verificaHorizontal(tab) == 1
- || verificaVertical(tab) == 1)
- return 1;
- if( verificaDiagonalS(tab) == -1
- || verificaDiagonalP(tab) == -1
- || verificaHorizontal(tab) == -1
- || verificaVertical(tab) == -1)
- return -1;
- return 0;
- }
- // Verifica se houve empate
- int verificaEmpate(char tab[][MAX]) {
- int i, j;
- int cont = 0;
- for(i = 0; i < MAX; i++) {
- for(j = 0; j < MAX; j++) {
- if(tab[i][j] == 'X' || tab[i][j] == 'O') {
- cont++;
- }
- }
- }
- if(cont == MAX * MAX) {
- if(!verificaTabuleiro(tab)) {
- return 1;
- }
- }
- return 0;
- }
- // Atribui 'O' ou 'X' na tabela
- void jogar(int lin, int col, char tab[][MAX], int vez) {
- int i, j;
- if(vez == 0)
- tab[lin][col] = 'O';
- if(vez == 1)
- tab[lin][col] = 'X';
- }
- void system_pause() {
- printf("\nPressione qualquer tecla para continuar...");
- getch();
- }
- // Reinicia o tabuleiro para a proxima jogada
- void zeraTabuleiro(char tab[MAX][MAX]) {
- int i, j;
- int letra = '1';
- for(i = MAX-1; i >= 0; i--) {
- for(j = 0; j < MAX; j++) {
- tab[i][j] = letra;
- letra++;
- }
- }
- }
- // Atribui a linha e coluna de acordo com o número digitado pelo usuário
- void atribuiLinCol(char letra, int *lin, int *col) {
- if(letra == '7') *lin = 0, *col = 0;
- else if(letra == '8') *lin = 0, *col = 1;
- else if(letra == '9') *lin = 0, *col = 2;
- else if(letra == '4') *lin = 1, *col = 0;
- else if(letra == '5') *lin = 1, *col = 1;
- else if(letra == '6') *lin = 1, *col = 2;
- else if(letra == '1') *lin = 2, *col = 0;
- else if(letra == '2') *lin = 2, *col = 1;
- else if(letra == '3') *lin = 2, *col = 2;
- else {
- *lin = -1, *col = -1;
- }
- }
- /*
- * Verifica algum erro na hora da escolher a tecla para posicionar o 'X' ou 'O',
- * caso haja erro, a função 'atribuiLinCol()' retorna um valor que a função 'verificaErro()' possa
- * identificar que houve o erro
- */
- int verificaErro(int lin, int col) {
- if(lin < 0 || lin > MAX || col < 0 || col > MAX)
- return 1;
- else
- return 0;
- }
- int main() {
- setlocale(LC_ALL, "Portuguese");
- system("mode con:cols=50 lines=17");
- char tabuleiro[MAX][MAX];
- char opcao;
- int lin, col;
- char resp;
- int vez = 0;
- int jogadas = 0;
- int erro;
- int pt1, pt2;
- do {
- pt1 = 0, pt2 = 0;
- erro = 0;
- CLEAR_SCR;
- menu();
- setbuf(stdin, NULL);
- scanf(" %c", &opcao);
- zeraTabuleiro(tabuleiro);
- if(opcao == '1') {
- do{
- CLEAR_SCR;
- exibe_tabuleiro(tabuleiro, pt1, pt2);
- if(vez == 0) {
- printf("\nVez do jogador 1 [O]\n");
- }
- if(vez == 1) {
- printf("\nVez do jogador 2 [X]\n");
- }
- if(erro == 1) {
- printf("POSIÇÃO JÁ OCUPADA. PRESSIONE NOVAMENTE!!!\n");
- }
- if(erro == 2) {
- printf("TECLA PRESSIONADA INVÁLIDA. PRESSIONE NOVAMENTE!!!\n");
- }
- printf("PRESSIONE O Nº DESEJADO: ");
- resp = getch();
- atribuiLinCol(resp, &lin, &col);
- if(verificaPos(tabuleiro, lin, col)) {
- erro = 1;
- } else {
- if(verificaErro(lin, col)) {
- erro = 2;
- } else {
- erro = 0;
- jogar(lin, col, tabuleiro, vez);
- jogadas++;
- vez = jogadas % 2;
- if(verificaTabuleiro(tabuleiro) == 1) {
- pt1++;
- CLEAR_SCR;
- exibe_tabuleiro(tabuleiro, pt1, pt2);
- printf("JOGADOR 1 VENCEU!\n");
- SYSTEM_PAUSE;
- CLEAR_SCR;
- zeraTabuleiro(tabuleiro);
- }
- if(verificaTabuleiro(tabuleiro) == -1) {
- pt2++;
- CLEAR_SCR;
- exibe_tabuleiro(tabuleiro, pt1, pt2);
- printf("JOGADOR 2 VENCEU!\n");
- SYSTEM_PAUSE;
- CLEAR_SCR;
- zeraTabuleiro(tabuleiro);
- }
- if(verificaEmpate(tabuleiro)) {
- CLEAR_SCR;
- exibe_tabuleiro(tabuleiro, pt1, pt2);
- printf("EMPATE!\n");
- SYSTEM_PAUSE;
- CLEAR_SCR;
- zeraTabuleiro(tabuleiro);
- }
- }
- }
- }while(resp != '0');
- }
- if(opcao != '1' && opcao != '0') {
- printf("ÍNDICE INVÁLIDO\nDIGITE NOVAMENTE!\n");
- getch();
- }
- } while (opcao != '0');
- printf("JOGO FINALIZADO!\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement