Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, preciso de uma ajuda, uma luz com uma atividade da facul

 

Preciso fazer um jogo da velha em C sem usar matriz, só com laços de repetição.

 

Quero ajuda pra verificar se a casa já foi escolhida, e pedir para ele repedir a jogada caso tenha sido escolhida. (pensei em usar a tabela ASCII pra isso, mas não tentei)

E outra é quando dar "velha", o empate.

 

Esse é o código:

 

#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>

int main() {

	int jogador, final, velha=1; 
	char a, b, c, d, e, f, g, h, i;
	char jogar, jogada;
	
	jogar = 's';
	while(jogar == 's' || jogar == 'S') {
		
		jogador = 1;
		final = 0;
		a = ' ';
		b = ' ';
		c = ' ';
		d = ' ';
		e = ' ';
		f = ' ';
		g = ' ';
		h = ' ';
		i = ' ';

		do {
			system("clear");	
			printf ("======================================");
			printf ("\n============ JOGO DA VELHA ===========");	
			printf ("\n======================================");
			printf ("\n=== Tabuleiro ====== Jogo da Velha ===\n");
			printf ("\n    a | b | c           %c | %c | %c", a, b, c);
			printf ("\n    __|___|__           __|___|__");
			printf ("\n    d | e | f           %c | %c | %c", d, e, f);
			printf ("\n    __|___|__           __|___|__");
			printf ("\n    g | h | i           %c | %c | %c ", g, h, i);
			printf ("\n      |   |               |   |   ");
			printf ("\n\n======================================");
			printf ("\n Jogador 01-> [O]    Jogador 02-> [X]");
			printf ("\n======================================");
			
			if(jogador == 1) {

				printf("\n\nJOGADOR 01 - Escolha uma jogada: ");
				__fpurge(stdin);
				scanf("%c", &jogada);			

				// Verifica Jogada - Jogador 01
				switch(jogada) {

					case 'a':
							a = 'O';
							break;
									
					case 'b':
							b = 'O';
							break;

					case 'c':
							c = 'O';	
							break;

					case 'd':
							d = 'O';	
							break;

					case 'e':
							e = 'O';	
							break;
				
					case 'f':
							f = 'O';	
							break;

					case 'g':
							g = 'O';	
							break;

					case 'h':
							h = 'O';	
							break;

					case 'i':
							i = 'O';	
							break;
				}


				jogador = 2;
			}
			else {
				printf("\n\nJOGADOR 02 - Escolha uma jogada: ");
				__fpurge(stdin);
				scanf("%c", &jogada);

				// Verifica Jogada - Jogador 01
				switch(jogada) {

					case 'a':
							a = 'X';
							break;
		
					case 'b':
							b = 'X';
							break;

					case 'c':
							c = 'X';	
							break;

					case 'd':
							d = 'X';	
							break;

					case 'e':
							e = 'X';	
							break;
				
					case 'f':
							f = 'X';	
							break;

					case 'g':
							g = 'X';	
							break;

					case 'h':
							h = 'X';	
							break;

					case 'i':
							i = 'X';	
							break;
				}

				jogador = 1;
			}

			//Verifica vitória

			if((a == 'O' && b == 'O' && c == 'O') || (d == 'O' && e == 'O' && f == 'O') || (g == 'O' && h == 'O' && i == 'O') || (a == 'O' && e == 'O' && i == 'O') || (c == 'O' && e == 'O' && g == 'O') || (a == 'O' && d == 'O' && g == 'O') || (b == 'O' && e == 'O' && h == 'O') || (c == 'O' && f == 'O' && i == 'O')){
				printf("\nJogador 01 venceu!\n");

				getchar();

				jogador = 1;

				final = 1;

			}
			
			else{

				if((a == 'X' && b == 'X' && c == 'X') || (d == 'X' && e == 'X' && f == 'X') || (g == 'X' && h == 'X' && i == 'X') || (a == 'X' && e == 'X' && i == 'X') || (c == 'X' && e == 'X' && g == 'X') || (a == 'X' && d == 'X' && g == 'X') || (b == 'X' && e == 'X' && h == 'X') || (c == 'X' && f == 'X' && i == 'X')){

				printf("\nJogador 02 venceu!\n");

				getchar();

				jogador = 1;

				final = 1;			
			}
		}

		} while (final != 1);

		printf("\n\nJogar novamente (s) ou (n)? ");
		__fpurge(stdin);
		scanf("%c", &jogar);		
		system("clear");
	}
	
	printf("\n\n");
	return 0;
}

 

  • Amei 1
Postado

@KXSY obrigado pela resposta!

 

Cheguei a verificar esse seu post, mas vi com os colegas que também não posso usar vetor... Não consigo pensar em outro modo, sei que tem mas a cabeça aqui não ta ajudando...

  • Curtir 1
Postado

@Occidere     então se não pode usar matriz nem vetor não poderá também usar struct , mas com variáveis simples como você começou a fazer  pode ser também ,  e parece que você está no sistema operacional Linux ,  e como estou usando o windows alguns comandos são diferentes ,  mas para ver se uma jogada já foi feita você pode comparar o valor daquela variável se ela está com um espaço ou não ,  e se não for espaço é por que essa casa já está ocupada ,  então seu código com algumas modificações poderia ser assim  :

#include <stdio.h>
#include <string.h>
#include <conio.h>
/*#include <stdio_ext.h>*/
#include <stdlib.h>
int main(){
    int jogador,w, finall, velha=1,flag;
    char a, b, c, d, e, f, g, h, i;
    char jogar='S', jogada;
    while(toupper(jogar) == 'S'){
        jogador = 1;
        finall = 0;
        a = ' ';
        b = ' ';
        c = ' ';
        d = ' ';
        e = ' ';
        f = ' ';
        g = ' ';
        h = ' ';
        i = ' ';
        do {
            system("cls");/*system("clear");  no Linux */
            printf ("======================================");
            printf ("\n============ JOGO DA VELHA ===========");
            printf ("\n======================================");
            printf ("\n=== Tabuleiro ====== Jogo da Velha ===\n");
            printf ("\n    a | b | c           %c | %c | %c", a, b, c);
            printf ("\n    __|___|__           __|___|__");
            printf ("\n    d | e | f           %c | %c | %c", d, e, f);
            printf ("\n    __|___|__           __|___|__");
            printf ("\n    g | h | i           %c | %c | %c ", g, h, i);
            printf ("\n      |   |               |   |   ");
            printf ("\n\n======================================");
            printf ("\n Jogador 01-> [O]    Jogador 02-> [X]");
            printf ("\n======================================");
            do{
                flag=0;
                if(jogador == 1) {
                    printf("\n\nJOGADOR 01 - Escolha uma jogada: ");
                    fflush(stdin);/*__fpurge(stdin); no Linux */
                    scanf("%c", &jogada);
                    // Verifica Jogada - Jogador 01
                    switch(jogada){
                    case 'a':
                        if(a==' ')
                            a = 'O';
                        else flag=1;
                        break;
                    case 'b':
                        if(b==' ')
                            b = 'O';
                        else flag=1;
                        break;
                    case 'c':
                        if(c==' ')
                            c = 'O';
                        else flag=1;
                        break;
                    case 'd':
                        if(d==' ')
                            d = 'O';
                        else flag=1;
                        break;
                    case 'e':
                        if(e==' ')
                            e = 'O';
                        else flag=1;
                        break;
                    case 'f':
                        if(f==' ')
                            f = 'O';
                        else flag=1;
                        break;
                    case 'g':
                        if(g==' ')
                            g = 'O';
                        else flag=1;
                        break;
                    case 'h':
                        if(h==' ')
                            h = 'O';
                        else flag=1;
                        break;
                    case 'i':
                        if(i==' ')
                            i = 'O';
                        else flag=1;
                        break;
                    }
                }
                else {
                    printf("\n\nJOGADOR 02 - Escolha uma jogada: ");
                    fflush(stdin);/*__fpurge(stdin); no Linux */
                    scanf("%c", &jogada);
                    // Verifica Jogada - Jogador 01
                    switch(jogada) {
                    case 'a':
                        if(a==' ')
                            a = 'X';
                        else flag=1;
                        break;
                    case 'b':
                        if(b==' ')
                            b = 'X';
                        else flag=1;
                        break;
                    case 'c':
                        if(c==' ')
                            c = 'X';
                        else flag=1;
                        break;
                    case 'd':
                        if(d==' ')
                            d = 'X';
                        else flag=1;
                        break;
                    case 'e':
                        if(e==' ')
                            e = 'X';
                        else flag=1;
                        break;
                    case 'f':
                        if(f==' ')
                            f = 'X';
                        else flag=1;
                        break;
                    case 'g':
                        if(g==' ')
                            g = 'X';
                        else flag=1;
                        break;
                    case 'h':
                        if(h==' ')
                            h = 'X';
                        else flag=1;
                        break;
                    case 'i':
                        if(i==' ')
                            i = 'X';
                        else flag=1;
                        break;
                    }
                }
                if( flag ){printf("Posicao ocupada , jogada invalida !     Tecle");getch();}
            }while( flag );/* se casa já ocupada */
            if(jogador==1)jogador=2;
            else jogador=1;
            //Verifica vitória

            if((a == 'O' && b == 'O' && c == 'O') || (d == 'O' && e == 'O' && f == 'O') ||
               (g == 'O' && h == 'O' && i == 'O') || (a == 'O' && e == 'O' && i == 'O') ||
               (c == 'O' && e == 'O' && g == 'O') || (a == 'O' && d == 'O' && g == 'O') ||
               (b == 'O' && e == 'O' && h == 'O') || (c == 'O' && f == 'O' && i == 'O')){
                printf("\nJogador 01 venceu!\n");
                getchar();
                jogador = 1;
                finall = 1;
            }
            else{
                if((a == 'X'  &&  b == 'X'  &&  c == 'X') || (d == 'X'  &&  e == 'X' &&
                    f == 'X') || (g == 'X'  &&  h == 'X'  &&  i == 'X') || (a == 'X' &&
                    e == 'X'  &&  i == 'X') || (c == 'X'  &&  e == 'X'  &&  g == 'X') ||
                   (a == 'X'  &&  d == 'X'  &&  g == 'X') || (b == 'X'  &&  e == 'X' &&
                    h == 'X') || (c == 'X'  &&  f == 'X'  &&  i == 'X')){
                    printf("\nJogador 02 venceu!\n");
                    getchar();
                    jogador = 1;
                    finall = 1;
                }
            }
        }while (finall != 1);
        printf("\n\nJogar novamente (  s  ) ou (  n  ) ? ");
        fflush(stdin);/*__fpurge(stdin); no Linux */
        w=getch();
        jogar=w;
    }
    printf("\n\n");
    return 0;
}

 

  • Obrigado 1
Postado

@devair1010 modifiquei algumas coisas por conta do conio.h que não funciona no Linux e o código rodou perfeitamente! no início eu tava pensando em colocar um if antes do switch, mas ia dar muito mais trabalho.
Agora vou tentar pra quando rolar um "empate"


Muito obrigado!

  • Obrigado 1
Postado

Segue uma versão funcional:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

struct Campo {
    char simbolo;
    bool disponivel;
};

struct Campo c1;
struct Campo c2;
struct Campo c3;
struct Campo c4;
struct Campo c5;
struct Campo c6;
struct Campo c7;
struct Campo c8;
struct Campo c9;


struct Jogador {
    char nome[10];
    int pontos;
};

struct Jogador j1;
struct Jogador j2;

int main() {
    int checarFimPartida(int jogadas);
    bool jogar(int posicao, bool vezJogador1);
    bool jogarDeNovo();
    void cadastrarJogadores();
    void checarCampeao();
    void desenharTabuleiro();
    void mostrarRelatorio(int status);
    void reiniciarTabuleiro();

    cadastrarJogadores();

    do {
        bool vezJogador1 = true;

        int jogadas = 0;
        int status = -1;
        int posicao = 0;

        reiniciarTabuleiro();

        while (jogadas < 9 && status == -1) {
            do {
                desenharTabuleiro();
                printf("%s > ", (vezJogador1 ? j1.nome : j2.nome));
                scanf("%i", &posicao);
                vezJogador1 = jogar(posicao, vezJogador1);
            } while (posicao < 1 || posicao > 9);

            ++jogadas;
            status = checarFimPartida(jogadas);

            if (status == 1)
                j1.pontos++;
            else if (status == 2)
                j2.pontos++;
        }

        desenharTabuleiro();
        mostrarRelatorio(status);
    } while (jogarDeNovo());

    checarCampeao();
    return 0;
}

void cadastrarJogadores() {
    strcpy(j1.nome, "Jogador 1");
    j1.pontos = 0;

    strcpy(j2.nome, "Jogador 2");
    j2.pontos = 0;
}

int checarFimPartida(int jogadas) {
    /*
     * -1 - Jogo continua
     *  0 - Empate
     *  1 - Jogador 1
     *  2 - Jogador 2
     */
    int situacao;

    if ((c1.simbolo == 'X' && c2.simbolo == 'X' && c3.simbolo == 'X') ||
        (c4.simbolo == 'X' && c5.simbolo == 'X' && c6.simbolo == 'X') ||
        (c7.simbolo == 'X' && c8.simbolo == 'X' && c9.simbolo == 'X') ||
        (c1.simbolo == 'X' && c4.simbolo == 'X' && c7.simbolo == 'X') ||
        (c2.simbolo == 'X' && c5.simbolo == 'X' && c8.simbolo == 'X') ||
        (c3.simbolo == 'X' && c6.simbolo == 'X' && c9.simbolo == 'X') ||
        (c1.simbolo == 'X' && c5.simbolo == 'X' && c9.simbolo == 'X') ||
        (c7.simbolo == 'X' && c5.simbolo == 'X' && c3.simbolo == 'X')) {
        situacao = 1;
    } else if ((c1.simbolo == 'O' && c2.simbolo == 'O' && c3.simbolo == 'O') ||
               (c4.simbolo == 'O' && c5.simbolo == 'O' && c6.simbolo == 'O') ||
               (c7.simbolo == 'O' && c8.simbolo == 'O' && c9.simbolo == 'O') ||
               (c1.simbolo == 'O' && c4.simbolo == 'O' && c7.simbolo == 'O') ||
               (c2.simbolo == 'O' && c5.simbolo == 'O' && c8.simbolo == 'O') ||
               (c3.simbolo == 'O' && c6.simbolo == 'O' && c9.simbolo == 'O') ||
               (c1.simbolo == 'O' && c5.simbolo == 'O' && c9.simbolo == 'O') ||
               (c7.simbolo == 'O' && c5.simbolo == 'O' && c3.simbolo == 'O')) {
        situacao = 2;
    } else if (jogadas == 9) {
        situacao = 0;
    } else {
        situacao = -1;
    }

    return situacao;
}

void checarCampeao() {
    printf("\n");
    printf("------------------------------------------------------------- \n");
    printf("Placar: \n");
    printf("    %10s > %i pontos \n", j1.nome, j1.pontos);
    printf("    %10s > %i pontos \n\n", j2.nome, j2.pontos);

    if (j1.pontos == j2.pontos)
        printf(">> Empate entre %s e %s. Parabéns aos dois. << \n", j1.nome, j2.nome);
    else
        printf(">> Parabéns %s, você venceu o jogo. << \n", (j1.pontos > j2.pontos ? j1 : j2).nome);

    printf("------------------------------------------------------------- \n\n");
}

void desenharTabuleiro() {
    system("clear");
    printf("-------------------------------------- \n");
    printf("           Jogo da Velha \n");
    printf("-------------------------------------- \n\n");
    printf(" 1 | 2 | 3            %c | %c | %c \n", c1.simbolo, c2.simbolo, c3.simbolo);
    printf("---*---*---          ---*---*--- \n");
    printf(" 4 | 5 | 6            %c | %c | %c \n", c4.simbolo, c5.simbolo, c6.simbolo);
    printf("---*---*---          ---*---*--- \n");
    printf(" 7 | 8 | 9            %c | %c | %c \n\n", c7.simbolo, c8.simbolo, c9.simbolo);
}

bool jogar(int posicao, bool vezJogador1) {
    switch (posicao) {
        case 1:
            if (c1.disponivel) {
                c1.simbolo = vezJogador1 ? 'X' : 'O';
                c1.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 2:
            if (c2.disponivel) {
                c2.simbolo = vezJogador1 ? 'X' : 'O';
                c2.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 3:
            if (c3.disponivel) {
                c3.simbolo = vezJogador1 ? 'X' : 'O';
                c3.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 4:
            if (c4.disponivel) {
                c4.simbolo = vezJogador1 ? 'X' : 'O';
                c4.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 5:
            if (c5.disponivel) {
                c5.simbolo = vezJogador1 ? 'X' : 'O';
                c5.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 6:
            if (c6.disponivel) {
                c6.simbolo = vezJogador1 ? 'X' : 'O';
                c6.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 7:
            if (c7.disponivel) {
                c7.simbolo = vezJogador1 ? 'X' : 'O';
                c7.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 8:
            if (c8.disponivel) {
                c8.simbolo = vezJogador1 ? 'X' : 'O';
                c8.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
        case 9:
            if (c9.disponivel) {
                c9.simbolo = vezJogador1 ? 'X' : 'O';
                c9.disponivel = false;
                vezJogador1 = !vezJogador1;
            }
            break;
    }

    return vezJogador1;
}

bool jogarDeNovo() {
    char opcao = ' ';

    printf("\n");

    while (true) {
        printf("Jogar novamente? [ S / N ]: ");
        scanf(" %c", &opcao);

        if (opcao == 's' || opcao == 'S')
            return true;
        else if (opcao == 'n' || opcao == 'N')
            return false;
    }
}

void mostrarRelatorio(int status) {
    switch (status) {
        case 0:
            printf("A partida empatou entre %s e %s. \n", j1.nome, j2.nome);
            break;
        case 1:
            printf("%s venceu a partida. \n", j1.nome);
            break;
        case 2:
            printf("%s venceu a partida. \n", j2.nome);
            break;
        default:
            printf("[ E ]: Valor inválido do status: '%i'. \n", status);
            exit(1);
    }
}

void reiniciarTabuleiro() {
    c1.simbolo = ' ';
    c1.disponivel = true;

    c2.simbolo = ' ';
    c2.disponivel = true;

    c3.simbolo = ' ';
    c3.disponivel = true;

    c4.simbolo = ' ';
    c4.disponivel = true;

    c5.simbolo = ' ';
    c5.disponivel = true;

    c6.simbolo = ' ';
    c6.disponivel = true;

    c7.simbolo = ' ';
    c7.disponivel = true;

    c8.simbolo = ' ';
    c8.disponivel = true;

    c9.simbolo = ' ';
    c9.disponivel = true;
}

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!