MC102MN

Introdução a Algoritmos e programação de computadores

Aula XV, um jogo da memória

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

#define TAMANHO 2

struct pos {
  int lin;
  int col;
};

struct pos le_posicao() {
  char linha[2];
  struct pos p;
  printf("Digite a posição (ex. a 1, b 2): ");
  scanf("%s %d", linha, &p.col);
  p.lin = linha[0]-'a';
  return p;
}

void imprime_tabuleiro(char *tabuleiro) {
  int i,j;
  printf("   ");
  for (j = 0; j < TAMANHO; ++j) {
    printf("%2d ", j);
  }
  printf("\n");
  printf("    ");
  for (j = 0; j < TAMANHO; ++j) {
    printf("---");
  }
  printf("\n");
  for (i = 0; i < TAMANHO; ++i) {
    printf("%c | ", 'a'+i);
    for (j = 0; j < TAMANHO; ++j) 
      printf("%c  ", tabuleiro[TAMANHO*i+j]);
    printf("|\n");
  }
  printf("    ");
  for (j = 0; j < TAMANHO; ++j) {
    printf("---");
  }
  printf("\n");
}

int faz_jogada(char *tabuleiro, char *cartas, int jogada) {
  if (jogada == 0) imprime_tabuleiro(tabuleiro);
  struct pos p1, p2;
  do {
    p1 = le_posicao();
  } while(tabuleiro[TAMANHO*p1.lin+p1.col] != '*');
  tabuleiro[TAMANHO*p1.lin+p1.col] = cartas[TAMANHO*p1.lin+p1.col];
  imprime_tabuleiro(tabuleiro);
  printf("A carta era: %c\n", cartas[TAMANHO*p1.lin+p1.col]);
  do {
    p2 = le_posicao();
  } while(tabuleiro[TAMANHO*p2.lin+p2.col] != '*');
  tabuleiro[TAMANHO*p2.lin+p2.col] = cartas[TAMANHO*p2.lin+p2.col];
  imprime_tabuleiro(tabuleiro);
  printf("A carta era: %c\n", cartas[TAMANHO*p2.lin+p2.col]);
  if (cartas[TAMANHO*p1.lin+p1.col] == cartas[TAMANHO*p2.lin+p2.col]) {
    printf("Você acertou!\n");
    tabuleiro[TAMANHO*p1.lin+p1.col] = ' ';
    tabuleiro[TAMANHO*p2.lin+p2.col] = ' ';
    return 1;
  } else {
    printf("Você errou.\n");
    tabuleiro[TAMANHO*p1.lin+p1.col] = '*';
    tabuleiro[TAMANHO*p2.lin+p2.col] = '*';
    return 0;
  }
}

void inicializa(char *tabuleiro, char *cartas) {
  char letras[] = "AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZaabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz0011223344556677889900";
  struct pos posicoes[TAMANHO*TAMANHO], tmp;
  int i,j;
  for (i = 0; i < TAMANHO; i++) {
    for (j = 0; j < TAMANHO; j++) {
      posicoes[TAMANHO*i+j].lin = i;
      posicoes[TAMANHO*i+j].col = j;
    }
  }
  // troca as posições
  for (i = 0; i < TAMANHO*TAMANHO; ++i) {
    j = rand() % (TAMANHO*TAMANHO-i);
    tmp = posicoes[j+i];
    posicoes[j+i] = posicoes[i];
    posicoes[i] = tmp;
  }
  // agora preenchemos o tabuleiro e as cartas
  for (i = 0; i < TAMANHO*TAMANHO; ++i) {
    tabuleiro[TAMANHO*posicoes[i].lin+posicoes[i].col] = '*';
    cartas[TAMANHO*posicoes[i].lin+posicoes[i].col] = letras[i];
  }
}

int main(int argc, char *argv[]) {
  char tabuleiro[TAMANHO*TAMANHO], cartas[TAMANHO*TAMANHO];
  int pontos = TAMANHO*TAMANHO/2, jogada = 0;
  srand(time(NULL));
  inicializa(tabuleiro, cartas);
  while (pontos > 0) {
    pontos -= faz_jogada(tabuleiro, cartas, jogada);
    jogada += 1;
  }
  printf("Parabéns, você conseguiu ganhar %d pontos em %d jogadas.", TAMANHO*TAMANHO/2, jogada);
  return 0;
}


Um jogo de campo minado

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

#define TAMANHO 10

struct pos {
  int lin;
  int col;
};

struct pos le_posicao() {
  char linha[2];
  struct pos p;
  printf("Digite a posição (ex. a 1, b 2): ");
  scanf("%s %d", linha, &p.col);
  p.lin = linha[0]-'a';
  return p;
}

int min(int a, int b) {
  if (a < b) return a;
  return b;
}

int max(int a, int b) {
  if (a < b) return b;
  return a;
}

void imprime_parte_visivel(char *parte_visivel) {
  int i,j;
  printf("   ");
  for (j = 0; j < TAMANHO; ++j) {
    printf("%2d ", j);
  }
  printf("\n");
  printf("    ");
  for (j = 0; j < TAMANHO; ++j) {
    printf("---");
  }
  printf("\n");
  for (i = 0; i < TAMANHO; ++i) {
    printf("%c | ", 'a'+i);
    for (j = 0; j < TAMANHO; ++j) 
      printf("%c  ", parte_visivel[TAMANHO*i+j]);
    printf("|\n");
  }
  printf("    ");
  for (j = 0; j < TAMANHO; ++j) {
    printf("---");
  }
  printf("\n");
}

void limpa_vizinhos(char *parte_visivel, char *mapa_real, struct pos p) {
  int i = p.lin, j = p.col, vi, vj;
  for (vi = max(0,i-1); vi <= min(i+1,TAMANHO-1); vi++) {
    for (vj = max(0,j-1); vj <= min(j+1,TAMANHO-1); vj++) {
      if (parte_visivel[TAMANHO*vi+vj] == 'L') continue;
      if ((parte_visivel[TAMANHO*vi+vj] == mapa_real[TAMANHO*vi+vj])) continue;
      parte_visivel[TAMANHO*vi+vj] = mapa_real[TAMANHO*vi+vj];
      if (parte_visivel[TAMANHO*vi+vj] == ' ') {
        p.lin = vi;
        p.col = vj;
        limpa_vizinhos(parte_visivel, mapa_real, p);
      }
    }
  }  
}

int faz_jogada(char *parte_visivel, char *mapa_real, int jogada) {
  if (jogada == 0) imprime_parte_visivel(parte_visivel);
  struct pos p1;
  do {
    p1 = le_posicao();
  } while(parte_visivel[TAMANHO*p1.lin+p1.col] != '.');
  parte_visivel[TAMANHO*p1.lin+p1.col] = mapa_real[TAMANHO*p1.lin+p1.col];
  if (parte_visivel[TAMANHO*p1.lin+p1.col] == '*') {
    printf("Você explodiu uma bomba!");
    imprime_parte_visivel(mapa_real);
    return 0;
  } else if (parte_visivel[TAMANHO*p1.lin+p1.col] == ' ') {
    limpa_vizinhos(parte_visivel, mapa_real, p1);
  }
  imprime_parte_visivel(parte_visivel);
  return 1;
}

void inicializa(char *parte_visivel, char *mapa_real, int nbombas) {
  struct pos posicoes[TAMANHO*TAMANHO], tmp;
  int i,j, vi, vj, bn;
  for (i = 0; i < TAMANHO; i++) {
    for (j = 0; j < TAMANHO; j++) {
      posicoes[TAMANHO*i+j].lin = i;
      posicoes[TAMANHO*i+j].col = j;
      parte_visivel[TAMANHO*i+j] = '.';
      mapa_real[TAMANHO*i+j] = ' ';
    }
  }
  // troca as posições
  for (i = 0; i < TAMANHO*TAMANHO; ++i) {
    j = rand() % (TAMANHO*TAMANHO-i);
    tmp = posicoes[j+1];
    posicoes[j+1] = posicoes[i];
    posicoes[i] = tmp;
  }
  // agora preenchemos as bombas
  for (i = 0; i < nbombas; ++i) {
    mapa_real[TAMANHO*posicoes[i].lin+posicoes[i].col] = '*';
  }
  // agora vamos marcar os números
  for (i = 0; i < TAMANHO; ++i) {
    for (j = 0; j < TAMANHO; ++j) {
      bn = 0;
      for (vi = max(0,i-1); vi <= min(i+1,TAMANHO-1); vi++) {
        for (vj = max(0,j-1); vj <= min(j+1,TAMANHO-1); vj++) {
          if ((i == vi) && (j == vj)) continue;
          if (mapa_real[TAMANHO*vi+vj] == '*') 
            bn++;
        }
      }
      if ((bn > 0) && (mapa_real[TAMANHO*i+j] != '*')) {
        mapa_real[TAMANHO*i+j] = '0'+bn;
      }
    }
  }
}

int acabou(char *pv, char *mr) {
  int i,j;
  for (i = 0; i < TAMANHO; ++i) {
    for (j = 0; j < TAMANHO; ++j) {
      if ((pv[TAMANHO*i+j] != mr[TAMANHO*i+j]) && (mr[TAMANHO*i+j] != '*')) {
        return 0;
      }
    }
  }
  return 1;
}

int main(int argc, char *argv[]) {
  char parte_visivel[TAMANHO*TAMANHO], mapa_real[TAMANHO*TAMANHO];
  int jogada = 0;
  srand(time(NULL));
  inicializa(parte_visivel, mapa_real, atoi(argv[1]));
  while (faz_jogada(parte_visivel, mapa_real, jogada)) {
    jogada += 1;
    if (acabou(parte_visivel, mapa_real)) {
      imprime_parte_visivel(mapa_real);
      printf("Parabéns, você ganhou com %d jogadas!\n", jogada);
      break;
    }
  }
  return 0;
}


Author: Alexandre Tachard Passos <alexandre.tp@gmail.com>

Date: 2010-10-06 11:19:23 BRT

HTML generated by org-mode 6.21b in emacs 23