Guest User

Untitled

a guest
Jul 28th, 2018
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Error subclass: #ErrorInstanciaInvalida
  2.     instanceVariableNames: ''
  3.     classVariableNames: ''
  4.     poolDictionaries: ''
  5.     category: 'Ahorcado'!
  6.  
  7. Error subclass: #JuegoTerminado
  8.     instanceVariableNames: ''
  9.     classVariableNames: ''
  10.     poolDictionaries: ''
  11.     category: 'Ahorcado'!
  12.  
  13. Object subclass: #Palabra
  14.     instanceVariableNames: 'palabra dicPalabra acertijo'
  15.     classVariableNames: ''
  16.     poolDictionaries: ''
  17.     category: 'Ahorcado'!
  18.  
  19. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:41'!
  20. agregarADic: letra ConPos: posicion
  21.     "Agrega la posicion a la letra en el
  22.     diccionario de la clase. "
  23.    
  24.     | letraAux |
  25.    
  26.     (letra = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  27.     (dicPalabra = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  28.    
  29.     letraAux := letra asLowercase .
  30.     "Si la letra no pertenecia al diccionario, se inicializa con una lista vacia"
  31.     dicPalabra at: letraAux ifAbsent: [ dicPalabra at: letraAux put: LinkedList new ].     
  32.     (dicPalabra at: letra) add: posicion.
  33. ! !
  34.  
  35. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/16/2012 14:28'!
  36. crearDicc
  37.     "Crea el diccionario de la palabra de la clase
  38.     con las letras de la palabra como claves, y sus
  39.     posiciones dentro de ella como los valores."
  40.  
  41.     | contPosicion |
  42.  
  43.     ( palabra = nil ) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  44.    
  45.     dicPalabra := Dictionary new.
  46.     contPosicion := 1 .
  47.     palabra do: [ : letra |    
  48.         ( letra ~= Character space ) ifTrue: [
  49.             self agregarADic: letra ConPos: contPosicion.
  50.         ].
  51.         contPosicion := contPosicion + 1 .
  52.     ].
  53. ! !
  54.  
  55. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 14:37'!
  56. inicializarAcertijo
  57.     "Crea un acertijo con el mismo tamaño que palabra
  58.     donde sus letras fueron reemplazadas por otro caracter."
  59.  
  60.     | acertijoAux letraOcultaAux |
  61.     acertijoAux := ''.
  62.     letraOcultaAux := '-'.
  63.    
  64.     (palabra = nil ) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  65.    
  66.     palabra do: [ : letra |
  67.         (letra = Character space) ifTrue: [
  68.             acertijoAux := acertijoAux , ' '.  
  69.         ].
  70.         (letra ~= Character space) ifTrue: [
  71.             acertijoAux := acertijoAux , letraOcultaAux.   
  72.         ].
  73.     ].
  74.  
  75.     ^ acertijoAux.! !
  76.  
  77. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 17:51'!
  78. inicializarPalabra: palabraAux
  79.     "inicializador de palabra
  80.     Pre: la palabra ingresada no tiene espacios al principio
  81.         ni al final de la misma. Ni espacios intermedios de
  82.         mas en caso de ser frase.
  83.     Post: se asigno a Palabra el argumento y se creo el
  84.         diccionario correspondiente a la palabra.   "
  85.            
  86.     (palabraAux = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  87.    
  88.     palabra := ((palabraAux asString) asLowercase) .
  89.     self crearDicc .   
  90.     acertijo := self inicializarAcertijo.! !
  91.  
  92. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:00'!
  93. modificarAcertijoenPosiciones: posiciones
  94.     "Modifica el acertijo de la clase con el caracter en
  95.     las posiciones pedidas."
  96.    
  97.     (posiciones = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  98.     (palabra = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  99.    
  100.     posiciones do: [ : posicion |
  101.         acertijo at: posicion put: (palabra at: posicion).
  102.     ].! !
  103.  
  104. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/16/2012 15:52'!
  105. posicionesEnPalabraDeLetra: caracter
  106.     "Busca el caracter en el diccionario de la palabra.
  107.      En caso de pertenecer el caracter al diccionario,
  108.     devuelve la lista con posiciones de este en la palabra.
  109.     Sino devuelve una lista.
  110.     Post: Devuelve una lista. "
  111.    
  112.     |caracterAux|
  113.    
  114.     (caracter = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  115.     (dicPalabra = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  116.    
  117.     caracterAux := caracter asLowercase.
  118.     ^ (dicPalabra at: caracterAux ifAbsent: LinkedList new).! !
  119.  
  120. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/16/2012 10:19'!
  121. verDicc
  122.     "Devuelve el diccionario de la palabra."
  123.  
  124.     ^dicPalabra.! !
  125.  
  126. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/16/2012 10:19'!
  127. verPalabra
  128.     "Devuelve la palabra de la clase."
  129.  
  130.     ^ palabra .! !
  131.  
  132. !Palabra methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 14:45'!
  133. verPalabraAcertijo
  134.     "comment stating purpose of message"
  135.  
  136.     ^ acertijo.! !
  137.  
  138. Object subclass: #Juego
  139.     instanceVariableNames: 'palabra vidas letrasArriesgadas'
  140.     classVariableNames: ''
  141.     poolDictionaries: ''
  142.     category: 'Ahorcado'!
  143.  
  144. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/19/2012 00:31'!
  145. arriesgarLetra: caracter
  146.     "Se evalua si el caracter pertenece a la palabra en juego.
  147.     De ser asi, se modifica el acertijo de manera correspondiente
  148.     al tipo estrategia de la palabra.
  149.     Si el caracter no pertenecia, se modifican las vidas  y las
  150.     letras arriesgadas en el juego."
  151.  
  152.     | caracterAux listaPosicionesEnPalabra |
  153.    
  154.     ( self juegoTerminado ) ifTrue: [ JuegoTerminado new signal. ].
  155.    
  156.     (palabra = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  157.     (caracter = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  158.    
  159.     caracterAux := ((caracter asCharacter) asLowercase).
  160.     listaPosicionesEnPalabra := ( palabra posicionesEnPalabraDeLetra: caracterAux ).   
  161.  
  162.     "Si la lista esta vacia, no hay posiciones en la palabra donde se encuentre el caracter."
  163.     (listaPosicionesEnPalabra isEmpty) ifTrue: [
  164.         self restarVida.
  165.         letrasArriesgadas add: caracterAux.  
  166.     ].
  167.  
  168.     (listaPosicionesEnPalabra isEmpty) ifFalse: [
  169.         palabra modificarAcertijoenPosiciones: listaPosicionesEnPalabra .
  170.     ].
  171. ! !
  172.  
  173. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 19:34'!
  174. evaluarVidas
  175.     "Devuelve la cantidad de vidas que le   corresponden a la palabra en juego.
  176.     Si la palabra es solo una, seran 6 vidas, si es una frase, seran 8 vidas.
  177.     Si la palabra no es valida, devuelve 0."
  178.  
  179.     | vidasPalabra vidasFrase palabraAux|
  180.     vidasPalabra := 6.
  181.     vidasFrase := 8.
  182.    
  183.     (palabra = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  184.    
  185.     palabraAux := palabra verPalabra.  
  186.     palabraAux do: [: letra |
  187.         "Si palabras tienen espacios son para   separarse palabras, entonces son frases."
  188.         (letra = Character space ) ifTrue: [ ^ vidasFrase. ].
  189.     ].
  190.  
  191.     ^ vidasPalabra .
  192.     ! !
  193.  
  194. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:17'!
  195. informacionJuego
  196.     " Devuelve en forma de cadena toda la informacion
  197.     publica del juego."
  198.    
  199.     | info |
  200.    
  201.     info := 'Adivinando: ', palabra verPalabraAcertijo, '. Vidas: ', self verVidas,
  202.             '. Letras Arriesgadas: ', self verLetrasArriesgadas.
  203.  
  204.     ^ info.
  205. ! !
  206.  
  207. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:39'!
  208. iniciarJuegoCon: palabraAux
  209.     "Constructor del Juego.
  210.     Inicia el juego con la palabra recibida,  
  211.     asigna la cantidad de vidas para el juego,
  212.     inicia la lista de letras arriesgadas."
  213.    
  214.     (palabraAux = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  215.     (palabraAux verPalabra = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  216.  
  217.     palabra := palabraAux.
  218.     vidas := self evaluarVidas.
  219.     letrasArriesgadas := LinkedList new.
  220.     ! !
  221.  
  222. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:50'!
  223. juegoGanado
  224.     "Devuelve true en caso de haber ganado el juego."
  225.  
  226.     ( self verPalabraAcertijo = palabra verPalabra) ifTrue: [
  227.         ^ true.
  228.     ].
  229.  
  230.     ^ false.! !
  231.  
  232. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:23'!
  233. juegoPerdido
  234.     "Devuelve true en caso de haber perdido, false en caso contrario."
  235.    
  236.     ( self verVidas = 0) ifTrue: [
  237.         ^ true.
  238.     ].
  239.  
  240.     ^ false.! !
  241.  
  242. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:25'!
  243. juegoTerminado
  244.     "Devuelve true en caso de haber terminado el juego."
  245.  
  246.     ( self juegoGanado | self juegoPerdido ) ifTrue: [
  247.         ^ true.
  248.     ].
  249.    
  250.     ^ false.! !
  251.  
  252. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:39'!
  253. restarVida
  254.     "Cada vez que es llamado este metodo,
  255.     resta una vida al juego."
  256.    
  257.     (vidas = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  258.    
  259.     vidas := vidas - 1 .! !
  260.  
  261. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:12'!
  262. verLetrasArriesgadas
  263.     "Devuelve en forma de cadena las letras
  264.     arriesgadas durante el juego."
  265.  
  266.     | letrasMostrar |
  267.     letrasMostrar := ' '.
  268.    
  269.     (letrasArriesgadas = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  270.    
  271.     letrasArriesgadas do: [ : letra |
  272.         letrasMostrar := letrasMostrar ,  (letra asString) .
  273.     ].
  274.  
  275.     ^ letrasMostrar.! !
  276.  
  277. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/16/2012 14:39'!
  278. verPalabraAcertijo
  279.     "Devuelve el acertijo perteneciente
  280.     a la palabra en juego."
  281.    
  282.     (palabra = nil) ifTrue: [ErrorInstanciaInvalida new signal.].
  283.    
  284.     ^ (palabra verPalabraAcertijo).! !
  285.  
  286. !Juego methodsFor: 'as yet unclassified' stamp: 'Lucia 4/16/2012 03:55'!
  287. verVidas
  288.     "Devuelve un valor entero que representa
  289.     la cantidad de vidas que hay en juego."
  290.  
  291.     ^ vidas .! !
  292.  
  293. Palabra subclass: #Proximidad
  294.     instanceVariableNames: ''
  295.     classVariableNames: ''
  296.     poolDictionaries: ''
  297.     category: 'Ahorcado'!
  298.  
  299. !Proximidad methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:10'!
  300. inicializarProximidad: palabraAux
  301.     "Constructor de palabra Proximidad.
  302.     Asigna la palabra a la clase e inicia
  303.     el acertijo correspondiente."
  304.    
  305.     self inicializarPalabra: palabraAux.
  306. ! !
  307.  
  308. !Proximidad methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 16:02'!
  309. modificarAcertijoenPosiciones: posiciones
  310.     "Modifica el acertijo de la clase con el caracter en
  311.     las posiciones pedidas y en las letras vecinas a estas."
  312.  
  313.     | posSiguiente posAnterior inicioPalabra finPalabra |
  314.    
  315.     (palabra = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  316.    
  317.     posSiguiente := 1.      "posSiguiente será un valor mas al que se esta evaluando"
  318.     posAnterior := -1.      "posAnterior será un valor menos al que se esta evaluando"
  319.     inicioPalabra := 1.    
  320.     finPalabra := palabra size.
  321.    
  322.     (posiciones = nil) ifTrue: [ ErrorEntradaInvalida new signal. ].
  323.  
  324.     posiciones do: [ : posicion |
  325.         acertijo at: posicion put: (palabra at: posicion) .
  326.         self modificarCaracterAcertijoDesde: posicion En: posSiguiente Evaluando: finPalabra.  
  327.         self modificarCaracterAcertijoDesde: posicion En: posAnterior Evaluando: inicioPalabra.
  328.     ].! !
  329.  
  330. !Proximidad methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 15:40'!
  331. modificarCaracterAcertijoDesde: posicion En: sigOanterior Evaluando: extremo
  332.     "Si la posicion no es el caso evaluado, se modifica el acertijo
  333.     con el caracter de la palabra, siguiente o anterior, a la posicion ."
  334.  
  335.     | posAux letra |
  336.    
  337.     ( posicion = extremo) ifTrue: [ ^ nil .].
  338.    
  339.     posAux := posicion + sigOanterior.
  340.     letra := (palabra at: posAux).
  341.    
  342.     (letra = Character space) ifTrue: [
  343.         self modificarCaracterAcertijoDesde: posAux En: sigOanterior Evaluando: extremo.   
  344.     ].
  345.  
  346.     acertijo at: posAux put: letra.! !
  347.  
  348. Palabra subclass: #Inculto
  349.     instanceVariableNames: 'dicLetrasEquivalentes'
  350.     classVariableNames: ''
  351.     poolDictionaries: ''
  352.     category: 'Ahorcado'!
  353.  
  354. !Inculto methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 14:12'!
  355. asignarEquivalencias: equivalencias
  356.     "comment stating purpose of message"
  357.    
  358.     (equivalencias = nil) ifTrue: [ ErrorEquivalenciasNoAsignadas new signal].
  359.    
  360.     dicLetrasEquivalentes := equivalencias.! !
  361.  
  362. !Inculto methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 15:48'!
  363. generarPalabraParaEquivalencia: string Con: letra En: posicion
  364.     "Genera una palabra a partir de la posicion, tomando las letras
  365.     necesarias para tener el mismo largo del string para comprarlos."
  366.  
  367.     | auxString auxPos |
  368.     auxString := letra asString.    "auxiliar para juntar las letras"
  369.     auxPos := posicion.
  370.        
  371.     "concadeno la siguiente letra de la palabra hasta conseguir la cantidad de letras que
  372.     se necesita para comparar con el string equivalencia"
  373.     [((auxString size) < (string size)) & ((auxPos < palabra size))] whileTrue: [
  374.         auxString := auxString , (palabra at: (auxPos+1))asString .
  375.         auxPos := auxPos + 1.
  376.     ].
  377.     ^ auxString.
  378. ! !
  379.  
  380. !Inculto methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 22:45'!
  381. inicializarEquivalencias
  382.     "comment stating purpose of message"
  383.  
  384.     | contPosiciones listaPosEquiv auxString auxPos|
  385.     contPosiciones := 1.
  386.  
  387.     ( palabra = nil ) ifTrue: [  ErrorInstanciaInvalida new signal ] .
  388.     ( dicLetrasEquivalentes = nil ) ifTrue: [ ErrorEquivalenciasNoAsignadas new signal ].
  389.    
  390.     palabra do: [ : letra |
  391.        
  392.         dicLetrasEquivalentes keysDo: [ : clave |
  393.             (clave verEquivalentes) do: [ : equivalencia |
  394.                 "si es mas que un char"
  395.                 (equivalencia size > 1) ifTrue: [  
  396.                     auxString := self generarPalabraParaEquivalencia: equivalencia Con: letra En: contPosiciones.
  397.                    
  398.                     " evaluo si la cadena auxString (parte de la palabra) pertenece a la equivalencia"
  399.                     (equivalencia = auxString) ifTrue: [
  400.                         ( contPosiciones to: (contPosiciones + equivalencia size - 1)) do: [ : pos |   
  401.                             (dicLetrasEquivalentes at: clave) add: pos .
  402.                         ].
  403.                     ].
  404.                 ].
  405.             ].
  406.              ( clave contieneA: (letra asString) ) ifTrue: [
  407.                 (dicLetrasEquivalentes at: clave) add: contPosiciones .
  408.             ].
  409.         ].
  410.         contPosiciones := contPosiciones + 1.
  411.     ].
  412. ! !
  413.  
  414. !Inculto methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 14:47'!
  415. inicializarInculto: palabraAux
  416.     "Contructor de la clase.
  417.     Asigna la palabra e inicializa las
  418.     equivalencias y el acertijo de la misma."
  419.  
  420.     (palabraAux = nil) ifTrue: [ ErrorEntradaInvalida new signal ].
  421.    
  422.     self inicializarPalabra: palabraAux.
  423.     self inicializarEquivalencias.
  424. ! !
  425.  
  426. !Inculto methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 22:45'!
  427. posicionesEnPalabraDeLetra: caracter
  428.     "Busca el caracter o sus equivalentes en la palabra.
  429.      En caso de encontrarse,    devuelve la     lista con
  430.     posiciones de este en la palabra.
  431.     Sino devuelve una lista vacia.
  432.     Post: Devuelve una lista. "
  433.  
  434.     | caracterAux listaAux |
  435.    
  436.     ( dicLetrasEquivalentes = nil) ifTrue: [ ErrorEquivalenciasNoAsignadas new signal ].
  437.    
  438.     caracterAux := caracter asLowercase .
  439.     listaAux := LinkedList new.
  440.    
  441.     "se evaluan sus equivalentes"
  442.     dicLetrasEquivalentes keysDo: [ : clave |
  443.         "Si se encuenta una equivalencia del caracter devuelve su lista de posiciones"
  444.         ( clave contieneA: (caracterAux asString) ) ifTrue: [
  445.             listaAux := (dicLetrasEquivalentes at: clave).         
  446.         ].
  447.     ].
  448.    
  449.     "Si la lista esta vacia, el caracter no tiene equivalentes,
  450.     busco solo las posiciones del caracter."
  451.     (listaAux isEmpty) ifTrue: [
  452.         listaAux := super posicionesEnPalabraDeLetra: caracterAux.
  453.     ].
  454.    
  455.     ^ listaAux.! !
  456.  
  457. Object subclass: #Equivalencia
  458.     instanceVariableNames: 'equivalentes'
  459.     classVariableNames: ''
  460.     poolDictionaries: ''
  461.     category: 'Ahorcado'!
  462.  
  463. !Equivalencia methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:20'!
  464. = unaEquivalencia
  465.     "Compara si una equivalencia es igual a otra,
  466.     devuelve true en caso afirmativo, false en caso contrario."
  467.    
  468.     (equivalentes = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  469.    
  470.     ^ (self esIdenticoA: unaEquivalencia).! !
  471.  
  472. !Equivalencia methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:21'!
  473. asignarEquivalenteA: otroValor
  474.     "Se asigna a la equivalencia el valor.
  475.     Pasa a ser parte de la equivalencia."
  476.  
  477.     (equivalentes = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].
  478.     equivalentes add: (otroValor asString).! !
  479.  
  480. !Equivalencia methodsFor: 'as yet unclassified' stamp: 'Lucia 4/18/2012 22:46'!
  481. contieneA: valor
  482.     "Devuelve true si el string pertenece a
  483.     la equivalencia. False en caso contrario."
  484.    
  485.     equivalentes do: [ : cadenaEquiv |
  486.         (cadenaEquiv = (valor asString) ) ifTrue: [
  487.             ^ true.
  488.         ].
  489.     ].
  490.     ^ false.! !
  491.  
  492. !Equivalencia methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:27'!
  493. esIdenticoA: unaEstrategia
  494.     "Comparador entre dos objetos de la clase Estrategia.
  495.     Devuelve true si son la misma estrategia, false en caso
  496.     contrario,"
  497.    
  498.     (equivalentes = nil) ifTrue: [ ErrorInstanciaInvalida new signal. ].   
  499.     (unaEstrategia = nil) ifTrue: [ ^ false ].
  500.    
  501.     (equivalentes size = (unaEstrategia verEquivalentes) size) ifFalse: [ ^ false. ].
  502.  
  503.     equivalentes do: [ : equiv1 |
  504.         ( (unaEstrategia verEquivalentes) includes: equiv1 ) ifFalse: [ ^ false.     ].
  505.     ].
  506.     ^ true.! !
  507.  
  508. !Equivalencia methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:23'!
  509. initialize
  510.  
  511.     equivalentes := LinkedList new.! !
  512.  
  513. !Equivalencia methodsFor: 'as yet unclassified' stamp: 'Lucia 4/17/2012 00:24'!
  514. verEquivalentes
  515.  
  516.     ^ equivalentes.! !
  517.  
  518. Error subclass: #ErrorEntradaInvalida
  519.     instanceVariableNames: ''
  520.     classVariableNames: ''
  521.     poolDictionaries: ''
  522.     category: 'Ahorcado'!
  523.  
  524. Error subclass: #ErrorEquivalenciasNoAsignadas
  525.     instanceVariableNames: ''
  526.     classVariableNames: ''
  527.     poolDictionaries: ''
  528.     category: 'Ahorcado'!
Add Comment
Please, Sign In to add comment