| Peli.java |
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