Vamos Programar? – Introdução à Programação #23

15 Comentários

O mundo está constantemente a evoluir: desde o mais pequeno inseto à espécie Humana. Dentro das palavras que mais ouvimos atualmente, incluímos “evolução”, “mudança”, “futuro”.

A tecnologia tem revolucionado o mundo das mais diversas formas: do mais simples aparelho para medir o tempo ao mais complexo acelerador de partículas. Se quer entrar no mundo da tecnologia e deixar a sua marca, pode começar aqui.

Vamos Programar? – Introdução à Programação #23

Como referido no início desta sub-saga, isto é apenas uma Introdução à Programação com a linguagem C, daí o primeiro capítulo do Vamos Programar? estar quase concluído. Este capítulo terminará no episódio 25.

Nesta e na próxima semana iremos deixar aqui dois grandes exercícios e o código da sua resolução. Mais abaixo encontra um inquérito para sabermos o que gostava de ver na próxima sub-saga do Vamos Programar?.

Construir o Jogo do Galo

O primeiro desafio final consiste em desenvolver um pequeno Jogo do Galo de linha de comandos. Abaixo encontra as regras do jogo, tal como alguns objetivos/dicas de resolução.

Regras:

  • São necessários dois jogadores;
  • Existe um tabuleiro 3×3, onde um dos jogadores coloca X e o outro coloca O;
  • Um jogador vence quando coloca a sua peça numa linha, coluna ou diagonal inteira.

Objetivos

  • O primeiro jogador deverá começar por jogar o “X” e o segundo um “O”.
  • No final de cada jogo e no início da execução do programa, deve ser perguntado ao jogador se deseja jogar ou sair do programa;
  • Tente não utilizar as funções “fflush” e “_fpurge”.

Os jogadores deverão fornecer o número da linha e da coluna em que querem colocar as peças. Pode consultar a proposta de resolução aqui.


Mais uma vez, gostávamos de saber a sua opinião. Caso tenha alguma dúvida, pode sempre utilizar os comentários para colocar a questão. Caso o faça,  pedimos que utilize a keyword [DUVIDA] no início do seu comentários.

Resoluções de exercícios.

Esta saga

Henrique Dias

Mais episódios: 
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13][12] [14] [15] [16]
[17] [18] [19] [20] [21] [22] [23][24]

homefacebookgoogle-plus

Comentários

15

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Jorge Gabriel
    Jorge Gabriel

    Como assim está no fim?? Não vão falar de ficheiros? leitura de ficheiros??

    1. Avatar de Eduardo Pires
      Eduardo Pires

      #1 percebo o que queres dizer, mas tens de ver que é uma introdução

    2. Avatar de Henrique Dias

      Não se esqueça que isto é apenas uma introdução cujo objetivo é dar uma boa visão acerca dos comandos e primitivas da maioria das Linguagens de Programação. 🙂

      1. Avatar de Jorge Gabriel
        Jorge Gabriel

        Eu compreendo que é uma introdução mas acho que ficamos muito à quem dos esperado. Eu aprendi C com um livro porque na Internet a informação está muito dispersa e qualquer pessoa perde-se com muita facilidade.
        Era apenas isso, nada mais

        1. Avatar de Henrique Dias

          Boa noite Jorge,

          Eu também o estou a compreender. Esta saga também será condensada num “mini-livro” em pdf, revista por um colega nosso e publicada no último artigo 🙂

          Na próxima linguagem, abordaremos mais. Já votou?

  2. Avatar de Rui Peixeiro

    Jogo do Galo… Foi a minha primeira “brincadeira” assim que ganhei uma luzes de programação, na altura em Pascal! Tinha som e tudo! Se não falha a memória 1994!

  3. Avatar de iFXBR
    iFXBR

    Segue meu PORCO-CODE

    #include

    void mostra_galo(void);
    int jogada_valida(int jlinha, int jcoluna);
    void registra_jogada(int jlinha, int jcoluna, int jjogador);
    int verifica_vencedor(void);

    int jogadas, jogador, linha, coluna, vencedor;
    char galo[3][3];
    char jogador1[15], jogador2[15];

    int main(void) {
    printf(“Galo !\n\n”);

    memset(galo, ‘ ‘, 9);
    jogadas = 0;
    jogador = 1;
    vencedor = 0;

    printf(“Entre com o nome do Jogador 1: “);
    scanf(“%14s”, &jogador1);

    printf(“Entre com o nome do Jogador 2: “);
    scanf(“%14s”, &jogador2);

    mostra_galo();

    while(vencedor == 0) {
    if(jogador == 1) printf(“%s, entre linha e coluna (linha,coluna): “, jogador1);
    if(jogador == 2) printf(“%s, entre linha e coluna (linha,coluna): “, jogador2);

    scanf(“%1d,%1d”, &linha, &coluna);

    if(jogada_valida(linha, coluna)) {
    jogadas++;

    registra_jogada(linha, coluna, jogador);
    mostra_galo();

    if(jogador == 1) jogador = 2; else jogador = 1;
    }
    else printf(“Jogada inválida! Tente novamente.\n\n”);

    vencedor = verifica_vencedor();
    }

    printf(“Temos um vencedor! Parabéns “);

    if(vencedor == 1) printf(“%s”, jogador1);
    if(vencedor == 2) printf(“%s”, jogador2);

    printf(“! Vocé é o Vencedor!\n\n”);
    }

    void mostra_galo(void) {
    printf(“\nJogador 1: %s | Jogador 2: %s | Numero de Jogadas: %d\n\n”, jogador1, jogador2, jogadas);

    printf(” COLUNA \n”);
    printf(” 1 2 3 \n”);
    printf(” |—|—|—|\n”);
    printf(“L 1 | %c | %c | %c |\n”, galo[0][0], galo[0][1], galo[0][2]);
    printf(“I |—|—|—|\n”);
    printf(“N 2 | %c | %c | %c |\n”, galo[1][0], galo[1][1], galo[1][2]);
    printf(“H |—|—|—|\n”);
    printf(“A 3 | %c | %c | %c |\n”, galo[2][0], galo[2][1], galo[2][2]);
    printf(” |—|—|—|\n\n”);

    return;
    }

    int jogada_valida(int jlinha, int jcoluna) {
    if((jlinha > 3) || (jcoluna > 3)) return 0;
    if(galo[jlinha – 1][jcoluna – 1] != ‘ ‘) return 0;

    return 1;
    }

    void registra_jogada(int jlinha, int jcoluna, int jjogador) {
    if(jjogador == 1) galo[jlinha – 1][jcoluna – 1] = ‘X’;
    if(jjogador == 2) galo[jlinha – 1][jcoluna – 1] = ‘O’;

    return;
    }

    int verifica_vencedor(void) {
    int n;

    for(n = 0; n < 3; n++) {
    if((galo[n][2] == galo[n][1]) && (galo[n][1] == galo[n][0])) {
    if(galo[n][0] == 'X') return 1;
    if(galo[n][0] == 'O') return 2;
    }

    if((galo[2][n] == galo[1][n]) && (galo[1][n] == galo[0][n])) {
    if(galo[0][n] == 'X') return 1;
    if(galo[0][n] == 'O') return 2;
    }
    }

    if((galo[0][0] == galo[1][1]) && (galo[1][1] == galo[2][2])) {
    if(galo[1][1] == 'X') return 1;
    if(galo[1][1] == 'O') return 2;
    }

    if((galo[0][2] == galo[1][1]) && (galo[1][1] == galo[2][0])) {
    if(galo[1][1] == 'X') return 1;
    if(galo[1][1] == 'O') return 2;
    }

    return 0;
    }

    1. Avatar de Guilherme Lawless
      Guilherme Lawless

      jogador = (jogador == 1) ? 2 : 1

      1. Avatar de matallui
        matallui

        Sim, essa linha de código é equivalente a:

        if (jogador == 1)
        jogador = 2;
        else
        jogador = 1;

        Uma outra forma interessante para trocar de jogador (neste caso específico) seria:

        jogador ^= 0x03;

        Cumps!

        1. Avatar de Guilherme Lawless
          Guilherme Lawless

          Agora perdi-me!
          Qual a diferença entre usar ^= e &= ?

          1. Avatar de matallui
            matallui

            & -> AND
            ^ -> XOR

            Quando usas AND, o resultado vai ter os bits a ‘1’ quando ambos os bits na mesma posição está a ‘1’ nos operandos.
            Quando usas XOR, o resultado vai ter os bits a ‘1’ quando os bits na mesma posição dos operandos diferem.

            Exemplo:

            1 & 3 = 1
            2 & 3 = 2
            3 & 3 = 3

            1 ^ 3 = 2
            2 ^ 3 = 1
            3 ^ 3 = 0

            A operação XOR é utilizada quando queres fazer “bit flipping”. Isto é, se tens uma variável e queres alterar o 3º bit para o valor oposto, fazes:

            var ^= 0x04; // 0x04 = 00000100

          2. Avatar de Guilherme Lawless
            Guilherme Lawless

            Interessante, nunca tinha pensado nesse uso. Obrigado!

  4. Avatar de Guilherme Lawless
    Guilherme Lawless

    Olá Henrique. Queria apenas congratular pelo excelente trabalho nesta saga, e dizer que vou guardar a solução fornecida como “boas práticas em C”. Cumprimentos.

  5. Avatar de Helder Sousa
    Helder Sousa

    Jogo do Galo feito, testem e digam algo! Desde ja otima iniciativa 🙂 ppl
    Segue a baixo o link do projeto:
    https://www.dropbox.com/s/vxueoe6qyynt24b/GaloGame.zip?dl=0
    Cumpz

  6. Avatar de Samuel Barroca
    Samuel Barroca

    Eu tenho este código como consigo fazer o jogo do galo?

    #include
    #include
    #include
    #define LINHAS 3
    #define COLUNAS 3

    char matrix[COLUNAS][LINHAS];

    void delay(unsigned int mseconds){
    clock_t goal=mseconds+clock();
    while(goal>clock());
    }

    void InitMatrix(void){
    char i,j;
    for(i=0;i<LINHAS;++i){
    for(j=0;j<COLUNAS;++j){
    matrix[i][j]=0;
    }
    }
    }

    void printMatrix(void){
    char i,j;
    for(i=0;i<LINHAS;++i){
    for(j=0;j<COLUNAS;++j){
    printf(" %d ",matrix[j][i]);
    if(j<(COLUNAS-1)) printf("|");
    }
    printf("\n");
    if(i<(LINHAS-1)){
    for(j=0;j<COLUNAS;++j){
    if(j “);
    scanf(“%d”,&jogada);
    printf(“Jogaste %d”,jogada);

    }