Object subclass: #XDicoImages instanceVariableNames: '' classVariableNames: 'Images ' poolDictionaries: '' category: 'VL-XMasterMind'! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! XDicoImages class instanceVariableNames: ''! !XDicoImages class methodsFor: 'accessing'! imageForme: fichierMasque couleurs: fichierCouleur ^XImage forme: ((ImageReader fromFile: (('super' asFilename) construct: fichierMasque)) image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: (('super' asFilename) construct: fichierCouleur)) image! imageRouge ^ (self images at: #rouge) couleur minimalStorageString! images "self images" Images isNil ifTrue: [ self initializeImages ]. ^Images! initializeImages Images := Dictionary new. Images at: #rouge put: (self imageForme: 'boulemasque.bmp' couleurs: 'brouge.bmp'). Images at: #bleue put: (self imageForme: 'boulemasque.bmp' couleurs: 'bbleue.bmp'). Images at: #jaune put: (self imageForme: 'boulemasque.bmp' couleurs: 'bjaune.bmp'). Images at: #doree put: (self imageForme: 'boulemasque.bmp' couleurs: 'bdoree.bmp'). Images at: #verte put: (self imageForme: 'boulemasque.bmp' couleurs: 'bverte.bmp'). Images at: #noire put: (self imageForme: 'boulemasque.bmp' couleurs: 'bnoire.bmp'). Images at: #blanche put: (self imageForme: 'boulemasque.bmp' couleurs: 'bblanche.bmp'). Images at: #violette put: (self imageForme: 'boulemasque.bmp' couleurs: 'bviolette.bmp'). Images at: #marron put: (self imageForme: 'boulemasque.bmp' couleurs: 'bmarron.bmp').! test Compiler compileClass: self selector: #codeRouge source: 'codeRouge ^ ', self imageRouge! test2 Compiler compileClass: self class selector: #codeRouge source: 'codeRouge ^ nil'! ! Object subclass: #XMaster instanceVariableNames: 'espace combinaison essais reponses ' classVariableNames: 'Generateur ' poolDictionaries: '' category: 'VL-XMasterMind'! !XMaster methodsFor: 'initialize-release'! genereCombinaison ^ (1 to: 3) collect: [:i | self symboleAleatoire ]! initialize "self new" "self open" | uneImage poubelle couleurs | espace := XEspace new image: self class imageFond. combinaison := self genereCombinaison. essais := OrderedCollection with: (XEspace new valeur: 1; image: self class imageBoite; fixer; bMonoplace: true; bSorties: true; positionAbsolue: (50@400); interface: ((XInterface new) surAjout: [:boite | self correction: boite valeur ])) with: (XEspace new valeur: 2; image: self class imageBoite; fixer; bMonoplace: true; bSorties: true; positionAbsolue: (150@400); interface: ((XInterface new) surAjout: [:boite | self correction: boite valeur ])) with: (XEspace new valeur: 3; image: self class imageBoite; fixer; bMonoplace: true; bSorties: true; positionAbsolue: (250@400); interface: ((XInterface new) surAjout: [:boite | self correction: boite valeur ])). essais do: [:each | espace ajouteEntite: each ]. uneImage := self creerEntite: (self symboleAleatoire). couleurs := (XEspace new). couleurs ajouteEntite: uneImage. uneImage positionRelative: (10@10). couleurs interface: ((XInterface new) surRetrait: [ couleurs entites isEmpty ifTrue: [ | nim | nim := self creerEntite: (self symboleAleatoire). couleurs ajouteEntite: nim. nim positionRelative: 10@10 ] ]). espace ajouteEntite: couleurs. couleurs positionRelative: (50@20). poubelle := (XEspace new). espace ajouteEntite: poubelle. poubelle positionRelative: (200@20). poubelle interface: ((XInterface new) surAjout: [:origine | origine retireEntite: (origine entites first) ]). reponses := Array new: 3.! symboleAleatoire ^ #(fantome escargot nicolas ulysse hippolyte) at: (self class generateur next * 5) asInteger + 1! ! !XMaster methodsFor: 'accessing'! correction: numBoite | x choix | (reponses at: numBoite) isNil ifTrue: [ reponses at: numBoite put: (x := self creerEntite: #bof). x fixer. espace ajouteEntite: x. x positionAbsolue: (essais at: numBoite) positionAbsolue - (0@32). (essais at: numBoite) interface surRetrait: [ (reponses at: numBoite) rendreInvisible ]. ]. (reponses at: numBoite) rendreVisible. choix := (essais at: numBoite) entites first. (choix valeur = (combinaison at: numBoite)) ifTrue: [ (reponses at: numBoite) image: (self imagePour: #ok) ] ifFalse: [ (combinaison includes: choix valeur) ifTrue: [ (reponses at: numBoite) image: (self imagePour: #bof) ] ifFalse: [ (reponses at: numBoite) image: (self imagePour: #horreur) ]]. self testGain! creerEntite: symbole ^XEntite new valeur: symbole; image: (self imagePour: symbole)! espace ^espace! imagePour: unSymbole unSymbole = #fantome ifTrue: [ ^self class imageFantome ]. unSymbole = #escargot ifTrue: [ ^self class imageTourne ]. unSymbole = #nicolas ifTrue: [ ^self class image3 ]. unSymbole = #ulysse ifTrue: [ ^self class image2 ]. unSymbole = #hippolyte ifTrue: [ ^self class image1 ]. unSymbole = #ok ifTrue: [ ^self class ok ]. unSymbole = #bof ifTrue: [ ^self class bof ]. unSymbole = #horreur ifTrue: [ ^self class horreur ].! testGain | p y | (essais collect: [:e | e entites isEmpty ifFalse: [ e entites first valeur ]]) = combinaison asOrderedCollection ifTrue: [ combinaison := self genereCombinaison. espace entites copy do: [:e | e class = XEntite ifTrue: [ e valeur = #bof ifFalse: [ espace retireEntite: e ]]]. essais do: [:e | p := e entites first positionAbsolue. e retireEntite: (y := e entites first). espace ajouteEntite: y. y positionAbsolue: p + (0@100) ] ]! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! XMaster class instanceVariableNames: 'imageFond imageFantome imageTourne imageBoite image1 image2 image3 ok bof horreur '! !XMaster class methodsFor: 'creation'! bof bof isNil ifTrue: [ bof := XImage forme: ((ImageReader fromFile: 'smilemasque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'confus.bmp') image ]. ^ bof! horreur horreur isNil ifTrue: [ horreur := XImage forme: ((ImageReader fromFile: 'horreurmasque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'horreur.bmp') image ]. ^ horreur! image1 image1 isNil ifTrue: [ image1 := XImage forme: ((ImageReader fromFile: 'hippolytemasque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'hippolyte.bmp') image ]. ^ image1! image2 image2 isNil ifTrue: [ image2 := XImage forme: ((ImageReader fromFile: 'ulyssemasque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'ulysse.bmp') image ]. ^ image2! image3 image3 isNil ifTrue: [ image3 := XImage forme: ((ImageReader fromFile: 'nicolasmasque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'nicolas.bmp') image ]. ^ image3! imageBoite imageBoite isNil ifTrue: [ imageBoite := XImage forme: ((ImageReader fromFile: 'xpboitevMask.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'xpboitev.bmp') image ]. ^ imageBoite! imageFantome imageFantome isNil ifTrue: [ imageFantome := XImage forme: ((ImageReader fromFile: 'masque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'fantome.bmp') image ]. ^imageFantome! imageFond imageFond isNil ifTrue: [ imageFond := XImage forme: ((ImageReader fromFile: 'xBoitePmask.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'xBoiteP.bmp') image]. ^imageFond! imageTourne imageTourne isNil ifTrue: [ imageTourne := XImage forme: ((ImageReader fromFile: 'tournemask.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'tourne.bmp') image ]. ^ imageTourne! ok ok isNil ifTrue: [ ok := XImage forme: ((ImageReader fromFile: 'smilemasque.bmp') image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: 'smile.bmp') image ]. ^ ok! ! !XMaster class methodsFor: 'exemples'! open "self open" | fenetre minimind | fenetre := ScheduledWindow new. minimind := self new. fenetre component: (XView new model: minimind espace ). fenetre minimumSize: (minimind espace preferredBounds extent); maximumSize: (minimind espace preferredBounds extent). fenetre open.! ! !XMaster class methodsFor: 'test'! test1 "self test1" | fenetre ifantome ifond espace fantome | ifantome := self imageFantome. ifond := self imageFond. espace := XEspace new. espace image: ifond. fantome := XEntite new. fantome image: ifantome. espace ajouteEntite: fantome. espace positionAbsolue: 0 asPoint. fantome positionAbsolue: 50 asPoint. fantome interface: (XInterface vers: nil). fantome interface surClic: [ self inspect ]. fenetre := ScheduledWindow new. fenetre open. fenetre component: (XView new model: espace).! test2 "self test2" | fenetre minimind | fenetre := ScheduledWindow new. fenetre open. minimind := self new. fenetre component: (XView new model: minimind espace ).! ! !XMaster class methodsFor: 'instance creation'! new ^ super new initialize! ! !XMaster class methodsFor: 'accessing'! generateur Generateur isNil ifTrue: [ Generateur := Random new ]. ^Generateur! ! Object subclass: #XSuperMaster instanceVariableNames: 'espace combinaison essais reponses positionEssai utilisees ' classVariableNames: 'Generateur ' poolDictionaries: '' category: 'VL-XMasterMind'! !XSuperMaster methodsFor: 'initialize-release'! ajouteBancDEssai | nombreDeTrous largeur marge | nombreDeTrous := 5. largeur := (marge := espace bounds width * 2 // 3) // (nombreDeTrous + 2). essais := OrderedCollection new. 1 to: nombreDeTrous do: [:index | essais add: (espace ajouteEntite: ((XEspace new) positionAbsolue: (index * largeur @ positionEssai); image: (self class images at: #trou); valeur: index; bMonoplace: true; bSorties: true; fixer)) ]. reponses := OrderedCollection new. 1 to: nombreDeTrous do: [:index | reponses add: (espace ajouteEntite: ((XEspace new) positionAbsolue: (marge + ((index - 1) * 32)) @ positionEssai; image: (XBoite new taille: 32@32) "(self class images at: #troufiche)"; valeur: index; fixer; bEntrees: false; bSorties: false; interface: ((XInterface new) surClic: #controllerSolution; recepteur: self)) )]. positionEssai := positionEssai - 40. self retireLesBoulesSousLesEssais! ajouteBoiteChangeCouleur self mouvementDansBoite: (espace ajouteEntite: (XEspace new image: (XBoite new taille: (100@50); label: 'Changer'); positionAbsolue: (espace bounds topCenter - (150@0)); interface: (XInterface new surAjout: [:boite | | x y | x := boite entites last. (self estUneBoule: x) ifTrue: [ [ y := self creerBoule. y valeur = x valeur ] whileTrue. boite ajouteEntite: y. boite retireEntite: x ] ])))! ajouteBoiteDuplique self mouvementDansBoite: (espace ajouteEntite: (XEspace new image: (XBoite new taille: (100@50); label: 'Dupliquer'); positionAbsolue: (espace bounds topCenter - (50@0)); interface: (XInterface new surAjout: [:boite | | x | x := boite entites last. (self estUneBoule: x) ifTrue: [ boite ajouteEntite: (self creerBoule: x valeur) ] ])))! ajouteBoiteGomme | gomme | espace ajouteEntite: (gomme := XEntite new image: (XBoite new taille: (100@50); label: 'Gomme'); positionAbsolue: (espace bounds topCenter + (50@0))). gomme interface: (XInterface new surEntree: [:boite | boite espace entites copy do: [:each | (self estUneBoule: each) ifTrue: [ (boite bounds intersects: each bounds) ifTrue: [ boite espace retireEntite: each ] ] ] ])! ajouteBoutonRejouer espace ajouteEntite: (XEntite new image: (XBoite new label: 'Rejouer'; taille: 100@24); positionAbsolue: (espace bounds bottomLeft - (0@24)); interface: (XInterface new surClic: #initializeEspace; recepteur: self))! ajouteBoutonSolution espace ajouteEntite: (XEntite new image: (XBoite new label: 'Solution'; taille: 100@24); positionAbsolue: (espace bounds bottomLeft - (0@24)); interface: (XInterface new surClic: #afficheCombinaison; recepteur: self))! ajouteCouleurs | couleurs uneBoule | couleurs := (XEspace new). couleurs image: (XBoite new taille: 100@100). espace ajouteEntite: couleurs. 15 timesRepeat: [ uneBoule := self creerBoule. couleurs ajouteEntite: uneBoule. uneBoule positionRelative: (self positionAleatoireDans: ((100@100)-(32@32)))]. couleurs interface: ((XInterface new) surRetrait: [:boite | boite entites size < 10 ifTrue: [ | nim | nim := self creerBoule. boite ajouteEntite: nim. nim positionRelative: (self positionAleatoireDans: ((100@100)-(32@32))) ] ]). self mouvementDansBoite: couleurs! ajoutePoubelle | poubelle | poubelle := (XEspace new). poubelle image: (XBoite new taille: 100@50; label: 'Poubelle'). espace ajouteEntite: poubelle. poubelle positionRelative: (espace bounds topCenter + (150@0)). poubelle interface: ((XInterface new) surAjout: [:origine | (self estUneBoule: origine entites first) ifTrue: [ origine retireEntite: (origine entites first)]]).! creerBoule ^self creerBoule: self symboleAleatoire! creerBoule: symbole ^(XEntite new) image: (self class imagesBoules at: symbole); valeur: symbole! estUneBoule: each ^ self class imagesBoules includesKey: each valeur! genereCombinaison combinaison := (1 to: 5) collect: [:i | self symboleAleatoire ]! initialize espace := (XEspace new image: (XBoite new taille: 500@700; couleur: ColorValue lightGray)). self initializeEspace! initializeEspace espace entites copy do: [:each | espace retireEntite: each ]. espace interface: nil. positionEssai := 600. self genereCombinaison; ajouteBancDEssai; ajoutePoubelle; ajouteCouleurs; ajouteBoutonSolution; ajouteBoutonRejouer; ajouteBoiteDuplique; ajouteBoiteGomme; ajouteBoiteChangeCouleur! retireLesBoulesSousLesEssais essais, reponses do: [:uneBoite | (espace entites select: [:each | self estUneBoule: each ]) do: [:uneBoule | (uneBoule bounds intersects: uneBoite bounds) ifTrue: [ uneBoule positionAbsolue: (uneBoule positionAbsolue x @(uneBoite bounds top - uneBoule bounds height)) ]]]! symboleAleatoire ^ self class imagesBoules keys asOrderedCollection at: (self class generateur next * self class imagesBoules keys size) asInteger + 1! ! !XSuperMaster methodsFor: 'accessing'! afficheCombinaison (espace entites select: [:each | self estUneBoule: each ]) do: [:uneBoule | self mouvementBoule: uneBoule ]. combinaison with: essais do: [:symbole :boite | (espace ajouteEntite: (self creerBoule: symbole)) fixer; positionAbsolue: (boite positionAbsolue - (0@40)) ]. espace interface: ((XInterface new) surAjout: [:esp | | x | x := esp entites last. self mouvementBoule: x ]). reponses do: [:each | each interface: ((XInterface new) surClic: #initializeEspace; recepteur: self) ]! ajouteFicheBlanche (reponses detect: [:boite | boite entites isEmpty ]) ajouteEntite: self creerFicheBlanche! ajouteFicheNoire (reponses detect: [:boite | boite entites isEmpty ]) ajouteEntite: self creerFicheNoire! bloquerBancDEssai essais do: [:each | each bSorties: true; bEntrees: false; interface: (self interfacePour: each) ]. reponses do: [:each | each bSorties: false; bEntrees: false; interface: nil ]! compterLesBlanches | couleur | 1 to: essais size do: [:index | | boite | boite := essais at: index. boite entites isEmpty ifFalse: [ 1 to: combinaison size do: [:indexCouleur | couleur := combinaison at: indexCouleur. (utilisees at: indexCouleur) isNil ifTrue: [ boite entites first valeur = couleur ifTrue: [ self ajouteFicheBlanche. utilisees at: indexCouleur put: true. boite entites first valeur: (Array with: boite entites first valeur) ] ] ] ] ]! compterLesNoires 1 to: essais size do: [:index | | boite | boite := essais at: index. boite entites isEmpty ifFalse: [ boite entites first valeur = (combinaison at: index) ifTrue: [ self ajouteFicheNoire. utilisees at: index put: true. boite entites first valeur: (Array with: boite entites first valeur) ] ] ]! controllerSolution | solutionProposee | solutionProposee := (essais collect: [:boites | boites entites isEmpty ifTrue: [ nil ] ifFalse: [ boites entites first valeur ] ]). solutionProposee = combinaison asOrderedCollection ifTrue: [ reponses do: [:each | each ajouteEntite: self creerFicheNoire ]. self afficheCombinaison. ^self] ifFalse: [ utilisees := Array new: (combinaison size). self compterLesNoires. self compterLesBlanches. ]. self bloquerBancDEssai. self ajouteBancDEssai! creerFicheBlanche ^(XEntite new) image: (self class imagesFiches at: #blanche)! creerFicheNoire ^(XEntite new) image: (self class imagesFiches at: #noire)! espace ^espace! interfacePour: uneBoite | int valeur couleur | uneBoite entites isEmpty ifTrue: [ ^nil ]. int := XInterface new. couleur := valeur := uneBoite entites first valeur. (valeur isKindOf: Symbol) ifFalse: [ uneBoite entites first valeur: (couleur := valeur first) ]. int surRetrait: [:boite | boite ajouteEntite: (self creerBoule: couleur) ]. ^int! ! !XSuperMaster methodsFor: 'aleatoire'! positionAleatoireDans: taille ^ (self class generateur next * taille x) rounded @ (self class generateur next * taille x) rounded! positionAleatoireDans: taille procheDe: pnt | delta position | delta := self vitesseAleatoire. position := pnt + delta. position x < 0 ifTrue: [ position x: 0 ]. position y < 0 ifTrue: [ position y: 0 ]. position x > taille x ifTrue: [ position x: taille x ]. position y > taille y ifTrue: [ position y: taille y ]. ^position! vitesseAleatoire ^ ((self class generateur next * 4) @ (self class generateur next * 4)) rounded - 2.! ! !XSuperMaster methodsFor: 'mouvement'! mouvementBoule: uneBoule uneBoule valeur: (self vitesseAleatoire * 3). uneBoule interface isNil ifTrue: [ uneBoule interface: (XInterface new) ]. uneBoule interface surTempsPasse: [:boule | | pnt | pnt := (boule positionRelative + boule valeur). pnt x < 0 ifTrue: [ boule valeur: (boule valeur x negated @ boule valeur y). pnt x: 0 ]. pnt y < 0 ifTrue: [ boule valeur: (boule valeur x @ boule valeur y negated). pnt y: 0 ]. pnt x + boule bounds width > espace bounds width ifTrue: [ boule valeur: (boule valeur x negated @ boule valeur y). pnt x: espace bounds width - boule bounds width ]. pnt y + boule bounds height > espace bounds height ifTrue: [ boule valeur: (boule valeur x @ boule valeur y negated). pnt y: espace bounds height - boule bounds height ]. boule positionRelative: pnt ]. uneBoule interface surEntree: [:boule | uneBoule valeur: (self vitesseAleatoire * 3) ].! mouvementDansBoite: uneBoite uneBoite interface surTempsPasse: [:boite | boite entites do: [:each | each positionRelative: (self positionAleatoireDans: ((uneBoite bounds extent)-(each bounds extent)) procheDe: each positionRelative) ]]! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! XSuperMaster class instanceVariableNames: 'images imagesBoules imagesFiches '! !XSuperMaster class methodsFor: 'instance creation'! new ^ super new initialize! ! !XSuperMaster class methodsFor: 'exemples'! open "self open" "self allInstances" | fenetre minimind | fenetre := ScheduledWindow new. minimind := self new. fenetre component: (XView new model: minimind espace ). fenetre minimumSize: (minimind espace preferredBounds extent); maximumSize: (minimind espace preferredBounds extent). fenetre open.! ! !XSuperMaster class methodsFor: 'accessing'! generateur Generateur isNil ifTrue: [ Generateur := Random new ]. ^Generateur! imageForme: fichierMasque couleurs: fichierCouleur ^XImage forme: ((ImageReader fromFile: (('super' asFilename) construct: fichierMasque)) image convertToCoverageWithOpaquePixel: 255) couleur: (ImageReader fromFile: (('super' asFilename) construct: fichierCouleur)) image! images "self images" images isNil ifTrue: [ self initializeImages ]. ^images! imagesBoules "self imagesBoules" imagesBoules isNil ifTrue: [ self initializeImagesBoules ]. ^imagesBoules! imagesFiches "self imagesFiches" imagesFiches isNil ifTrue: [ self initializeImagesFiches ]. ^imagesFiches! initializeImages images := Dictionary new. images at: #trou put: (self imageForme: 'boulemasque.bmp' couleurs: 'trou.bmp'). images at: #troufiche put: (self imageForme: 'troufichemasque.bmp' couleurs: 'troufiche.bmp').! initializeImagesBoules imagesBoules := Dictionary new. imagesBoules at: #rouge put: (XDicoImages images at: #rouge). imagesBoules at: #bleue put: (XDicoImages images at: #bleue). imagesBoules at: #jaune put: (XDicoImages images at: #jaune). imagesBoules at: #doree put: (XDicoImages images at: #doree). imagesBoules at: #verte put: (XDicoImages images at: #verte). imagesBoules at: #noire put: (XDicoImages images at: #noire). imagesBoules at: #blanche put: (XDicoImages images at: #blanche). imagesBoules at: #violette put: (XDicoImages images at: #violette). imagesBoules at: #marron put: (XDicoImages images at: #marron).! initializeImagesFiches imagesFiches := Dictionary new. imagesFiches at: #noire put: (self imageForme: 'fichemasque.bmp' couleurs: 'fichenoire.bmp'). imagesFiches at: #blanche put: (self imageForme: 'fichemasque.bmp' couleurs: 'ficheblanche.bmp').! !