Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "estado.h"
- //
- // Created by ASUS on 29/03/2019.
- //
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <stdio.h>
- #include "interpretador.h"
- #include "estado.h"
- ESTADO interpretar (ESTADO e, char *linha){
- char cmd[MAX_BUF];
- char ficheiro [MAX_BUF];
- char peca [MAX_BUF];
- int lin, col, n;
- n = sscanf(linha, "%s", cmd);
- switch (toupper (linha [0])){
- case 'N':
- n = sscanf(linha, "%s %s", cmd, peca);
- switch (toupper (peca [0])){
- case 'X':
- e = grelha_inicial (e,VALOR_X, '0');
- break;
- case 'O':
- e = grelha_inicial (e, VALOR_O, '0');
- break;
- default:
- printf ("Tem de escolher a peça com que jogar: X ou O\n");
- }
- e.modo = 'M';
- break;
- case 'L':
- n=sscanf (linha, "%s %s", cmd, ficheiro);
- e = load(e, ficheiro);
- printf ("Num. de parametros lidos: %d\n", n);
- printf ("Ler um jogo do ficheiro: %s\n", ficheiro);
- break;
- case 'E':
- n = sscanf (linha,"%s %s", cmd, ficheiro);
- save(e, ficheiro);
- printf ("Jogo gravado:%s\n", ficheiro);
- break;
- case 'J':
- n= sscanf(linha, "%s %d %d", cmd, &lin, &col);
- jogada(lin,col, &e);
- zerarSugestao(&e);
- printf ("Num. de parametros lidos:%d\n", n);
- printf ("Jogar na posicao linha:%d e coluna:%d\n", lin, col);
- break;
- case 'S':
- valida (&e);
- break;
- case 'U':
- break;
- case 'H':
- sugestao(&e);
- break;
- case 'A':
- break;
- case 'Q':
- exit(0);
- default:
- printf ("Comando Invalido!\n");
- }
- printa (e);
- return e;
- }
- void print_prompt (ESTADO e){
- switch (e.peca){
- case VALOR_X:
- printf ("%s X>", PROMPT);
- break;
- case VALOR_O:
- printf ("%s O>", PROMPT);
- break;
- default:
- printf("%s ?>", PROMPT);
- }
- }
- void interpretador (ESTADO e){
- char linha [MAX_BUF];
- print_prompt (e);
- while (fgets (linha, MAX_BUF, stdin)){
- e=interpretar (e, linha);
- print_prompt(e);
- }
- }
- void valida (ESTADO* e) { //vê se cada espaço vazio é valido
- int i, j;
- zerarValida(e); //tudo que era '.' passa a ser vazio
- zerarSugestao(e); //tudo que era '?' passa a ser vazio
- for (i = 0; i < 8; i++)
- for (j = 0; j < 8; j++)
- if (e->grelha[i][j] == VAZIA)
- verValida(i, j, e);
- }
- void verValida (int x, int y, ESTADO *e){ //vê se é válida e poe '.'
- int i,j,r;
- //Horizontal Esquerda
- i = x;
- j = y+1;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- ++j;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Horizontal Direita
- i = x;
- j = y-1;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- --j;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Vertical Cima
- i = x+1;
- j = y;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- ++i;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Verical Baixo
- i = x-1;
- j = y;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- --i;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Diagonal y = -x esquerda
- i = x - 1;
- j = y - 1;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- --j;
- --i;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Diagonal y = -x direita
- i = x+1;
- j = y+1;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- ++j;
- ++i;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Diagonal y = x Esquerda
- i = x - 1;
- j = y + 1;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- ++j;
- --i;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- r = 0;
- //Diagonal y = x Direita
- i = x + 1;
- j = y - 1;
- r = 0;
- while(e->grelha[i][j] == peca_dif(e->peca))
- {
- r = 1;
- --j;
- ++i;
- }
- if(e->grelha[i][j]==e->peca && r == 1) {
- e->grelha[x][y] = VALIDA;
- }
- }
- VALOR peca_dif (VALOR v){
- if (v == VALOR_X)
- return VALOR_O;
- if (v== VALOR_O)
- return VALOR_X;
- }
- void jogada (int i, int j, ESTADO *e) {
- valida(e);
- if (e->grelha[i][j] == VALIDA) {
- e->grelha[i][j] = e->peca;
- zerarValida(e);
- peca_comida(i,j,e);
- e->peca = peca_dif(e->peca);
- }
- else printf("Jogada nao valida\n");
- }
- void zerarValida(ESTADO *e){
- int i, j;
- for (i = 0; i < 8; i++){
- for (j = 0; j <8; j++){
- if (e->grelha[i][j] == VALIDA)
- e->grelha[i][j] = VAZIA;
- }
- }
- }
- void peca_comida (int x, int y,ESTADO* e) {
- int i, j, r;
- //Horizontal Esquerda
- i = x;
- j = y + 1;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- ++j;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- printf("%d %d %d\n", i ,j, r);
- if (r == 0) {
- while (y < j) {
- e->grelha[i][j] = e->peca;
- --j;
- }
- }
- //Horizontal Direita
- i = x;
- j = y - 1;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- --j;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- printf("%d %d %d\n", i ,j, r);
- while (r == 0 && y > j) {
- e->grelha[i][j] = e->peca;
- ++j;
- }
- //Vertical Cima
- i = x + 1;
- j = y;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- ++i;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- while (r == 0 && x < i) {
- e->grelha[i][j] = e->peca;
- --i;
- }
- //Vertical Baixo
- i = x - 1;
- j = y;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- --i;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- while (r == 0 && x > i) {
- e->grelha[i][j] = e->peca;
- ++i;
- }
- //Diagonal y = -x esquerda
- i = x - 1;
- j = y - 1;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- --j,--i;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- while (r == 0 && y > j && x > i) {
- e->grelha[i][j] = e->peca;
- ++j;
- ++i;
- }
- //Diagonal y = -x direita
- i = x + 1;
- j = y + 1;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- ++i,++j;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- while (r == 0 && y < j && x < i) {
- e->grelha[i][j] = e->peca;
- --i;
- --j;
- }
- //Diagonal y = x esquerda
- i = x + 1;
- j = y - 1;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- --j,++i;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- while (r == 0 && y > j && x < i) {
- e->grelha[i][j] = e->peca;
- --i;
- ++j;
- }
- //Diagonal y = x direita
- i = x - 1;
- j = y + 1;
- r = 1;
- while (e->grelha[i][j] == peca_dif(e->peca))
- ++j, --i;
- if (e->grelha[i][j] == e->peca)
- r = 0;
- if (r == 0) {
- while (y < j && x > i) {
- e->grelha[i][j] = e->peca;
- ++i;
- --j;
- }
- }
- }
- void sugestao (ESTADO *e){
- int i, j, r = 0;
- valida(e);
- for (i = 0; i <8 ; i++)
- for (j = 0; j < 8; j ++) {
- if (e->grelha[i][j] == VALIDA) {
- e->grelha[i][j] = SUGESTAO;
- r = 1;
- }
- if (r == 1) break;
- }
- zerarValida(e);
- }
- void zerarSugestao (ESTADO* e){
- int i, j;
- for (i = 0; i < 8; i++)
- for (j = 0; j < 8; j++)
- if (e->grelha[i][j] == SUGESTAO)
- e->grelha[i][j] = VAZIA;
- }
- // typedef enum {VAZIA, VALOR_X, VALOR_O, VALIDA, SUGESTAO} VALOR;
- char valorToChar (VALOR c){
- if (c == VALOR_O) return 'O';
- if (c == VALOR_X) return 'X';
- if (c == VAZIA) return '-';
- }
- void save (ESTADO e, char ficheiro [MAX_BUF]) {
- zerarSugestao(&e);
- zerarValida(&e);
- FILE *file;
- char c;
- file = fopen(ficheiro, "w");
- fprintf(file,"%c %c\n", e.modo, valorToChar(e.peca));
- for (int i = 0; i < 8; i++) {
- for (int j = 0; j < 8; j++) {
- c = valorToChar(e.grelha[i][j]);
- fprintf(file, "%c ", c);
- }
- fprintf(file, "\n");
- }
- fclose (file);
- }
- VALOR charToValor (char c){
- if (c == 'O') return VALOR_O;
- if (c == 'X') return VALOR_X;
- if (c == '-') return VAZIA;
- }
- ESTADO load(ESTADO e,char ficheiro[MAX_BUF]){
- FILE *file;
- char k,c;
- int i,j;
- file=fopen(ficheiro,"r");
- fscanf(file,"%c %c\n", &c, &k);
- e.modo=c;
- e.peca=charToValor(k);
- for (i = 0; i <8; ++i){
- for (j = 0; j < 8; ++j){
- fscanf(file, "%c ", &k);
- e.grelha[i][j] = charToValor(k);
- }
- fscanf(file, "\n", &k);
- }
- printf ("jogo carregado\n");
- return e;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement