1   package hirsipuu;
2   
3   /**
4    * Luokka peliin liittyvien yksityiskohtien toteuttamiseen. Peliolio tiet?? montako sanaa
5    * kysyt??n, montako v??r?? kirjainta sallitaan, mitk? kirjaimet (ja v??r?t kirjaimet) on jo yritetty, 
6    * osaa antaa tulosteen arvattavalle sanalle siten, ett? vain arvatut merkit n?kyv?t ja arvuuttaa merkkej?,
7    * sek? osaa laskea pisteet v??rien arvausten perusteella tasolle.
8    * @author Anna-Leena Latvala, Toni Purontaka
9    * @version 0.5, 11.3.2008
10   *
11   */
12  public class Peli {
13  
14      private final int sanojenLkm, maxVaaria, maxPisteet;
15      private String sana;
16      private StringBuffer vaarat, kirjaimet, sanatuloste, valmis;
17      private int kierroksenVaarat,sanojaOikein;
18  
19      
20          
21      /**
22       * Peruspelin parametrit?n konstruktori. Alustaa peruspelin attribuutit: 
23       * sanoja kysyt??n 5 kpl, yhdest? saa max 20p ja v??ri? kirjaimia saa tulla 10.
24       */
25      public Peli() {
26          sanojenLkm = 5; maxPisteet = 20; maxVaaria = 10;
27          vaarat = new StringBuffer();
28          kirjaimet = new StringBuffer();
29      }
30      
31      /**
32       * Konstruktori, joka alustaa pelin attribuutit haluttuihin arvoihin.
33       * @param sanat kysytt?vien sanojen lkm
34       * @param pisteet yhden sanan maksimipistem??r?
35       * @param vaarat v??rien arvausten maksimim??r?
36       */
37      public Peli(int sanat, int pisteet, int vaarat) {
38          sanojenLkm = sanat; maxPisteet = pisteet; maxVaaria = vaarat;
39          this.vaarat = new StringBuffer();
40          kirjaimet = new StringBuffer();
41      }
42      
43      /**
44       * Palauttaa, montako sanaa yhdess? peliss? tulisi kysell?.
45       * @return kysytt?vien sanojen lkm
46       */
47      public int montakoKysytaan() {
48          return sanojenLkm;
49      }
50      
51      /**
52       * Alustaa v??rin ja oikein menneiden sanojen laskurit nolliksi.
53       *
54       */
55      public void alustaKierros() {
56          kierroksenVaarat = 0;
57          sanojaOikein = 0;
58      }
59      
60      /**
61       * Asettaa kyselt?v?ksi sanaksi annetun sanan sek? alustaa tulosteen ja vertailu-
62       * merkkijonon tulosteelle.
63       * @param sana annettu sana
64       */
65      public void setSana(String sana) {
66          kirjaimet.delete(0,kirjaimet.length());
67          vaarat.delete(0, vaarat.length());
68          this.sana = sana;
69          sanatuloste = new StringBuffer();
70          valmis = new StringBuffer();
71          for (int i=0; i<sana.length(); i++) {
72              sanatuloste.append("_ ");
73              valmis.append(sana.charAt(i) + " ");
74          }
75      }
76      
77      /**
78       * Palauttaa, onko sana arvattu kokonaan, kun arvataan t?t? merkki?.
79       * @param merkki pelaajan arvaama merkki
80       * @return true, jos sana tuli valmiiksi
81       *         false muutoin
82       * 
83       * @example
84       * <pre name="test">
85       * Peli peli = new Peli(5, 20, 10);
86       * peli.setSana("kissa");
87       * peli.arvaa('v') === false;
88       * peli.arvaa('k') === false;
89       * peli.arvaa('i') === false;
90       * peli.arvaa('s') === false;
91       * peli.arvaa('a') === true;
92       * </pre>
93       */
94      public boolean arvaa(char merkki) {
95          int j=0; //indeksi sanatulosteen k?sittelyyn
96          if ((kirjaimet.indexOf(""+merkki) < 0)) {
97              kirjaimet.append(merkki);
98              if (sana.contains(""+merkki)){
99                  for (int i=0; i<sana.length(); i++, j=j+2) {      
100                     if (sana.charAt(i) == merkki) sanatuloste.replace(j, j+2, merkki + " ");
101                 }
102             } else {
103                vaarat.append(merkki);
104                kierroksenVaarat++;
105             }
106         }
107         
108         return (valmis.toString().equalsIgnoreCase(sanatuloste.toString()));
109     }
110     
111     /**
112      * Palauttaa senhetkisen tulosteen arvattavalle sanalle. Viel? puuttuvat
113      * kirjaimet on tulosteessa korvattu alaviivoilla ( _ ).
114      * @return merkkijono, jossa n?kyy vain arvatut merkit
115      * 
116      * @example
117      * <pre name="test">
118      * Peli peli = new Peli(5, 20, 10);
119      * peli.setSana("kissa");
120      * peli.annaTuloste() === "_ _ _ _ _ ";
121      * peli.arvaa('s');
122      * peli.arvaa('k');
123      * peli.annaTuloste() === "k _ s s _ ";
124      * </pre>
125      */
126     public String annaTuloste() {
127         return sanatuloste.toString();
128     }
129     
130     /**
131      * Palauttaa kyseist? sanaa kohti arvattujen kirjainten merkkijonon.
132      * @return arvatut merkit
133      */
134     public String annaArvatut() {
135         return kirjaimet.toString();
136     }
137     
138     /**
139      * Palauttaa kyseist? sanaa kohti v??rin arvattujen kirjainten merkkijonon.
140      * @return v??rin arvatut merkit
141      */
142     public String annaVaarat() {
143         return vaarat.toString(); 
144     }
145     
146     /**
147      * Palauttaa t?ss? peliss? yhteens? v??rin arvattujen kirjainten m??r?n
148      * @return v??rin arvattujen kirjainten m??r?
149      */
150     public int annaYhtVaarat() {
151         return kierroksenVaarat; 
152     }
153     
154     /**
155      * Kasvattaa oikein arvattujen sanojen m??r?? yhdell?.
156      *
157      */
158     public void lisaaOikea() {
159         sanojaOikein++;
160     }
161     
162     /**
163      * Palauttaa, onko v??ri? arvauksia jo tullut maksimim??r?.
164      * @return tosi, jos v??ri? arvauksia on liikaa pelin jatkumiseksi
165      */
166     public boolean liikaaVaaria() {
167         return (maxVaaria == kierroksenVaarat);
168     }
169     
170     /**
171      * Palauttaa, onko sanoja arvattu oikein riitt?v?n monta kierrosta kohden.
172      * @return tosi, jos kierros on saatu p??t?kseen
173      */
174     public boolean tarpeeksiArvattuja() {
175         return (sanojaOikein == sanojenLkm);
176     }
177     
178     /**
179      * Palauttaa pelille pisteet hienostuneella pistelaskualgoritmilla.
180      * @param vaaria montako v??r?? arvausta pelin aikana tuli
181      * 
182      * @example
183      * <pre name="test">
184      * Peli peli = new Peli(5, 20, 10);
185      * peli.setSana("kissa");
186      * peli.arvaa('v');
187      * peli.arvaa('p');
188      * peli.arvaa('i'); 
189      * peli.arvaa('t');
190      * peli.annaPisteet() === 70;
191      * </pre>
192      */
193     public int annaPisteet() {
194         return sanojenLkm*(maxPisteet-(maxPisteet*kierroksenVaarat)/maxVaaria);
195 
196     }
197     
198 
199     /**
200      * Testip??ohjelma demonstroi, miten peli? voisi k?ytell?.
201      * @param args
202      */
203     public static void main(String[] args) {
204         Peli peli = new Peli(5, 20, 10);
205        peli.setSana("kissa");
206        System.out.println("Arvaa sana aiheesta: el?imet");
207        System.out.println(peli.annaTuloste());
208        peli.arvaa('v');
209        System.out.println("V??ri? arvauksia :" + peli.annaVaarat());
210        System.out.println(peli.annaTuloste());
211        peli.arvaa('k');
212        System.out.println("V??ri? arvauksia :" + peli.annaVaarat());
213        System.out.println(peli.annaTuloste());
214        peli.arvaa('i');
215        System.out.println("V??ri? arvauksia :" + peli.annaVaarat());
216        System.out.println(peli.annaTuloste());
217        peli.arvaa('s');
218        System.out.println("V??ri? arvauksia :" + peli.annaVaarat());
219        System.out.println(peli.annaTuloste());
220        if (peli.arvaa('a')) System.out.println("Onneksi olkoon, l?pi meni!");
221        System.out.println("V??ri? arvauksia :" + peli.annaVaarat());
222        System.out.println(peli.annaTuloste());
223        System.out.println("Sait " + peli.annaPisteet() + " pistett?.");
224     }
225 }
226