Jogo do Galo em C – Versão 1.02

Posted by admin on 2 de Abril de 2012 | Filed under Exercícios, Línguagens de Programação, Programação

Continuo a tentar evoluir os meus conhecimentos em C tentado criar o “meu” Jogo do Galo. No post anterior, Jogo do Galo em C – Versão 1.01 o visitante Ricardo referiu que eu deveria implementar uma função para efectuar a leitura das coordenadas para evitar ter de repetir sempre esse pedaço de código.

Confesso que ainda tenho algumas dificuldades a implementar funções, nomeadamente na definição dos argumentos e dos parâmetros, e como tal para conseguir implementar este exemplo tive de recorrer a variáveis globais, coisa que não se deve usar.

No seguimento da evolução do projecto surgiu um outro problema que foi ao apresentar a jogada, as coordenadas anteriores e a consequente jogada desaparecem do tabuleiro, e não sei como poderei contornar esta situação.

Aqui fica o código:

/************************************************
Nome: Nuno Santos
Data: 02-04-2012
Projecto: Jogo do Galo_1.03
************************************************/

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

#define DIM 3

int x, y;
int n_jogadas;

void posicoes()
{
    // Acção Jogador - Coordenadas

        printf("\nDigite as coordenadas do X: ");
        scanf("%d", &x);
        fflush(stdin);

        printf("\nDigite as coordenadas do Y: ");
        scanf("%d", &y);
        fflush(stdin);

        x--;
        y--;
}

int main()
{
    char Galo [DIM][DIM] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
    int i, j, n;

    // Inicia a Matriz

    while(n_jogadas < DIM*DIM)
    {
        for(i = 0; i < 3; i++)
        {
            for(j = 0; j < 3; j++)
            {
                Galo[i][j] = ' ';
            }
        }

        posicoes(x, y);

        if(Galo[x][y] != ' ')
        {
            printf("\nPosicao invalida, tente novamente.\n");
        }
        else
        {
            Galo[x][y] = 'X';
        }

        // Apresenta a Matriz

        printf("\n");

        for(n = 0; n < 3; n++)
        {
            printf(" %c | %c | %c ", Galo[n][0], Galo[n][1], Galo[n][2]);

            if(n != 2)
            {
                printf("\n---|---|---\n");
            }
        }

        n_jogadas++;

        printf("\n");
    }

    system("PAUSE");
}

Se fosse possível gostaria que me fossem dadas algumas dicas de como resolver estes problemas, no entanto continuarei a pesquisar sobre o assunto.

Share

7 Responses to “Jogo do Galo em C – Versão 1.02”

  1. A função “posicoes()” não deve ser “void”, deve retornar um array com as posições. O corpo do “main()” deve ser reduzido e ser
    criada uma função “jogar()”. E a função de leitura deveria ser renomeada para “lerposicao()” ou algo assim. É necessário estudar mais
    a passagem de argumentos entre funções. Também não seria má ideia estudar os ponteiros.
    E já agora, esse código foi feito em windows? Isso não presta para C. Usa Linux que tem boas ferramentas.

  2. Boa Tarde!

    Pois, eu vou dedicar-me mais ao estudo das funções, vectores e apontadores. Sim estou a usar Windows para programar, mas estou decidido a passar para Linux Mint que já tenho instalado, pois começo a gostar da filosofia Linux.

    Cumps

  3. Em alternativa, para ultrapassar a dificuldade de devolver dois valores na função posições, podes fazer duas chamadas a uma função que lê uma coordenada de cada vez, e a retorna. Assim em vez de chamar posições, chamarias:
    posicaoX = lerCoordenada(‘X’);
    posicaoY = lerCoordenada(‘Y’);

    a implementação de lerCoordenada seria algo do estilo (aviso: o meu C está algo enferrujado):
    int lerCoordenada(char coordenada)
    {
    int valor;
    printf(“\nDigite as coordenadas do %c: “, coordenada);
    scanf(“%d”, &valor);
    fflush(stdin);
    valor–; // para passar a base-0
    return valor;
    }
    Claro está que quando estudares a passagem de parametros por referência e o scope de variáveis, tudo fica mais fácil.

  4. Há muito tempo atrás escrevi um jogo do Galo em C e se bem me lembro tinha uma função para fazer uma jogada pelo computador e outra para o humano(era impossível ganhar contra o computador… e se te distrai-ses perdias), tinha ainda uma função para analisar se o jogo terminava e quem ganhava se termina-se. Com estas 3 funções era so necessário criar um ciclo para as ir rodando, do género:
    while(1){
    humano();
    if (fim_do_jogo()) break;
    computador();
    if (fim_do_jogo()) break;
    }

    No fim tornei um pouco mais complexo, podendo haver 2 jogadores humanos e alterando a ordem de quem começava. Mas já não sei desse código, se por acaso encontrar meto aqui.

  5. No caso de mostrar todas as jogadas, o erro está nos 2 ciclos “for”. O corpo de ambos tem de ir até à apresentação da matriz.

  6. Viva!

    Ponto 1: o 1º ciclo for q usas, a seguir ao while, é o que causa as coordenadas anteriores desaparecerem, pois o q estás a fazer é q sempre q é feita uma jogada ele volta a limpar os valores da matriz, o q não é necessário, visto q tu já inicias a matriz limpa, quando a declaras.

    Ponto 2: Definitivamente, usar variáveis globais é algo a evitar, e não precisas usá-las aqui.

    Não programo há muito tempo, só aprendi C à cerca de 3 anos, mas algo q aprendi q vai para além do C, é q devemos ganhar logo bons hábitos e programação.

    A maneira q prograo é a de usar funções para várias tarefas, por mais simples q a tarefa seja ou por mais pequeno q o código seja. Assim sendo, os meus conselhos passam muito por aí. Isto para explicar um pouco a maneira como programo.

    Uma maneira de dares a volta à questão das variáveis globais, sem usar ponteiros, é, criar uma função q vai devolver um int, e onde vais pedir para introduzir apenas um parametro da coordenada, ou seja tens uma função q é chamada 2 vezes para obteres os valores da coordenada onde o utilizador vai jogar.
    Crias outra função q vai receber estes dois valores q o utilizador introduzio, e q vai verificar se nessa localização já existe alguma jogada (podes criar outra função para fazer esta verificação), e então depois preenche ou não esse local na matriz consoante a verificação feita.

    Se achares pertinente, cria tb uma função em q o seu trabalho é apenas imprimir a matriz, será sempre mais fácil chamar apenas a função q criaste do q reescrever o código todo.

    Outra prática q tenho é a de fazer um esboço de funções/acções necessárias em papel. Por exemplo neste caso teria algo do estilo para pedir uma jogado ao utilizador:
    - pedir coordenadas
    – coordenada x
    – coordenada y
    - verificar local
    – se limpo -> colocar marca
    – se não limpo -> pedir novas coordenadas

    algo neste estilo. Vai te dar sempre uma ideia das acções q são necessárias e q funções escrever para q essas acções sejam realizadas.

  7. [...] meus pequenos conhecimentos em C tentado programar o Jogo do Galo. Tal como me foi indicado aqui: Jogo do Galo em C – Versão 1.02 pelos visitantes tentei passar todas as funcionalidades já programadas para funções, [...]

Leave a Reply