Guest User

Untitled

a guest
Jul 21st, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.96 KB | None | 0 0
  1. ;;; David João Fragueiro Afonso - 68365 // Ricardo Miguel Vieira Botas Carvalho - 67071 // Grupo - 84
  2.  
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TAI LISTA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  4. ;;;;;;;; REP.INTERNA: Estrutura de pares encadeados, em que cada ;;;;;;;;
  5. ;;;;;;;; par guarda, na primeira posicao, um elemento e, na ;;;;;;;;
  6. ;;;;;;;; segunda posicao, a lista com os restantes elementos; Uma ;;;;;;;;
  7. ;;;;;;;; lista vazia e' representada por null. ;;;;;;;;
  8. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  9.  
  10. ;;;; OPERACOES BASICAS
  11.  
  12. ;;; Construtores
  13. ;;;
  14. ;;; nova-lista : {} -> lista
  15. ;;; nova-lista() tem como valor uma lista sem elementos.
  16. (define (nova-lista)
  17. ())
  18.  
  19. ;;; insere : elemento x lista -> lista
  20. ;;; insere(elem, lst) tem como valor a lista que resulta de inserir o
  21. ;;; elemento elem na primeira posicao da lista lst.
  22. (define (insere elem lst)
  23. (cons elem lst))
  24.  
  25. ;;; Selectores
  26. ;;;
  27. ;;; primeiro : lista -> elemento
  28. ;;; primeiro(lst) tem como valor o elemento que se encontra na primeira
  29. ;;; posicao da lista lst. Se a lista nao tiver elementos, o valor desta
  30. ;;; operacao e' indefinido.
  31. (define (primeiro lst)
  32. (if (null? lst)
  33. (error "primeiro: a lista nao tem elementos")
  34. (car lst)))
  35.  
  36. ;;; resto : lista -> lista
  37. ;;; resto(lst) tem como valor a lista que resulta de remover o primeiro
  38. ;;; elemento da lista lst. Se a lista nao tiver elementos, o valor
  39. ;;; desta operacao e' indefinido.
  40. (define (resto lst)
  41. (if (null? lst)
  42. (error "resto: a lista nao tem elementos")
  43. (cdr lst)))
  44.  
  45. ;;; Reconhecedores
  46. ;;;
  47. ;;; lista? : universal -> logico
  48. ;;; lista?(arg) tem o valor verdadeiro se arg e' uma lista e tem o valor
  49. ;;; falso em caso contrario.
  50. (define (lista? x)
  51. (cond ((null? x) #t)
  52. ((pair? x) (lista? (cdr x)))
  53. (else #f)))
  54.  
  55. ;;; lista-vazia? : lista -> logico
  56. ;;; lista-vazia?(lst) tem o valor verdadeiro se a lista lst e' a lista
  57. ;;; vazia e tem o valor falso em caso contrario.
  58. (define (lista-vazia? lst)
  59. (null? lst))
  60.  
  61. ;;; Testes
  62. ;;;
  63. ;;; listas=? : lista x lista x predicado -> logico
  64. ;;; listas=?(lst1, lst2, pred) tem o valor verdadeiro se a lista lst1 e'
  65. ;;; igual a lista lst2, comparando os seus elementos com pred, e tem o
  66. ;;; valor falso em caso contrario.
  67. (define (listas=? lst1 lst2 elem=?)
  68. (cond ((null? lst1) (null? lst2))
  69. ((null? lst2) #f)
  70. ((elem=? (car lst1) (car lst2))
  71. (listas=? (cdr lst1) (cdr lst2) elem=?))
  72. (else #f)))
  73.  
  74.  
  75. ;;;; OPERACOES ALTO NIVEL
  76.  
  77. ;;; comprimento : lista -> inteiro
  78. ;;; comprimento(lst) tem como valor o inteiro que corresponde ao numero
  79. ;;; de elementos da lista lst.
  80. (define (comprimento lst)
  81. (if (lista-vazia? lst)
  82. 0
  83. (+ 1 (comprimento (resto lst)))))
  84.  
  85. ;;; membro? : universal x lista x predicado -> logico
  86. ;;; membro?(el lst elem=?) tem o valor verdadeiro se el for um elemento
  87. ;;; da lista lst e falso em caso contrario. Usa o predicado elem=? para
  88. ;;; comparar elementos.
  89. (define (membro? el lst elem=?)
  90. (cond ((lista-vazia? lst) #f)
  91. ((elem=? el (primeiro lst)) #t)
  92. (else (membro? el (resto lst) elem=?))))
  93.  
  94. ;;; todos-satisfazem? : lista x predicado -> logico
  95. ;;; todos-satisfazem?(lst pred) tem o falor verdadeiro se todos os elementos
  96. ;;; da lista lst satisfazem o predicado pred e falso em caso contrario.
  97. (define (todos-satisfazem? lst pred)
  98. (cond ((lista-vazia? lst) #t)
  99. ((pred (primeiro lst)) (todos-satisfazem? (resto lst) pred))
  100. (else #f)))
  101.  
  102. ;;; elemento-pos-n-lst : lista x inteiro -> universal
  103. ;;; elemento-pos-n-lst(lst n) tem como valor o elemento que se encontra na
  104. ;;; posicao n da lista lst; a posicao do primeiro elemento da lista e' 1.
  105. ;;; Se o indice estiver fora da lista, o valor desta operacao e' indefinido.
  106. (define (elemento-pos-n-lst lst n)
  107. (define (elemento-n-aux lst n)
  108. (cond ((lista-vazia? lst)
  109. (error "elemento-pos-n-lst: a lista nao tem elementos suficientes"))
  110. ((= n 1) (primeiro lst))
  111. (else (elemento-n-aux (resto lst) (- n 1)))))
  112.  
  113. (if (and (lista? lst) (integer? n) (>= n 1))
  114. (elemento-n-aux lst n)
  115. (error "elemento-n: argumentos deviam ser lista e inteiro >= 1")))
  116.  
  117.  
  118.  
  119. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TAI PINO-CHAVE ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  120. ;;;;;;;; REP.INTERNA: Um dos simbolos: red aqua brown orange yellow lime. ;
  121. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  122.  
  123. ;;;; OPERACOES BASICAS
  124.  
  125. ;;; Reconhecedor
  126. ;;;
  127. ;;; pino-chave? : universal -> logico
  128. ;;; pino-chave?(arg) tem o valor verdadeiro, se arg e um pino-chave,
  129. ;;; e tem o valor falso, em caso contrario.
  130. (define (pino-chave? x)
  131. (membro? x '(red aqua brown orange yellow lime white) eq?))
  132.  
  133. ;;; Transformador
  134. ;;;
  135. ;;; pino-chave->string : pino-chave -> string
  136. ;;; pino-chave->string(pc) devolve a string
  137. ;;; "|pino-chave%<nome do simbolo>|"
  138. (define (pino-chave->string pc)
  139. (string-append "|pino-chave%"
  140. (symbol->string pc)
  141. "|"))
  142.  
  143.  
  144.  
  145. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TAI SEQ-PINOS-CHAVE ;;;;;;;;;;;;;;;;;;;;;;
  146. ;;;;;;;; REP.INTERNA: Uma lista com 4 elementos ;;;;;;;;;;;;;;;;;;;;;;
  147. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  148.  
  149. ;;;; OPERACOES BASICAS
  150.  
  151. ;;; Construtor
  152. ;;;
  153. ;;; cria-seq-pinos-chave : pino-chave x pino-chave x
  154. ;;; pino-chave x pino-chave -> seq-pinos-chave
  155. ;;; cria-seq-pinos-chave(p1,p2,p3,p4) tem como valor uma seq-pinos-chave com
  156. ;;; elementos p1,p2,p3,p4, por esta ordem.
  157. (define (cria-seq-pinos-chave p1 p2 p3 p4)
  158. (let ((seq (list p1 p2 p3 p4)))
  159. (if (todos-satisfazem? seq pino-chave?)
  160. seq
  161. (error "cria-seq-pinos-chave: os argumentos devem ser do tipo pino-chave"))))
  162.  
  163. ;;; Selector
  164. ;;;
  165. ;;; elemento-i-seq-pinos-chave: seq-pinos-chave x {1,2,3,4} -> pino-chave
  166. ;;; elemento-i-seq-pinos-chave(s,i) tem como valor o elemento que se
  167. ;;; encontra na posicao i de s.
  168. (define (elemento-i-seq-pinos-chave s i)
  169. (elemento-pos-n-lst s i))
  170.  
  171. ;;; Reconhecedor
  172. ;;;
  173. ;;; seq-pinos-chave? : universal -> logico
  174. ;;; seq-pinos-chave?(arg) tem o valor verdadeiro, se arg e uma seq-pinos-chave,
  175. ;;; e tem o valor falso, em caso contrario.
  176. (define (seq-pinos-chave? x)
  177. (and (lista? x)
  178. (= (comprimento x) 4)
  179. (todos-satisfazem? x pino-chave?)))
  180.  
  181. ;;; Teste
  182. ;;;
  183. ;;; seq-pinos-chave=? : seq-pinos-chave x seq-pinos-chave -> logico
  184. ;;; seq-pinos-chave=?(s1, s2) tem o valor verdadeiro, se s1 e s2 sao
  185. ;;; seq-pinos-chave iguais, e tem o valor falso, em caso contrario.
  186. (define (seq-pinos-chave=? s1 s2)
  187. (listas=? s1 s2 eq?))
  188.  
  189. ;;; Transformador
  190. ;;;
  191. ;;; seq-pinos-chave->string : seq-pinos-chave -> string
  192. ;;; seq-pinos-chave->string(s) devolve a string
  193. ;;; "|seq-pinos-chave%<pino-chave 1>% ... %<pino-chave 4>|"
  194. (define (seq-pinos-chave->string s)
  195. (string-append "|seq-pinos-chave%"
  196. (pino-chave->string (elemento-pos-n-lst s 1))
  197. "%"
  198. (pino-chave->string (elemento-pos-n-lst s 2))
  199. "%"
  200. (pino-chave->string (elemento-pos-n-lst s 3))
  201. "%"
  202. (pino-chave->string (elemento-pos-n-lst s 4))
  203. "|"))
  204.  
  205.  
  206.  
  207. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TAI RESPOSTA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  208. ;;;;;;;; REP.INTERNA: Um par em que o 1o elemento corresponde ao ;;;;;;;;;
  209. ;;;;;;;; numero de pinos chave certos na posicao certa e o 2o ;;;;;;;;;
  210. ;;;;;;;; elemento corresponde ao numero de pinos chave certos ;;;;;;;;;
  211. ;;;;;;;; mas na posicao errada. ;;;;;;;;;
  212. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  213.  
  214. ;;;; OPERACOES BASICAS
  215.  
  216. ;;; Construtor
  217. ;;;
  218. ;;; faz-resposta : inteiro x inteiro -> resposta
  219. ;;; faz-resposta(p, v) devolve a resposta correspondente ao numero de
  220. ;;; pinos chave certos na posicao certa, p, e ao numero de pinos chave
  221. ;;; certos mas na posicao errada, v.
  222. (define (faz-resposta p v)
  223. (if (and (integer? p)
  224. (integer? v)
  225. (<= 0 p 4)
  226. (<= 0 v 4))
  227. (cons p v)
  228. (error "faz-resposta: argumentos devem ser inteiros entre 0 e 4")))
  229.  
  230. ;;; Selectores
  231. ;;;
  232. ;;; resposta-pretos : resposta -> inteiro
  233. ;;; resposta-pretos(r) devolve o numero de pinos chave certos na posicao certa.
  234. (define resposta-pretos car)
  235.  
  236. ;;; resposta-vermelhos : resposta -> inteiro
  237. ;;; resposta-vermelhos(r) devolve o numero de pinos chave certos na posicao errada.
  238. (define resposta-vermelhos cdr)
  239.  
  240. ;;; Reconhecedor
  241. ;;;
  242. ;;; resposta? : universal -> logico
  243. ;;; resposta?(arg) tem o valor verdadeiro, se arg e uma resposta, e tem o
  244. ;;; valor falso, em caso contrario.
  245. (define (resposta? x)
  246. (and (pair? x)
  247. (integer? (car x))
  248. (integer? (cdr x))
  249. (<= 0 (car x) 4)
  250. (<= 0 (cdr x) 4)))
  251.  
  252. ;;; Teste
  253. ;;;
  254. ;;; resposta=? : resposta x resposta -> logico
  255. ;;; resposta=?(r1 , r2) tem o valor verdadeiro, se r1 e r2 sao respostas
  256. ;;; iguais, e tem o valor falso, em caso contrario.
  257. (define resposta=? equal?)
  258.  
  259. ;;; Transformador
  260. ;;;
  261. ;;; resposta->string : resposta -> string
  262. ;;; resposta->string(r) devolve a string
  263. ;;; "|resposta%<resposta-pretos>%<resposta-vermelhos>|"
  264. (define (resposta->string r)
  265. (string-append "|resposta%"
  266. (number->string (car r))
  267. "%"
  268. (number->string (cdr r))
  269. "|"))
  270.  
  271.  
  272.  
  273. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TAI JOGADA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  274. ;;;;;;;; REP.INTERNA: Um par cujo primeiro elemento e' uma ;;;;;;;;
  275. ;;;;;;;; seq-pinos-chave e o segundo elemento e' uma resposta. ;;;;;;;;
  276. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  277.  
  278. ;;;; OPERACOES BASICAS
  279.  
  280. ;;; Construtor
  281. ;;;
  282. ;;; faz-jogada : seq-pinos-chave x resposta -> jogada
  283. ;;; faz-jogada(s, r) devolve a jogada constituida pela seq-pinos-chave
  284. ;;; s e a resposta r.
  285. (define (faz-jogada s r)
  286. (if (and (seq-pinos-chave? s)
  287. (resposta? r))
  288. (cons s r)
  289. (error "faz-jogada: argumentos errados")))
  290.  
  291. ;;; Selectores
  292. ;;;
  293. ;;; jogada-seq-pinos-chave : jogada -> seq-pinos-chave
  294. ;;; jogada-seq-pinos-chave(j) devolve a seq-pinos-chave da jogada j.
  295. (define jogada-seq-pinos-chave car)
  296.  
  297. ;;; jogada-resposta : jogada -> resposta
  298. ;;; jogada-resposta(j) devolve a resposta da jogada j.
  299. (define jogada-resposta cdr)
  300.  
  301. ;;; Reconhecedor
  302. ;;;
  303. ;;; jogada? : universal -> logico
  304. ;;; jogada?(arg) tem o valor verdadeiro, se arg e uma jogada, e tem o valor falso,
  305. ;;; em caso contrario.
  306. (define (jogada? x)
  307. (and (pair? x)
  308. (seq-pinos-chave? (car x))
  309. (resposta? (cdr x))))
  310.  
  311. ;;; Transformador
  312. ;;;
  313. ;;; jogada->string : jogada -> string
  314. ;;; jogada->string(j) devolve a seguinte string
  315. ;;; "|jogada|seq-pinos-chave%<pc 1>% ... %<pc4>||resposta%<resp-pretos>%<resp-vermelhos>||"
  316. (define (jogada->string j)
  317. (string-append "|jogada%"
  318. (seq-pinos-chave->string (car j))
  319. "%"
  320. (resposta->string (cdr j))
  321. "|"))
  322.  
  323.  
  324.  
  325. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TAI JOGADAS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  326. ;;;;;;;; REP.INTERNA: Uma lista de 12 elementos do tipo jogada. ;;;;;;;
  327. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  328.  
  329. ;;;; OPERACOES BASICAS
  330.  
  331. ;;; Construtores
  332. ;;;
  333. ;;; jogadas(j) : jogada -> jogadas
  334. ;;; jogadas(j) devolve um elemento do tipo jogadas em que todos os 12 componentes
  335. ;;; sao a jogada j.
  336. (define (jogadas j)
  337. (if (jogada? j)
  338. (vector j j j j j j j j j j j j)
  339. (error "jogadas: argumento deve ser do tipo jogada")))
  340.  
  341. ;;; altera-jogada : jogadas x {1,2,...,12} x jogada -> jogadas
  342. ;;; altera-jogadas(js, i, j) devolve um elemento do tipo jogadas semelhante a js,
  343. ;;; excepto no que diz respeito ao elemento na posicao i, que deve ser j.
  344. (define (altera-jogadas! js i j)
  345. (vector-set! js (- i 1) j))
  346.  
  347. ;;; Selectores
  348. ;;;
  349. ;;; jogadas-i(js, i) : jogadas x {1,2,...,12} -> jogada
  350. ;;; jogadas-i(js, i) devolve o componente da posicao i de jogadas js.
  351. (define (jogadas-i js i)
  352. (vector-ref js (- i 1)))
  353.  
  354. ;;; Reconhecedores
  355. ;;;
  356. ;;; jogadas? : universal -> logico
  357. ;;; jogadas?(arg) tem o valor verdadeiro, se arg e do tipo jogadas, e tem o valor
  358. ;;; falso, em caso contrario.
  359. (define (jogadas? x)
  360. (and (vector? x)
  361. (= (vector-length x) 12)
  362. (todos-satisfazem? (vector->list x) jogada?)))
  363.  
  364. ;;; Transformador
  365. ;;;
  366. ;;; jogada->string : jogada -> string
  367. ;;; jogada->string(js) devolve a string
  368. ;;; "|jogadas%<jogada 1>%<jogada 2>% ... %<jogada 12>|"
  369. ;;; Recebe uma jogada e devolve um elemento do tipo jogadas em que todos
  370. ;;; os 12 componentes sao a jogada recebida
  371. (define (jogadas->string js)
  372. (define (aux js)
  373. (if (lista-vazia? js)
  374. ""
  375. (string-append "%"
  376. (jogada->string (primeiro js))
  377. (aux (resto js)))))
  378. (string-append "|jogadas"
  379. (aux (vector->list js))
  380. "|"))
  381.  
  382.  
  383. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2º PARTE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  384. ;;;;;;;; A 2º parte do projecto é contituida pelos modulos de ;;;;;;;;
  385. ;;;;;;;; interface, programa de controle, e o jogador ;;;;;;;;
  386. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  387.  
  388. ;(require "interface.zo")
  389. ;(require (lib "misc.ss" "swindle"))
  390.  
  391. (define mm-controle null)
  392. (define mm-interface null)
  393.  
  394. (define (mastermind nome-utilizador tipo)
  395. (set! mm-interface (fpmm-cria-interface))
  396. (set! mm-controle (cria-controle nome-utilizador tipo)))
  397.  
  398. ;;; em : procedure x symbol x universal
  399. ;;; em : obj -> corresponde ao nome do procedimento ao qual a mensagem é enviada
  400. ;;; em : mens -> (uma entidade do tipo símbolo) representa o tipo da mensagem enviada
  401. ;;; em : args, -> são zero ou mais objectos computacionais que são parte da mensagem
  402. (define (em obj mens . args)
  403. (apply (obj mens) args))
  404.  
  405. ;;;;;;;;;;;;;;;;;;;;;;;;;;;; PPROGRAMA DE CONTROLE ;;;;;;;;;;;;;;;;;;;;;;;;
  406. ;;;;;;;; O programa de controle tem o objectivo de controlar todo o jogo ;;
  407. ;;;;;;;; de inicio ao fim. Qualquer comunicação entre os módulos também ;;
  408. ;;;;;;;; é aqui tratada ;;
  409. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  410. (define (cria-controle nome tipo)
  411.  
  412. ;;; calcula-resp : seq-pinos-chave x seq-pinos-chave -> resposta
  413. ;;; calcula-resp : Recebe como 2 sequências de pinos chave (adivinha e segredo)
  414. ;;; e deolve uma resposta
  415. (define (calcula-resp adivinha segredo)
  416.  
  417. ;;; remover-posicoes : list x list
  418. ;;; remover-posicoes : Recebe 2 listas 1 delas com posições e outra com elementos
  419. ;;; e remove os elementos da segunda lista que cuincidam com as posições recebidas
  420. (define (remover-posicoes lst-posicao lst)
  421. (let ((lst-temp null))
  422. (do ((i (comprimento lst) (- i 1)))
  423. ((= i 0) lst-temp)
  424. (if (not (membro? i lst-posicao =))
  425. (set! lst-temp (insere (elemento-pos-n-lst lst i) lst-temp))))))
  426.  
  427. ;;; remove-um-elemento : universal x list
  428. ;;; remove-um-elemento : Recebe um elemento universal e uma lista e remove apenas o
  429. ;;; primeiro elemento que for igual ao universal recebido
  430. (define (remove-um-elemento el lst)
  431. (let ((lst-temp null)
  432. (primeiro #t))
  433. (dolist (elm lst)
  434. (if (equal? el elm)
  435. (if primeiro
  436. (set! primeiro #f)
  437. (set! lst-temp (insere elm lst-temp)))
  438. (set! lst-temp (insere elm lst-temp))))
  439. lst-temp))
  440.  
  441. (let ((PinosPretos 0)
  442. (PinosVermelhos 0)
  443. (PosicoesPinosPretos null))
  444.  
  445. ;; Contar Pinos Pretos
  446. (do ((i 1 (+ i 1)))
  447. ((> i (comprimento segredo)) (set! adivinha (remover-posicoes PosicoesPinosPretos adivinha))
  448. (set! segredo (remover-posicoes PosicoesPinosPretos segredo)))
  449. (if (equal? (elemento-pos-n-lst adivinha i) (elemento-pos-n-lst segredo i))
  450. (begin
  451. (set! PinosPretos (+ PinosPretos 1))
  452. (set! PosicoesPinosPretos (insere i PosicoesPinosPretos)))))
  453.  
  454.  
  455. ;; Contar Pinos Vermelhos
  456. (do ((i 1 (+ i 1)))
  457. ((> i (comprimento segredo)) (faz-resposta PinosPretos PinosVermelhos))
  458. (let ((elemento-comparar (elemento-pos-n-lst segredo i)))
  459. (if (membro? elemento-comparar adivinha equal?)
  460. (begin
  461. (set! PinosVermelhos (+ PinosVermelhos 1))
  462. (set! adivinha (remove-um-elemento elemento-comparar adivinha))))))))
  463.  
  464. (let ((segredoGerado null)
  465. (jogadasRealizadas null)
  466. (jogadorActual null))
  467.  
  468. ;;; existePinoBranco? : seq-pinos-chave x string -> logico
  469. ;;; existePinoBranco? : verifica se existe pinos brancos na sequência
  470. ;;; se existir termina o jogo e o jogador perde
  471. (define (existePinoBranco? seq nomeJog)
  472. (if (membro? 'white seq equal?)
  473. (begin
  474. (em mm-interface 'fpmm-fim-jogo (string-append (string-append nomeJog " perdeu")))
  475. (em mm-interface 'fpmm-mostra-segredo segredoGerado)
  476. #t)
  477. #f))
  478.  
  479. ;;; jogoTerminado? : resposta x seq-pinos-chave x integer x logico x string x string -> true
  480. ;;; jogoTerminado? : verifica se o jogo deve terminar ou continuar
  481. (define (jogoTerminado? resposta seq comp mostrarSegredo? nome1 nome2)
  482. (cond (;; Valida se o jogador automático / manual já adivinhou o segredo escondido
  483. (equal? resposta (faz-resposta 4 0)) (em mm-interface 'fpmm-fim-jogo (string-append (string-append nome1 " ganhou")))
  484. (if mostrarSegredo?
  485. (em mm-interface 'fpmm-mostra-segredo segredoGerado))
  486. #t)
  487. ;; Validade se a jogada efectuada ainda não tinha acontecido anteriormente (jogada repetida)
  488. ((or (not (seq-pinos-chave? seq))
  489. (membro? (faz-jogada seq resposta) jogadasRealizadas equal?)) (em mm-interface 'fpmm-fim-jogo (string-append nome1 " perdeu"))
  490. (if mostrarSegredo?
  491. (em mm-interface 'fpmm-mostra-segredo segredoGerado))
  492. #t)
  493. ;; Valida se já decorreram no máximo 12 jogadas (12 número de jogadas permitidas)
  494. ((>= comp 11) (em mm-interface 'fpmm-fim-jogo (string-append nome2 " ganhou"))
  495. (if mostrarSegredo?
  496. (em mm-interface 'fpmm-mostra-segredo segredoGerado))
  497. #t)
  498. ;; Caso nenhuma condição se verificar então o jogo não é terminado
  499. (else #f)))
  500.  
  501. ;;; existePinoBranco? : logico x seq-pinos-chave
  502. ;;; existePinoBranco? : Processa o jogo pela ordem devida
  503. (define (processarJogo mostrarSegredo? seq)
  504. (let* ((comp (comprimento jogadasRealizadas))
  505. (adivinha (em jogadorActual 'adivinha))
  506. (resposta (calcula-resp adivinha seq)))
  507.  
  508. (em mm-interface 'fpmm-mostra-adivinha adivinha comp)
  509. (em mm-interface 'fpmm-mostra-resposta resposta comp)
  510. ;; Informar o jogador da Resposta
  511. (em jogadorActual 'recebe-resposta resposta)
  512.  
  513. (if mostrarSegredo?
  514. (em mm-interface 'fpmm-mostra-segredo seq))
  515.  
  516. ;; Verifica a existencia de pinos brancos na adivinha gerada pelo explorador automático
  517. (if (not (existePinoBranco? adivinha "Computador"))
  518. ;; Verificar Jogo Terminado
  519. (if (not (jogoTerminado? resposta adivinha comp #f "Computador" (symbol->string nome)))
  520. (begin (em mm-interface 'fpmm-pede-continuar)
  521. (set! jogadasRealizadas (insere (faz-jogada adivinha resposta) jogadasRealizadas)))))))
  522.  
  523. ;;; novo-segredo : seq-pinos-chave
  524. ;;; novo-segredo : recebe um segredo do explorador autmatico e continua o jogo
  525. (define (novo-segredo seq)
  526. ;; Verifica a existencia de pinos brancos no segredo gerado pelo guardião humano
  527. (if (not (existePinoBranco? seq (symbol->string nome)))
  528. (begin
  529. (set! segredoGerado seq)
  530. (processarJogo #t seq))))
  531.  
  532. ;;; continuar :
  533. ;;; continuar : permite o jogo prosseguir
  534. (define (continuar)
  535. (processarJogo #f segredoGerado))
  536.  
  537. ;;; nova-adivinha : seq-pinos-chave
  538. ;;; nova-adivinha : recebe uma nova adivinha dada pelo explorador manual
  539. ;;; e continua o jogo
  540. (define (nova-adivinha seq)
  541. (let ((resposta (em jogadorActual 'responde-adivinha seq))
  542. (comp (comprimento jogadasRealizadas)))
  543.  
  544. (em mm-interface 'fpmm-mostra-adivinha seq comp)
  545. (em mm-interface 'fpmm-mostra-resposta resposta comp)
  546.  
  547. ;; Verifica a existencia de pinos brancos na adivinha gerada pelo explorador humano
  548. (if (not (existePinoBranco? seq (symbol->string nome)))
  549. ;; Verificar Jogo Terminado
  550. (if (not (jogoTerminado? resposta seq comp #t (symbol->string nome) "Computador"))
  551. (begin (set! jogadasRealizadas (insere (faz-jogada seq resposta) jogadasRealizadas))
  552. (em mm-interface 'fpmm-pede-adivinha (comprimento jogadasRealizadas)))))))
  553.  
  554. (case tipo
  555. ((adivinha) (set! jogadorActual (cria-jogador84 'adivinha))
  556. (em mm-interface 'fpmm-inicia-jogo)
  557. (em mm-interface 'fpmm-escreve-linha (string-append "Olá " (symbol->string nome) "!") 1)
  558. (em mm-interface 'fpmm-escreve-linha "O seu objectivo é gerar o segredo que o jogador automático tentará descobrir." 3)
  559. (em mm-interface 'fpmm-escreve-linha "Para isso deve introduzir um segredo na caixa do segredo" 5)
  560. (em mm-interface 'fpmm-escreve-linha "Basta carregar em cada uma das posições da caixa e estas ficam coloridas com a cor" 6)
  561. (em mm-interface 'fpmm-escreve-linha "seleccionada no bloco de cores em baixo. Para mudar de cor basta carregar na cor" 7)
  562. (em mm-interface 'fpmm-escreve-linha "pretendida no bloco de cores. Quando tiver terminado carregue em \"jogar\"." 8)
  563. (em mm-interface 'fpmm-pede-segredo))
  564.  
  565. ((segredo) (set! jogadorActual (cria-jogador84 'segredo))
  566. (set! segredoGerado (em jogadorActual 'novo-segredo))
  567. (em mm-interface 'fpmm-inicia-jogo)
  568. (em mm-interface 'fpmm-escreve-linha (string-append "Olá " (symbol->string nome) "!") 1)
  569. (em mm-interface 'fpmm-escreve-linha "O seu objectivo é adivinhar o segredo gerado automáticamente." 3)
  570. (em mm-interface 'fpmm-escreve-linha "Para isso deve introduzir uma adivinha na primeira linha vaga" 5)
  571. (em mm-interface 'fpmm-escreve-linha "Basta carregar em cada uma das posições da grelha e estas ficam coloridas com a cor" 6)
  572. (em mm-interface 'fpmm-escreve-linha "seleccionada no bloco de cores em baixo. Para mudar de cor basta carregar na cor" 7)
  573. (em mm-interface 'fpmm-escreve-linha "pretendida no bloco de cores. Quando tiver terminado carregue em \"jogar\"." 8)
  574. ;; Verifica a existencia de pinos brancos no segredo gerado pelo guardião automático
  575. (if (not (existePinoBranco? segredoGerado "Computador"))
  576. (em mm-interface 'fpmm-pede-adivinha 0))))
  577.  
  578. (lambda (m)
  579. (case m
  580. ((novo-segredo) novo-segredo)
  581. ((continuar) continuar)
  582. ((nova-adivinha) nova-adivinha)))))
  583.  
  584. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; JOGADOR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  585. ;;;;;;;; O jogador tem uma funcção especifica consoante o papel que ;;
  586. ;;;;;;;; desempenha. Se for explorador terá de gerar adivinhas e receber ;;
  587. ;;;;;;;; respostas, enquanto o guardião tem de gerar o segredo ;;
  588. ;;;;;;;; e responder a adivinhas ;;
  589. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  590. (define (cria-jogador84 tipo)
  591.  
  592. ;;; calcula-resp : seq-pinos-chave x seq-pinos-chave -> resposta
  593. ;;; calcula-resp : Recebe como 2 sequências de pinos chave (adivinha e segredo)
  594. ;;; e deolve uma resposta
  595. (define (calcula-resp adivinha segredo)
  596.  
  597. ;;; remover-posicoes : list x list
  598. ;;; remover-posicoes : Recebe 2 listas 1 delas com posições e outra com elementos
  599. ;;; e remove os elementos da segunda lista que cuincidam com as posições recebidas
  600. (define (remover-posicoes lst-posicao lst)
  601. (let ((lst-temp null))
  602. (do ((i (comprimento lst) (- i 1)))
  603. ((= i 0) lst-temp)
  604. (if (not (membro? i lst-posicao =))
  605. (set! lst-temp (insere (elemento-pos-n-lst lst i) lst-temp))))))
  606.  
  607. ;;; remove-um-elemento : universal x list
  608. ;;; remove-um-elemento : Recebe um elemento universal e uma lista e remove apenas o
  609. ;;; primeiro elemento que for igual ao universal recebido
  610. (define (remove-um-elemento el lst)
  611. (let ((lst-temp null)
  612. (primeiro #t))
  613. (dolist (elm lst)
  614. (if (equal? el elm)
  615. (if primeiro
  616. (set! primeiro #f)
  617. (set! lst-temp (insere elm lst-temp)))
  618. (set! lst-temp (insere elm lst-temp))))
  619. lst-temp))
  620.  
  621. (let ((PinosPretos 0)
  622. (PinosVermelhos 0)
  623. (PosicoesPinosPretos null))
  624.  
  625. ;; Contar Pinos Pretos
  626. (do ((i 1 (+ i 1)))
  627. ((> i (comprimento segredo)) (set! adivinha (remover-posicoes PosicoesPinosPretos adivinha))
  628. (set! segredo (remover-posicoes PosicoesPinosPretos segredo)))
  629. (if (equal? (elemento-pos-n-lst adivinha i) (elemento-pos-n-lst segredo i))
  630. (begin
  631. (set! PinosPretos (+ PinosPretos 1))
  632. (set! PosicoesPinosPretos (insere i PosicoesPinosPretos)))))
  633.  
  634.  
  635. ;; Contar Pinos Vermelhos
  636. (do ((i 1 (+ i 1)))
  637. ((> i (comprimento segredo)) (faz-resposta PinosPretos PinosVermelhos))
  638. (let ((elemento-comparar (elemento-pos-n-lst segredo i)))
  639. (if (membro? elemento-comparar adivinha equal?)
  640. (begin
  641. (set! PinosVermelhos (+ PinosVermelhos 1))
  642. (set! adivinha (remove-um-elemento elemento-comparar adivinha))))))))
  643.  
  644. ;;; todas-possibilidades : -> list
  645. ;;; todas-possibilidades : devolve uma lista com tadas as sequencias que podem ser jogadas
  646. (define (todas-possibilidades)
  647. (let ((v-pino (vector 'orange 'yellow 'red 'lime 'aqua 'brown))
  648. (seqPossiveisTmp null))
  649. (dotimes (i 6)
  650. (dotimes (j 6)
  651. (dotimes (k 6)
  652. (dotimes (l 6)
  653. (set! seqPossiveisTmp (insere (cria-seq-pinos-chave (vector-ref v-pino i)
  654. (vector-ref v-pino j)
  655. (vector-ref v-pino k)
  656. (vector-ref v-pino l)) seqPossiveisTmp))))))
  657. seqPossiveisTmp))
  658.  
  659. ;;; todas-possibilidades : seq-pinos-chave x seq-pinos-chave x resposta -> logico
  660. ;;; todas-possibilidades : Verifica se um segredo e adivinha têm a mesma resposta que foi recebida como parametro
  661. (define (mesmo-resultado? segredo adivinha resposta)
  662. (resposta=? resposta (calcula-resp segredo adivinha)))
  663.  
  664. ;; Declaração das variaveis para guardar as Jogadas Realizadas e o Segredo Gerado
  665. (let ((jogadasRealizadas null)
  666. (segredoGerado null)
  667. (seqPossiveis null))
  668.  
  669. ;;; tratar-possibilidades : seq-pinos-chave x resposta -> logico
  670. ;;; tratar-possibilidades : Procedimento que remove as possibilidades que já não podem ser segredo
  671. (define (tratar-possibilidades adivinha resposta)
  672. (let ((seqPossiveisTmp null))
  673. (dolist (el seqPossiveis)
  674. (if (mesmo-resultado? adivinha el resposta)
  675. (set! seqPossiveisTmp (insere el seqPossiveisTmp))))
  676. (set! seqPossiveis seqPossiveisTmp)))
  677.  
  678. ;;; tratar-possibilidades : -> seq-pinos-chave
  679. ;;; tratar-possibilidades : Procedimento para gerar uma sequencia de pinos chave
  680. (define (gerar-seq)
  681. (if (equal? tipo 'adivinha)
  682. (if (lista-vazia? seqPossiveis)
  683. (begin
  684. (set! seqPossiveis (todas-possibilidades))
  685. (elemento-pos-n-lst seqPossiveis 1023))
  686. (elemento-pos-n-lst seqPossiveis (+ (random (comprimento seqPossiveis)) 1)))
  687. (let ((v-pino (vector 'red 'aqua 'brown 'orange 'yellow 'lime)))
  688. (cria-seq-pinos-chave (vector-ref v-pino (random 6))
  689. (vector-ref v-pino (random 6))
  690. (vector-ref v-pino (random 6))
  691. (vector-ref v-pino (random 6))))))
  692.  
  693. ;;; guardiao : mens -> procedure
  694. ;;; guardiao : Devolve um procedimento que representa as acções do guardião
  695. (define (guardiao mens)
  696. (case mens
  697. ((novo-segredo) (lambda()
  698. ;; Guardião gera um novo segredo aleatório
  699. (let ((segredo (gerar-seq)))
  700. ;; Actualiza a variavel do segredo
  701. (set! segredoGerado segredo)
  702. ;; Devolve segredo
  703. segredo)))
  704. ((responde-adivinha) (lambda(seq)
  705. ;; A geração de uma resposta é feita apartir da última jogada comparada com o segredo
  706. (calcula-resp seq segredoGerado)))))
  707.  
  708. ;;; explorador : mens -> procedure
  709. ;;; explorador : Devolve um procedimento que representa as acções do explorador
  710. (define (explorador mens)
  711. (case mens
  712. ((adivinha) (lambda()
  713. ;; Gerar adivinha aleatóriamente
  714. (let ((adivinha (gerar-seq)))
  715. (set! jogadasRealizadas (insere adivinha jogadasRealizadas))
  716. adivinha)))
  717. ((recebe-resposta) (lambda(resp)
  718. (tratar-possibilidades (primeiro jogadasRealizadas) resp)))))
  719.  
  720. (case tipo
  721. ((segredo)(lambda (mens) (guardiao mens)))
  722. ((adivinha) (lambda (mens) (explorador mens)))
  723. (else (error "cria-jogador84: Tipo de jogador incorrecto")))))
Add Comment
Please, Sign In to add comment