Advertisement
Guest User

Tilanne.scala

a guest
Nov 11th, 2014
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 6.01 KB | None | 0 0
  1. package o1.peeveli
  2.  
  3. import Tilanne.Piilossa
  4. import scala.util.Random
  5.  
  6. /**
  7.  * Kukin luokan `Tilanne` ilmentymä kuvaa yhtä Peeveli-hirsipuupelin pelitilannetta:
  8.  * Minkä näköinen on arvaajalle näytettävä (osin paljastettu) piilosana? Montako arvausta
  9.  * on jäljellä? Mitä arvauksia on jo tehty? Sekä huijaavalle Peevelille tärkeä tieto: Mitkä
  10.  * kaikki sanat ovat edelleen mahdollisia vastauksia?
  11.  *
  12.  * Peeveli-pelin toiminta on selitetty tarkemmin kurssimateriaalin luvussa 9.3.
  13.  *
  14.  * Vaikka pelin aikana pelitilanne vaihteleekin, on kukin `Tilanne`-olio tilaltaan täysin
  15.  * muuttumaton. Uusi pelitilanne muodostetaan uutena `Tilanne`-oliona kutsumalla
  16.  * vanhalle tilanteelle `arvaa`-metodia.
  17.  *
  18.  * @param vaariaSallitaan se määrä vääriä arvauksia, joka vielä sallitaan ennen pelin päättymistä.
  19.  *                        Negatiivinen luku tarkoittaa, että peli on päättynyt.
  20.  * @param arvatut         merkkijono, joka sisältää järjestyksessä kaikki toistaiseksi arvatut merkit
  21.  * @param piilosana       merkkijono, jossa on piilosanan arvaajalle näkyvä muoto. Pelin alussa piilosanassa on
  22.  *                        vain piilossa olevia merkkejä (ks. [[Tilanne.Piilossa]]), mutta merkkejä paljastuu vähitellen.
  23.  * @param sopivatSanat    kaikki ne käytetyn sanaston sanat, jotka sopivat yhteen `piilosana`-parametrin kanssa eli
  24.  *                        ovat mahdollisia oikeita vastauksia
  25.  */
  26. class Tilanne(val vaariaSallitaan: Int, val arvatut: String, val piilosana: String, val sopivatSanat: Vector[String]) {
  27.  
  28.     /**
  29.      * Luo uuden `Tilanne`-olion, joka kuvaa juuri alkaneen uuden `Peeveli`-pelin tilaa.
  30.      * Pelin alkaessa koko piilosana on vielä piilossa ja kaikki annetun sanaston sopivan mittaiset sanat
  31.      * ovat mahdollisia oikeita ratkaisuja.
  32.      *
  33.      * Lisätieto opiskelijoille: Huomaa, miten tämä '''toinen konstruktori''' on määritelty annetussa ohjelmakoodissa.
  34.      * Tällä tavoin voidaan määritellä vaihtoehtoinen tapa luoda `Tilanne`-olio sen "oletustavan" lisäksi, joka
  35.      * on määritelty luokan otsikkorivillä. Voidaan siis luoda tilanneolio joko käskyllä `new Tilanne(arvauksia, arvatut,
  36.      * piilosana, sopivat)` (oletustapa) tai käskyllä `new Tilanne(arvauksia, pituus, sanasto)`.
  37.      *
  38.      * @param arvauksiaKaytettavissa se määrä vääriä arvauksia, joka yhteensä sallitaan ennen pelin päättymistä
  39.      * @param pituus                 uuden piilosanan pituus
  40.      * @param sanasto                sanasto, jonka `pituus`-mittaiset sanat ovat mahdollisia oikeita vastauksia
  41.      */
  42.     def this(arvauksiaKaytettavissa: Int, pituus: Int, sanasto: Vector[String]) = {
  43.         // Seuraava tarkoittaa: luo olio käyttäen "oletustapaa" ja antaen seuraavat konstruktoriparametrit:
  44.         this(arvauksiaKaytettavissa, "", Piilossa.toString * pituus, sanasto.map(_.toUpperCase))
  45.     }
  46.  
  47.     /**
  48.      * Palauttaa piilosanan pituuden.
  49.      */
  50.     def sananPituus = this.piilosana.length
  51.  
  52.     /**
  53.      * Palauttaa niiden käytetystä sanastosta löytyvien sanojen lukumäärän, jotka ovat (edelleen) mahdollisia
  54.      * ratkaisuja piilosanaan.
  55.      */
  56.     def sopiviaSanojaJaljella = this.sopivatSanat.size
  57.  
  58.     /**
  59.      * Palauttaa `true` jos arvaaja on arvannut väärin jo enemmän kertoja kuin sallittiin ja on siis
  60.      * hävinnyt pelin; palauttaa `false`, jos näin ei ole.
  61.      */
  62.     def onTappio = {
  63.         println("this.vaariaSallitaan: " + this.vaariaSallitaan)       
  64.         this.vaariaSallitaan < 0
  65.     }
  66.  
  67.     /**
  68.      * Palauttaa `true`, jos arvaaja on voittanut pelin eli ei ole arvannut liian monta kertaa väärin ja
  69.      * kaikki piilosanan kirjaimet ovat näkyvissä; muutoin palauttaa `false`.
  70.      */
  71.     def onVoitto = false // TODO: korvaa toimivalla toteutuksella
  72.  
  73.     /**
  74.      * Palauttaa sanan, jota Peeveli väittää oikeaksi vastaukseksi pelin päättyessä arvaajan tappioon.
  75.      * Sana valitaan satunnaisesti; eri kutsukerroilla saadaan yleensä eri sana.
  76.      */
  77.     def oikeaVastaus() = {
  78.         println("sopivaSanat.size: " + this.sopivatSanat.size)
  79.         this.sopivatSanat(Random.nextInt(this.sopivatSanat.size))
  80.     }
  81.  
  82.     /**
  83.      * Palauttaa sellaisen version piilosanasta, josta on paljastettu osoitetut merkit.
  84.      * Esimerkiksi jos piilosana on `"K___A"` ja parametrimerkkijono on `"__SS_"`, palauttaa
  85.      * `"K_SSA"`.
  86.      */
  87.     private def paljasta(paljastettavat: String) = {
  88.         var uusiPiilosana = ""
  89.         for (indeksi <- this.piilosana.indices) {
  90.             if (paljastettavat(indeksi) != Piilossa) {
  91.                 uusiPiilosana += paljastettavat(indeksi)
  92.             } else {
  93.                 uusiPiilosana += this.piilosana(indeksi)
  94.             }
  95.         }
  96.         uusiPiilosana
  97.     }
  98.  
  99.     /**
  100.      * Palauttaa uuden pelitilanteen, joka seuraa nykyisestä, kun arvaaja arvaa annetun merkin.
  101.      * Uusi pelitilanne valitaan periaatteella, joka on selostettu kurssimateriaalin luvussa 9.3.
  102.      * Uudessa tilanteessa on ainakin yksi tehty arvaus enemmän kuin nykyisessä; lisäksi siinä saattaa
  103.      * olla enemmän näkyviä merkkejä piilosanassa, vähemmän vääriä arvauksia jäljellä ja/tai vähemmän
  104.      * mahdollisia oikeita vastauksia.
  105.      *
  106.      * @param arvaus viimeksi arvattu merkki; saa olla iso tai pieni kirjain, mutta tulkitaan aina isoksi
  107.      * @return uusi pelitilanne
  108.      */
  109.     def arvaa(arvaus: Char) = {
  110.         val arvausIsona = arvaus.toUpper
  111.         val arvatutString = this.arvatut + arvausIsona
  112.         println("arvatutString: " + arvatutString)
  113.         val ratkaisu = this.oikeaVastaus()
  114.         val montako = this.arvatut.length + 1
  115.         val arvaustaJaljella = this.vaariaSallitaan - 1
  116.  
  117.         new Tilanne(arvaustaJaljella, arvatutString, this.piilosana, this.sopivatSanat)
  118.     }
  119.  
  120.     /**
  121.      * Palauttaa tekstimuotoisen kuvauksen tästä pelitilanteesta.
  122.      */
  123.     override def toString =
  124.         this.piilosana + ", " +
  125.             "vääriä sallitaan vielä: " + this.vaariaSallitaan + ", " +
  126.             "arvatut: " + (if (this.arvatut.isEmpty) "ei ole" else this.arvatut) + ", " +
  127.             "vaihtoehtoja: " + this.sopiviaSanojaJaljella
  128.  
  129. }
  130.  
  131. /**
  132.  * Tämä `Tilanne`-luokan kumppaniolio vain tarjoaa yhden vakioarvon.
  133.  *
  134.  * @see [[Tilanne]]-luokka
  135.  */
  136. object Tilanne {
  137.  
  138.     /** merkki, jota käytetään piilossa olevien kirjainten merkitsemiseen Peeveli-pelissä */
  139.     val Piilossa = '_'
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement