#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; }
#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; }
Date: 2010-10-06 11:19:23 BRT
HTML generated by org-mode 6.21b in emacs 23