1   package hirsipuu;
2   
3   import java.util.Scanner;
4   import fi.jyu.mit.ohj2.*;
5   
6   /**
7    * 
8    * @author Anna-Leena Latvala ja Toni Purontaka
9    * @version v0.6, 15.4.2008
10   * 
11   * K?ytt?liittym?-luokka, joka k?sittelee k?ytt?liittym?? pelaaja ja hirsipuu parametrin??n.
12   *
13   */
14  public class Naytto {
15      private Pelaaja pelaaja;
16      private Hirsipuu hirsi;
17      private static Scanner lukija = new Scanner(System.in);
18      
19      /**
20       * Kostruktori
21       * @param hirsi k?ytett?v? tietorakenne, jossa on pelin pelaamiseen tarvittavat tiedot
22       */
23      public Naytto(Hirsipuu hirsi){
24          this.hirsi = hirsi;
25          pelaaja = alustaPelaaja();
26      }
27      
28      /**
29       * Pelin aloitus, jossa kysell??n pelaajan nime? ja salasanaa ja l?ydet??n vastaava 
30       * vanha pelaaja tai luodaan uusi
31       * @return pelaaja, jota n?ytt? k?sittelee parametrinaan
32       */
33      private Pelaaja alustaPelaaja() {
34          String salasana;
35          char merkki;
36          Pelaaja pel;
37          
38          Tulosta.tervehdys();
39          do{
40              Tulosta.annaTunnus();
41              String nimi = annaSana();
42              pel = hirsi.annaPelaaja(nimi);  //pelaaja on jo olemassa, tai null
43              if (pel == null) {
44                  pel = new Pelaaja();
45                  Tulosta.kysyUusi(nimi); // luodaanko uusi pelaaja?
46                  merkki = annaMerkki('k');
47                  if (merkki == 'e') continue;
48                  Tulosta.kysySalasana(nimi);
49                  pel.alustaUusiPelaaja(nimi, annaSana());
50                  hirsi.lisaaPelaaja(pel);
51              } else {
52                  do {
53                      Tulosta.kysySalasana(nimi);
54                      salasana = annaSana();
55                  } while (!pel.salasanaOikein(salasana));
56                  pel.alustaPelaaja();
57              }   
58          } while (!pel.alustettu());
59          return pel;
60      }
61      
62      
63      /**
64       * Odottaa kunnes k?ytt?j? antaa jonkin merkin
65       */
66      public void odotaMikaVaanMerkki() {
67          Syotto.lueRivi();
68      }
69      
70      /**
71       * N?ytt?? pelaajan pisteet eri tasoilla.
72       */
73      public void omatPisteet() {
74          Tulosta.omatPisteet(hirsi.annaOmatPisteet(pelaaja.pid()));
75          odotaMikaVaanMerkki();
76      }
77      
78      /**
79       * Kaikkien pelaajien parhaiden pisteiden esittely.
80       */
81      public void hiScores() {
82          Tulosta.hiScores(hirsi.annaHiScores(), 5); // tulostetaan top 5
83          odotaMikaVaanMerkki();
84      }
85      
86      /**
87       * Admin-valikossa navigointi.
88       * (M)uokkaa sanalistoja
89       * (T)arkastele pelaajia
90       * (L)opetus
91       */
92      public void admin() {
93          Tulosta.adminValikko(); //tulostaa admin-valikon vaihtoehdot
94          boolean jatketaan = true;
95          do {
96              Tulosta.adminPika(); // tulostaa valintojen kirjainrivin
97              switch(annaMerkki('l')) {
98                  case 'm': adminMuokkaaListoja(); break;
99                  case 't': adminTarkastelePelaajia(); break;
100                 default: jatketaan = false; break;
101             }
102         } while (jatketaan);
103         
104     }
105     /**
106      * Admin-valikon sanalistojen muokkaustoiminto.
107      */
108     public void adminMuokkaaListoja() {
109         Tulosta.muokkaaListoja();
110         
111     }
112 
113     /**
114      * Admin-valikon pelaajien tarkastelutoiminto.
115      */
116     public void adminTarkastelePelaajia() {
117         Tulosta.tarkastelePelaajia();
118         
119     }
120     
121     /**
122      * Navigaatio pelivalikossa.
123      * (?) Ohje
124      * (0) Lopetus
125      * (1) Taso 1
126      * (2) Taso 2
127      * jne.
128      */
129     public void peliValikko() {
130         int vastaus;
131         while(true) {
132             Tulosta.peliValikko(hirsi.tasoTulosteet(pelaaja.taso()));
133             vastaus=Syotto.kysyInt("");
134             if (vastaus>0) pelaa(vastaus);
135             else return;
136         }
137     }
138     
139     /**
140      * Hoitaa hirsipuun pelaamisen. P?ivitt?? l?p?issyn tason pisteet pelaajan pisteisiin
141      * ja antaa luvan menn? seuraavalle tasolle, jos pelaaja l?p?isi edellisen tason.
142      * @param taso taso, jolla peli suoritetaan.
143      */
144     public void pelaa(int taso) {
145         if (pelaaja.taso() < taso) {
146             System.out.println("Et ole viel? t?ll? tasolla!");
147             return;
148         }
149         
150         int pts = pelaile(taso);
151         hirsi.paivitaPisteet(pelaaja.pid(), taso, pts); 
152         if(pts>0) pelaaja.nostaTasoa(); //jos pelaaja l?p?isi tason, niin lupa menn? seur.
153     }
154     
155     /**
156      * Peluuttaa varsinaista pelisilmukkaa, mik?li kyseinen taso on olemassa.
157      * @param taso taso, jonka sanoja kysell??n
158      * @return pistem??r?, joka tasolta saatiin
159      */
160     public int pelaile(int taso){
161         Peli peli = new Peli();     // vakiom??reet pelille, kysyt??n 5 sanaa, saa tulla 10 v??r?? merkki?
162         Scanner in=new Scanner(System.in);
163         boolean valmis=false;
164         char c;
165         String s;
166 
167         if (hirsi.sana(taso) == null) {
168             System.out.println("Tasoa " + taso + "ei ole olemassa.");
169             return 0;
170         }
171         peli.alustaKierros();
172         
173         while(!valmis){
174             System.out.println(""); System.out.println("");
175             System.out.println("Arvaa sana aiheesta: "+hirsi.annaVihje(taso));
176             System.out.println("");
177             peli.setSana(hirsi.sana(taso));
178             boolean sanaValmis=false;
179             while(!sanaValmis){
180                    System.out.println(peli.annaTuloste());
181                    System.out.println("V??ri? arvauksia :" + peli.annaVaarat() + "\n");
182                    s=in.nextLine();
183                    if(s.length()==0) continue;
184                    else{
185                        c=s.charAt(0);
186                        if(peli.arvaa(c)){
187                            System.out.println("Sana oikein!");
188                            sanaValmis=true;
189                        }
190                        System.out.println("Yhteens? v??ri?: " + peli.annaYhtVaarat()); 
191                        if(peli.liikaaVaaria()){
192                            valmis=true;
193                            sanaValmis=true;
194                            System.out.println("Et onnistunut...");
195                        } 
196                    }
197             }
198             peli.lisaaOikea();
199             if(peli.tarpeeksiArvattuja()) valmis=true;
200         }
201         if(peli.tarpeeksiArvattuja()){
202             System.out.println("Onnittelut! l?p?isit tason!!");
203             System.out.println("Pisteesi: "+ peli.annaPisteet());
204             return peli.annaPisteet();
205         }
206         return 0;
207         
208     }
209     
210     
211     
212     /**
213      * Navigaatio p??valikossa:
214      * (P)elaa
215      * (H)iScores
216      * (O)mat pisteet
217      * (A)dmin
218      * (L)opetus
219      */
220     public void paaValikko() {
221         Tulosta.paaValikko(pelaaja); //tulostaa valikon vaihtoehdot, ei kirjainrivi?
222         while(true) {
223             Tulosta.paaValikkoPika(pelaaja); //tulostaa valinnan kirjainrivin
224             switch(annaMerkki('l')) {
225                 case 'p': if (pelaaja.taso() == 1) {pelaa(1);} else { peliValikko(); } break;
226                 case 'h': hiScores(); break;
227                 case 'o': omatPisteet(); break;
228                 case 'a': if (pelaaja.pid() == 1) {admin();} break;
229                 default: return;
230             }
231         } 
232     }
233 
234     /**
235      * Lukee k?ytt?j?lt? kokonaisen merkkijonon.
236      * @return merkkijono stringin??
237      */
238     public static String annaSana() {
239         return lukija.nextLine();
240     }
241 
242     /**
243      * Lukee k?ytt?j?lt? yhden merkin.
244      * @return merkkijono stringin??
245      */
246     public static char annaMerkki(char def) {
247         String sana = lukija.nextLine();
248         if (sana.length() <= 0) return def;
249         return sana.charAt(0);
250     }
251     
252     
253     /**
254      * P??ohjelma, jonka ajamalla koko peli l?htee k?yntiin!
255      * @param args
256      */
257     public static void main(String[] args) {
258         Hirsipuu hirsi = new Hirsipuu();    //luodaan hirsipuun taakse tietorakenteet!
259         Naytto skreeni = new Naytto(hirsi);
260         skreeni.paaValikko();
261         hirsi.tallennaTiedot();
262         Tulosta.lopetus();
263     }
264 }
265