Advertisement
Guest User

Untitled

a guest
May 20th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.77 KB | None | 0 0
  1. #include "estado.h"
  2. //
  3. // Created by ASUS on 29/03/2019.
  4. //
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <stdio.h>
  9. #include "interpretador.h"
  10. #include "estado.h"
  11.  
  12. ESTADO interpretar (ESTADO e, char *linha){
  13. char cmd[MAX_BUF];
  14. char ficheiro [MAX_BUF];
  15. char peca [MAX_BUF];
  16. int lin, col, n;
  17. n = sscanf(linha, "%s", cmd);
  18. switch (toupper (linha [0])){
  19. case 'N':
  20. n = sscanf(linha, "%s %s", cmd, peca);
  21. switch (toupper (peca [0])){
  22. case 'X':
  23. e = grelha_inicial (e,VALOR_X, '0');
  24. break;
  25. case 'O':
  26. e = grelha_inicial (e, VALOR_O, '0');
  27. break;
  28. default:
  29. printf ("Tem de escolher a peça com que jogar: X ou O\n");
  30. }
  31. e.modo = 'M';
  32. break;
  33. case 'L':
  34. n=sscanf (linha, "%s %s", cmd, ficheiro);
  35. e = load(e, ficheiro);
  36. printf ("Num. de parametros lidos: %d\n", n);
  37. printf ("Ler um jogo do ficheiro: %s\n", ficheiro);
  38. break;
  39. case 'E':
  40. n = sscanf (linha,"%s %s", cmd, ficheiro);
  41. save(e, ficheiro);
  42. printf ("Jogo gravado:%s\n", ficheiro);
  43. break;
  44. case 'J':
  45. n= sscanf(linha, "%s %d %d", cmd, &lin, &col);
  46. jogada(lin,col, &e);
  47. zerarSugestao(&e);
  48. printf ("Num. de parametros lidos:%d\n", n);
  49. printf ("Jogar na posicao linha:%d e coluna:%d\n", lin, col);
  50. break;
  51. case 'S':
  52. valida (&e);
  53. break;
  54. case 'U':
  55. break;
  56. case 'H':
  57. sugestao(&e);
  58. break;
  59. case 'A':
  60. break;
  61. case 'Q':
  62. exit(0);
  63. default:
  64. printf ("Comando Invalido!\n");
  65. }
  66. printa (e);
  67. return e;
  68. }
  69.  
  70. void print_prompt (ESTADO e){
  71. switch (e.peca){
  72. case VALOR_X:
  73. printf ("%s X>", PROMPT);
  74. break;
  75. case VALOR_O:
  76. printf ("%s O>", PROMPT);
  77. break;
  78. default:
  79. printf("%s ?>", PROMPT);
  80. }
  81.  
  82. }
  83.  
  84. void interpretador (ESTADO e){
  85. char linha [MAX_BUF];
  86. print_prompt (e);
  87. while (fgets (linha, MAX_BUF, stdin)){
  88. e=interpretar (e, linha);
  89. print_prompt(e);
  90. }
  91. }
  92.  
  93. void valida (ESTADO* e) { //vê se cada espaço vazio é valido
  94. int i, j;
  95. zerarValida(e); //tudo que era '.' passa a ser vazio
  96. zerarSugestao(e); //tudo que era '?' passa a ser vazio
  97. for (i = 0; i < 8; i++)
  98. for (j = 0; j < 8; j++)
  99. if (e->grelha[i][j] == VAZIA)
  100. verValida(i, j, e);
  101.  
  102. }
  103.  
  104. void verValida (int x, int y, ESTADO *e){ //vê se é válida e poe '.'
  105. int i,j,r;
  106. //Horizontal Esquerda
  107. i = x;
  108. j = y+1;
  109. r = 0;
  110. while(e->grelha[i][j] == peca_dif(e->peca))
  111. {
  112. r = 1;
  113. ++j;
  114. }
  115.  
  116. if(e->grelha[i][j]==e->peca && r == 1) {
  117. e->grelha[x][y] = VALIDA;
  118. }
  119. r = 0;
  120. //Horizontal Direita
  121. i = x;
  122. j = y-1;
  123. r = 0;
  124. while(e->grelha[i][j] == peca_dif(e->peca))
  125. {
  126. r = 1;
  127. --j;
  128. }
  129.  
  130. if(e->grelha[i][j]==e->peca && r == 1) {
  131. e->grelha[x][y] = VALIDA;
  132. }
  133. r = 0;
  134. //Vertical Cima
  135. i = x+1;
  136. j = y;
  137. r = 0;
  138. while(e->grelha[i][j] == peca_dif(e->peca))
  139. {
  140. r = 1;
  141. ++i;
  142. }
  143.  
  144. if(e->grelha[i][j]==e->peca && r == 1) {
  145. e->grelha[x][y] = VALIDA;
  146. }
  147. r = 0;
  148. //Verical Baixo
  149. i = x-1;
  150. j = y;
  151. r = 0;
  152. while(e->grelha[i][j] == peca_dif(e->peca))
  153. {
  154. r = 1;
  155. --i;
  156. }
  157.  
  158. if(e->grelha[i][j]==e->peca && r == 1) {
  159. e->grelha[x][y] = VALIDA;
  160. }
  161. r = 0;
  162. //Diagonal y = -x esquerda
  163. i = x - 1;
  164. j = y - 1;
  165. r = 0;
  166. while(e->grelha[i][j] == peca_dif(e->peca))
  167. {
  168. r = 1;
  169. --j;
  170. --i;
  171. }
  172.  
  173. if(e->grelha[i][j]==e->peca && r == 1) {
  174. e->grelha[x][y] = VALIDA;
  175. }
  176. r = 0;
  177. //Diagonal y = -x direita
  178. i = x+1;
  179. j = y+1;
  180. r = 0;
  181. while(e->grelha[i][j] == peca_dif(e->peca))
  182. {
  183. r = 1;
  184. ++j;
  185. ++i;
  186. }
  187.  
  188. if(e->grelha[i][j]==e->peca && r == 1) {
  189. e->grelha[x][y] = VALIDA;
  190. }
  191. r = 0;
  192. //Diagonal y = x Esquerda
  193. i = x - 1;
  194. j = y + 1;
  195. r = 0;
  196. while(e->grelha[i][j] == peca_dif(e->peca))
  197. {
  198. r = 1;
  199. ++j;
  200. --i;
  201. }
  202.  
  203. if(e->grelha[i][j]==e->peca && r == 1) {
  204. e->grelha[x][y] = VALIDA;
  205. }
  206. r = 0;
  207. //Diagonal y = x Direita
  208. i = x + 1;
  209. j = y - 1;
  210. r = 0;
  211. while(e->grelha[i][j] == peca_dif(e->peca))
  212. {
  213. r = 1;
  214. --j;
  215. ++i;
  216. }
  217.  
  218. if(e->grelha[i][j]==e->peca && r == 1) {
  219. e->grelha[x][y] = VALIDA;
  220. }
  221. }
  222.  
  223. VALOR peca_dif (VALOR v){
  224. if (v == VALOR_X)
  225. return VALOR_O;
  226. if (v== VALOR_O)
  227. return VALOR_X;
  228. }
  229.  
  230. void jogada (int i, int j, ESTADO *e) {
  231. valida(e);
  232. if (e->grelha[i][j] == VALIDA) {
  233. e->grelha[i][j] = e->peca;
  234. zerarValida(e);
  235. peca_comida(i,j,e);
  236. e->peca = peca_dif(e->peca);
  237. }
  238. else printf("Jogada nao valida\n");
  239. }
  240.  
  241. void zerarValida(ESTADO *e){
  242. int i, j;
  243. for (i = 0; i < 8; i++){
  244. for (j = 0; j <8; j++){
  245. if (e->grelha[i][j] == VALIDA)
  246. e->grelha[i][j] = VAZIA;
  247. }
  248. }
  249. }
  250.  
  251. void peca_comida (int x, int y,ESTADO* e) {
  252. int i, j, r;
  253. //Horizontal Esquerda
  254. i = x;
  255. j = y + 1;
  256. r = 1;
  257. while (e->grelha[i][j] == peca_dif(e->peca))
  258. ++j;
  259. if (e->grelha[i][j] == e->peca)
  260. r = 0;
  261. printf("%d %d %d\n", i ,j, r);
  262. if (r == 0) {
  263. while (y < j) {
  264. e->grelha[i][j] = e->peca;
  265. --j;
  266. }
  267. }
  268.  
  269. //Horizontal Direita
  270. i = x;
  271. j = y - 1;
  272. r = 1;
  273. while (e->grelha[i][j] == peca_dif(e->peca))
  274. --j;
  275. if (e->grelha[i][j] == e->peca)
  276. r = 0;
  277. printf("%d %d %d\n", i ,j, r);
  278. while (r == 0 && y > j) {
  279. e->grelha[i][j] = e->peca;
  280. ++j;
  281. }
  282.  
  283. //Vertical Cima
  284. i = x + 1;
  285. j = y;
  286. r = 1;
  287. while (e->grelha[i][j] == peca_dif(e->peca))
  288. ++i;
  289. if (e->grelha[i][j] == e->peca)
  290. r = 0;
  291. while (r == 0 && x < i) {
  292. e->grelha[i][j] = e->peca;
  293. --i;
  294. }
  295. //Vertical Baixo
  296. i = x - 1;
  297. j = y;
  298. r = 1;
  299. while (e->grelha[i][j] == peca_dif(e->peca))
  300. --i;
  301. if (e->grelha[i][j] == e->peca)
  302. r = 0;
  303. while (r == 0 && x > i) {
  304. e->grelha[i][j] = e->peca;
  305. ++i;
  306. }
  307. //Diagonal y = -x esquerda
  308. i = x - 1;
  309. j = y - 1;
  310. r = 1;
  311. while (e->grelha[i][j] == peca_dif(e->peca))
  312. --j,--i;
  313. if (e->grelha[i][j] == e->peca)
  314. r = 0;
  315. while (r == 0 && y > j && x > i) {
  316. e->grelha[i][j] = e->peca;
  317. ++j;
  318. ++i;
  319. }
  320. //Diagonal y = -x direita
  321. i = x + 1;
  322. j = y + 1;
  323. r = 1;
  324. while (e->grelha[i][j] == peca_dif(e->peca))
  325. ++i,++j;
  326. if (e->grelha[i][j] == e->peca)
  327. r = 0;
  328. while (r == 0 && y < j && x < i) {
  329. e->grelha[i][j] = e->peca;
  330. --i;
  331. --j;
  332. }
  333. //Diagonal y = x esquerda
  334. i = x + 1;
  335. j = y - 1;
  336. r = 1;
  337. while (e->grelha[i][j] == peca_dif(e->peca))
  338. --j,++i;
  339. if (e->grelha[i][j] == e->peca)
  340. r = 0;
  341. while (r == 0 && y > j && x < i) {
  342. e->grelha[i][j] = e->peca;
  343. --i;
  344. ++j;
  345. }
  346. //Diagonal y = x direita
  347. i = x - 1;
  348. j = y + 1;
  349. r = 1;
  350. while (e->grelha[i][j] == peca_dif(e->peca))
  351. ++j, --i;
  352. if (e->grelha[i][j] == e->peca)
  353. r = 0;
  354. if (r == 0) {
  355. while (y < j && x > i) {
  356. e->grelha[i][j] = e->peca;
  357. ++i;
  358. --j;
  359. }
  360. }
  361. }
  362.  
  363. void sugestao (ESTADO *e){
  364. int i, j, r = 0;
  365. valida(e);
  366. for (i = 0; i <8 ; i++)
  367. for (j = 0; j < 8; j ++) {
  368. if (e->grelha[i][j] == VALIDA) {
  369. e->grelha[i][j] = SUGESTAO;
  370. r = 1;
  371. }
  372. if (r == 1) break;
  373. }
  374. zerarValida(e);
  375. }
  376.  
  377. void zerarSugestao (ESTADO* e){
  378. int i, j;
  379. for (i = 0; i < 8; i++)
  380. for (j = 0; j < 8; j++)
  381. if (e->grelha[i][j] == SUGESTAO)
  382. e->grelha[i][j] = VAZIA;
  383.  
  384. }
  385.  
  386. // typedef enum {VAZIA, VALOR_X, VALOR_O, VALIDA, SUGESTAO} VALOR;
  387. char valorToChar (VALOR c){
  388. if (c == VALOR_O) return 'O';
  389. if (c == VALOR_X) return 'X';
  390. if (c == VAZIA) return '-';
  391. }
  392.  
  393.  
  394.  
  395. void save (ESTADO e, char ficheiro [MAX_BUF]) {
  396. zerarSugestao(&e);
  397. zerarValida(&e);
  398. FILE *file;
  399. char c;
  400. file = fopen(ficheiro, "w");
  401. fprintf(file,"%c %c\n", e.modo, valorToChar(e.peca));
  402. for (int i = 0; i < 8; i++) {
  403. for (int j = 0; j < 8; j++) {
  404. c = valorToChar(e.grelha[i][j]);
  405. fprintf(file, "%c ", c);
  406. }
  407. fprintf(file, "\n");
  408. }
  409. fclose (file);
  410. }
  411.  
  412. VALOR charToValor (char c){
  413. if (c == 'O') return VALOR_O;
  414. if (c == 'X') return VALOR_X;
  415. if (c == '-') return VAZIA;
  416. }
  417.  
  418. ESTADO load(ESTADO e,char ficheiro[MAX_BUF]){
  419. FILE *file;
  420. char k,c;
  421. int i,j;
  422.  
  423. file=fopen(ficheiro,"r");
  424. fscanf(file,"%c %c\n", &c, &k);
  425. e.modo=c;
  426. e.peca=charToValor(k);
  427. for (i = 0; i <8; ++i){
  428. for (j = 0; j < 8; ++j){
  429. fscanf(file, "%c ", &k);
  430. e.grelha[i][j] = charToValor(k);
  431. }
  432. fscanf(file, "\n", &k);
  433. }
  434. printf ("jogo carregado\n");
  435. return e;
  436. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement