/** * HLAVNI.JAVA * * hlavní okno hry * */ package bludiste; import java.awt.Color; import java.awt.Font; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTextField; /** Srdce celé hry - okno(JFrame), ve kterém celá hra běží */ public class Hlavni extends javax.swing.JFrame { Pocitadlo hodiny=new Pocitadlo(); zobrazHodiny hodinyUkaz=new zobrazHodiny(); // String aktualniLevel=""; int polohaVypinace; boolean HRA=false; int sebranyPredmet; JLabel predmet; //objekty int velikostPole=31; int velikostPolicka=16; int pocetTypu=29; JLabel obrazky[][]=new JLabel[velikostPole][velikostPole]; //obrázky herní plochy JLabel typy[]=new JLabel[pocetTypu]; //typy políček JLabel poziceHrace; char dilky[][]=new char[velikostPole][velikostPole]; //hodnoty dílků boolean viditelnost[][]=new boolean[velikostPole][velikostPole]; //hodnoty dílků int teleporty[][]=new int[100][2]; int pocetTeleportu; int poziceX,poziceY; // JTextField klavesnice; JLabel zprava,text2,text3,pocetVterin,hodnotaRekordu; JList levely; //nej skore int pocetLevelu=100; String nazevLevelu[]=new String[pocetLevelu]; int nazevLeveluVterin[]=new int[pocetLevelu]; /** Kontruktor okna hry - zde se natavují parametry okna a inicializují veškeré herní prvky - od políček, přes obrázky prvků, popisky, .... Dále probíhá volání funkcí na načtení levelů z podsložky LEVELY a na načtení nejlepších výsledků. */ public Hlavni() { //pozice hráče poziceHrace=new JLabel(); this.add(poziceHrace); //velikost okna+vlasnosti javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); pack(); // setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Bludiště by Jan Dvořák z Vozerovic:"); setResizable(false); getContentPane().setBackground(Color.CYAN.darker()); this.setSize(velikostPole*velikostPolicka+164, velikostPole*velikostPolicka+105); this.setVisible(true); //zobrazení herní plochy int i,o; //herní typy for(i=0;i 0) data+=(char)in.read(); in.close(); }catch (FileNotFoundException e){System.out.println("\nChyba při otevírání souboru score.cfg");} //rozdělíme String tele; int i,o; pocetLevelu=0; while(data.length()>0) { i=data.indexOf("#"); //oddělovač položek if(i<0)break; tele=data.substring(0,i); o=tele.indexOf("^"); //oddělovač souřadnic //zapíšeme do pole teleportů nazevLevelu[pocetLevelu]=tele.substring(0,o); nazevLeveluVterin[pocetLevelu]=Integer.parseInt(tele.substring(o+1)); pocetLevelu++; // data=data.substring(i+1); } } /**************************************************************************/ /** Tato procedura nacte level hry predany v argumentu z podslozky LEVELY. Dále spustí vlákna časovače a zobrazení hodin. */ private void nactiLevel(String nazev) throws IOException { aktualniLevel=nazev.substring(1); konecHry(""); HRA=true; polohaVypinace=0; sebranyPredmet=0; predmet.setIcon(typy[0].getIcon()); zprava.setText("Bludiště by Jan Dvořák z Vozerovic"); //hodiny - vklákno hodiny=new Pocitadlo(); hodiny.start(); hodinyUkaz=new zobrazHodiny(pocetVterin, hodiny); hodinyUkaz.start(); int i,o,index=0; //načteme aktuální rekord o=0; for(i=0;i 0) data+=(char)in.read(); in.close(); }catch (FileNotFoundException e){System.out.println("\nChyba při otevírání levelu!");} //načteme údaje o políčkách char znak; for(i=0;i0) { i=data.indexOf("#"); //oddělovač teleportů if(i<0)break; tele=data.substring(0,i); o=tele.indexOf("U"); //oddělovač souřadnic //zapíšeme do pole teleportů teleporty[pocetTeleportu][0]=Integer.parseInt(tele.substring(0,o)); teleporty[pocetTeleportu][1]=Integer.parseInt(tele.substring(o+1)); pocetTeleportu++; // data=data.substring(i+1); } // zobrazOkolniPolicka(); //umístěnní v mapě+okolní pole //hráče šoupneme na start poziceHrace.setVisible(true); } /**************************************************************************/ /** Tato procedura zobrazí vybrané políčko zadané v arumentu pomocí jeho [X,Y] pozice a všechna políčka okolo něj. Dále přesune kurzor hry na zadané políčko. */ void zobrazOkolniPolicka() { //zobrazí políčka okolní poziceHrace.setLocation(obrazky[poziceX][poziceY].getLocation()); // int i,o; for(i=poziceX-1;i<=poziceX+1;i++) for(o=poziceY-1;o<=poziceY+1;o++) { if( !(o<0 || i<0 || o>=velikostPole || i>=velikostPole) ) { if(!viditelnost[i][o]) { viditelnost[i][o]=true; zobrazPolicko(i, o); } } } // return; } /**************************************************************************/ /** Tato procedura zobrazí vybrané políčko zadané v arumentu pomocí jeho [X,Y] pozice. */ void zobrazPolicko(int x, int y) { //zobrazí na mapě příslušný obrázek if(dilky[x][y]=='X') { //jaká je poloha vypínače int p=23; if(polohaVypinace==1)p=26; obrazky[x][y].setIcon(typy[p].getIcon()); }else //nevypínačový prvek obrazky[x][y].setIcon(typy[ (dilky[x][y]-65) ].getIcon()); } /**************************************************************************/ /** Tato procedura se volá při stisku klávesy. Je volána z keylisteneru */ private void Pohyb(java.awt.event.KeyEvent evt) { //pohyb pomocí klávesnice vyhodnotKlavesu(evt.getKeyCode()); } /** Tato procedura se volá, když políčko na detekci pohybu ztratí focus. Tato procedura mu ho opět vrátí. */ private void nastavFocus(java.awt.event.FocusEvent evt) { //znovu nastavení focus klávesnici klavesnice.requestFocus(); } /**************************************************************************/ /** Tato procedura vyhodnocuje stisklou klávesu. Rozhoduje se zde o pohybu, tlačení bedny, sbírání a pokládání předmětů, dále pak jejich použití. Nakonec detekuje ukončení hry(utopení) nebo dokončení levelu. */ void vyhodnotKlavesu(int x) { //System.out.println(x); //reakce na stisknutou klávesu if(!HRA)return; // int a=poziceX,b=poziceY; if(x==39)a++; if(x==37)a--; if(x==40)b++; if(x==38)b--; // if(a<0 || b<0 || a>=velikostPole || b>=velikostPole)return; // if(poziceX!=a || poziceY!=b) { //nastal pohyb switch(dilky[a][b]) { case 'B':return; //zed case 'W':konecHry("Utopili jste se ve vodě...");break; //utopení case 'C': //bedna if(! otestujBednu(a-poziceX,b-poziceY) )return; //nelze posunout //přesun bedny dilky[a][b]='A'; viditelnost[a][b]=false;//znovu vykreslíme dilky[poziceX+2*(a-poziceX)][poziceY+2*(b-poziceY)]='C'; viditelnost[poziceX+2*(a-poziceX)][poziceY+2*(b-poziceY)]=false;//znovu vykreslíme break; case 'U': //teleport int q=b*velikostPole+a+1;//pozice int i; for(i=0;i0)return; //již máme jeden sebraný a=dilky[poziceX][poziceY]; if( (a>='M' && a<='R') || a=='Z' ) { //můžeme sebrat sebranyPredmet=a; predmet.setIcon(typy[ (a-65) ].getIcon()); //překreslíme dilky[poziceX][poziceY]='A'; zobrazPolicko(poziceX, poziceY); } }else if(x==27) { //polož if(sebranyPredmet<=0)return; a=dilky[poziceX][poziceY]; if(a!='A')return; //nemáme kam položit //překreslíme dilky[poziceX][poziceY]=(char)sebranyPredmet; zobrazPolicko(poziceX, poziceY); //položíme sebranyPredmet=0; predmet.setIcon(typy[0].getIcon()); } } } /**************************************************************************/ @SuppressWarnings("static-access") /** Tato procedura se volá při ukončení hry. Zastaví průběh vláken, zobrazí hlášku zadanou v argumentu. */ void konecHry(String hlaska) { //ukončí hru hodiny.zastavit(); pocetVterin.setText("Počet vteřin: 0"); hodinyUkaz.zastavit(); HRA=false; zprava.setText(hlaska); } /** Tato procedura se volá, když hráč vstoupil na políčko cíl, tj vyhrál. Tato procedura volá proceduru konecHry, dále testuje, zda-li nebyl pokořen rekord hranéo levelu. Pokud tento level ještě žádný rekord nemá, je mu tímto přidělen. Nakonec se zavolá procedura ulozNejlepsiVysledky, která tyto hodnoty zapíše do souboru na disku. */ void vyhranaHra() { konecHry("Vyhráli jste!"); //je nový rekord? int cas=hodiny.sekund; int i,index=0; boolean rekord=false,nalezen=false; //najdeme udaj o aktuálním levelu for(i=0;i=velikostPole || b>=velikostPole)return false;//není kam posutnou if(dilky[a][b]!='A')return false;//poličko není prázdné // return true; } /**************************************************************************/ /** Tato procedura se volá při vstupu na přepínač lávek. Spuštěné lávky se zvednou, a zvedlé se spustí. Současně se prohodí obrázky vypínačů, aby byla tato akce názorně znázorněna. */ void prepniLavky() { //přepne lávky na mapě polohaVypinace=polohaVypinace==0?1:0; int i,o,p; for(o=0;o