/********************************************************************* matopeli.java Matopeli-appletti, jossa mato kulkee pelikentällä ja syö ruokaa. Kun mato syö, se kasvaa. Madon liikenopeus kasvaa vähitellen. Mato ei saa törmätä pelialueen reunoihin eikä itseensä. Pääluokka: * matopeli Pääluokan tarvitsemat luokat: * kultaHarkko (satunnaisesti näyttöön ilmestyvä pisteitä lisäävä olio) * hiiriKuuntelee (hiirinapsautukset käsittelevä luokka) * matoKuuntelee (näppäimistötapahtumat käsittelevä luokka) * mato (tiedostossa mato.java) Mato-luokan tarvitsemat luokat: * osa (madon osa, pallon muotoinen olio, tiedostossa mato.java) * karkki (madon ruoka, neliö tai pallo, tiedostossa mato.java) Tekijä: Pekka Malmirae 2/1999 Muutoksia: Appletti päivitetty Java 1.1 -mukaiseksi: * size -> getSize * Säikeiden käsittelyssä päivitetty turvallisemmaksi (poistettu deadlock-vaarat) * tapahtumankäsittely päivitetty Java 1.1:n mukaiseksi, Adapter-tyyppisiksi luokiksi. 11/1999, Pekka Malmirae *********************************************************************/ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.util.Random; /*********************************** **** class kultaharkko ***********************************/ class kultaHarkko { private Random sat = new Random(); private int x, y; private boolean nakyvissa; public kultaHarkko() { x = java.lang.Math.abs(sat.nextInt() % 466); y = java.lang.Math.abs(sat.nextInt() % 290); nakyvissa = false; } public boolean onkoSyoty(int matoX, int matoY) { if (nakyvissa) if ((matoX+13 >= x) && (matoX <= x+26) && (matoY+13 >= y) && (matoY <= y+37)) return true; return false; } public int annaX() { return x; } public int annaY() { return y; } public boolean onkoNakyvissa() { return nakyvissa; } public void asetaNakyvyys(boolean nakyyko) { nakyvissa = nakyyko; } } /******************************************************* Appletin pääluokka -> class matopeli ********************************************************/ public class matopeli extends Applet implements Runnable { private Thread Saie = null; private Image Tausta, harkko; private mato Mato; private int laskuri = 0; private boolean alku = true; private int pisteet = 0; private int tauko = 110; private kultaHarkko kulta = new kultaHarkko(); private AudioClip nam; private boolean pysaytetty = false; public void init() { Mato = new mato(27,1,3); Tausta = getImage(getCodeBase(), "tausta.jpg"); Image KuvaMuistiin = createImage(getSize().width, getSize().height); Graphics KuvaMuistiinKP = KuvaMuistiin.getGraphics(); KuvaMuistiinKP.drawImage(Tausta, 0,0, this); harkko = getImage(getCodeBase(), "kulta.jpg"); Image KuvaMuistiin2 = createImage(getSize().width, getSize().height); Graphics KuvaMuistiinKP2 = KuvaMuistiin2.getGraphics(); KuvaMuistiinKP2.drawImage(harkko, 0,0, this); nam = getAudioClip(getCodeBase(), "drop.au"); addKeyListener(new MatoKuuntelee()); addMouseListener(new HiiriKuuntelee()); } public String getAppletInfo() // Tietoja appletista { return "TeknoWorm\n" + "Pekka Malmirae, Teknolit Oy 1999"; } private String toString(int nro) { return (""+nro); } public void start() { Saie = new Thread(this); Saie.start(); } public void run() { Thread tamaSaie = Thread.currentThread(); while (Saie == tamaSaie) { // ollaanko ensimmaista pelia aloittamassa? if (alku) pysaytetty = true; if (!pysaytetty) { // liikutetaan matoa Mato.liiku(); // osuiko mato seinään tai itseensä? if (Mato.onkoKuollut()) { pysaytetty = true; } // söikö mato kultaharkon? if (kulta.onkoSyoty(Mato.annaX(), Mato.annaY())) { nam.play(); kulta = new kultaHarkko(); pisteet+=200; } // tutkitaan onko mato syönyt: int lisays = Mato.syo(); if (lisays>0) { nam.play(); pisteet+=lisays; } // hoidetaan harkon tuonti näyttöön ja sen poisto: if ((laskuri % 350 == 0) && laskuri != 0) kulta.asetaNakyvyys(true); if ((laskuri % 380 == 0) && laskuri != 0) { kulta = new kultaHarkko(); laskuri = 0; } laskuri++; if (pisteet > 2000) tauko = 95; if (pisteet > 4000) tauko = 70; if (pisteet > 6000) tauko = 60; if (pisteet > 8000) tauko = 50; repaint(); } try { tamaSaie.sleep(tauko); } catch (InterruptedException e){} } } public void stop() { Saie = null; } public void update(Graphics g) { paint(g); } public void paint(Graphics g) { Font isofontti = new Font("Courier", Font.BOLD, 22); Font pikkufontti = new Font("Helvetica", Font.PLAIN, 14); Font nimi = new Font("Helvetica", Font.BOLD, 10); g.drawImage(Tausta, 0,0,this); if (kulta.onkoNakyvissa()) g.drawImage(harkko, kulta.annaX(), kulta.annaY(),this); showStatus("Valmis"); Mato.piirraMato(g); g.setColor(new Color(251,219,157)); g.drawString(toString(pisteet), 232, 348); } class HiiriKuuntelee extends MouseAdapter { public void mousePressed(MouseEvent me) { int x = me.getX(); int y = me.getY(); if (Mato.onkoKuollut() || alku == true) { if ((x >= 313) && (x <= 375) && (y >= 332) && (y <= 351)) { Mato = new mato(27,1, 3); kulta= new kultaHarkko(); alku = false; pisteet = 0; laskuri =0; tauko = 110; pysaytetty = false; } } } } class MatoKuuntelee extends KeyAdapter { public void keyPressed(KeyEvent ke) { switch(ke.getKeyCode()) { case KeyEvent.VK_LEFT: if (Mato.osat[0].annaSuunta() != Mato.OIKEA) Mato.kaanny(Mato.VASEN); break; case KeyEvent.VK_RIGHT: if (Mato.osat[0].annaSuunta() != Mato.VASEN) Mato.kaanny(Mato.OIKEA); break; case KeyEvent.VK_UP: if (Mato.osat[0].annaSuunta() != Mato.ALAS) Mato.kaanny(Mato.YLOS); break; case KeyEvent.VK_DOWN: if (Mato.osat[0].annaSuunta() != Mato.YLOS) Mato.kaanny(Mato.ALAS); break; } } } } // matopeli-class päättyy