Ir ao conteúdo
  • Cadastre-se
Occidere

C Jogo da Velha em C sem matriz

Posts recomendados

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Occidere Se não pode usar uma matriz talvez você possar usar um vetor

int vetor[3*3];

assim você teria nove espaços de memoria ao invés de declarar nove variáveis.

para checar se o espaço está ocupado basta fazer dessa maneira

if(vetor[local]==VAZIO)
  vetor[local]=BOLA;
else
  puts("Espaço ocupado.");

recomendo checar esse tópico aqui que eu postei um jogo da velha

https://www.clubedohardware.com.br/forums/topic/1371971-jogo-da-velhaerro-ao-executar/

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Occidere O outro modo seria realmente declarar nove variáveis, desta maneira.

int espaco1,espaco2,espaco3,...,espaco9;

Que realmente não seria uma boa ideia, porque fica bem mais fácil de checar tudo do jeito que eu fiz.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!