// LautapeliAWTApplet.java (c) 2004 Kari Laitinen // 13.4.2004 Tiedosto luotu. // 2006-10-24 Viimeisin muutos. /* Tata ohjelmaa on parannettu syyskuussa 2004 siten etta ruudun valkkyminen on estetty. Valkkymisen esto on toteutettu siten etta Ruutu-luokassa on datajasen boolean tama_ruutu_on_maalattava ; Ne Ruutu-luokan metodit jotka muuttavat ruudun sisaltoa asettavan taman muuttujan arvoon true. LautapeliAWTApplet-luokassa on update() -metodi, joka maalaa koko ruudun vain silloin kun uudelleenmaalaus on aiheutettu jotenkin muuten kun apletin itsensa pyytamana. Muutokset nayttavat toimivankin. Vanha versio ohjelmasta loytyy nimella LautapeliAWTAppletOLD.java */ import java.awt.* ; import java.awt.event.* ; interface Lautapelivakiot { public final int PELILAUDAN_VASEN_YLAKULMA_X = 20 ; public final int PELILAUDAN_VASEN_YLAKULMA_Y = 20 ; public final int RUUDUN_KOKO_PIKSELEINA = 50 ; public final int PELILAUDAN_LEVEYS_RUUTUINA = 8 ; public final int PELILAUDAN_KORKEUS_RUUTUINA = 8 ; public final int RUUTU_EI_AKTIIVINEN = 1 ; public final int RUUTU_ON_AKTIIVINEN = 2 ; public final int RUUDUN_NAPPULA_SIIRRETTAVISSA = 3 ; } abstract class Nappula implements Lautapelivakiot { int nappulan_koko = RUUDUN_KOKO_PIKSELEINA / 2 ; public abstract void piirra( Graphics graphics, Point piirtopaikka_apletissa ) ; } class Nelionappula extends Nappula { public void piirra( Graphics graphics, Point ruudun_vasen_ylakulma ) { graphics.setColor( Color.black ) ; graphics.fillRect( ruudun_vasen_ylakulma.x + RUUDUN_KOKO_PIKSELEINA / 4, ruudun_vasen_ylakulma.y + RUUDUN_KOKO_PIKSELEINA / 4, nappulan_koko, nappulan_koko ) ; } } class Pallonappula extends Nappula { public void piirra( Graphics graphics, Point ruudun_vasen_ylakulma ) { graphics.setColor( Color.red ) ; graphics.fillOval( ruudun_vasen_ylakulma.x + RUUDUN_KOKO_PIKSELEINA / 4, ruudun_vasen_ylakulma.y + RUUDUN_KOKO_PIKSELEINA / 4, nappulan_koko, nappulan_koko ) ; } } class Ruutu implements Lautapelivakiot { Point ruudun_paikka_laudalla ; Point ruudun_paikka_pikseleina ; int ruudun_tila = RUUTU_EI_AKTIIVINEN ; Nappula ruudun_nappula = null ; boolean tama_ruutu_on_maalattava = true ; Ruutu( Point annettu_paikka_laudalla, Point annettu_paikka_pikseleina ) { ruudun_paikka_laudalla = annettu_paikka_laudalla ; ruudun_paikka_pikseleina = annettu_paikka_pikseleina ; } public int lue_ruudun_tila() { return ruudun_tila ; } public void aktivoi_ruutu() { ruudun_tila = RUUTU_ON_AKTIIVINEN ; tama_ruutu_on_maalattava = true ; } public void deaktivoi_ruutu() { ruudun_tila = RUUTU_EI_AKTIIVINEN ; tama_ruutu_on_maalattava = true ; } public void aseta_ruudun_nappula_siirrettavaksi() { ruudun_tila = RUUDUN_NAPPULA_SIIRRETTAVISSA ; tama_ruutu_on_maalattava = true ; } public boolean sisaltaa_nappulan() { return ( ruudun_nappula != null ) ; } public boolean ruudun_nappula_siirrettavissa() { return ( ruudun_tila == RUUDUN_NAPPULA_SIIRRETTAVISSA ) ; } public Point lue_ruudun_paikka_laudalla() { return ruudun_paikka_laudalla ; } public Nappula lue_ruudun_nappula() { return ruudun_nappula ; } public void aseta_nappula( Nappula annettu_nappula ) { ruudun_nappula = annettu_nappula ; tama_ruutu_on_maalattava = true ; } public void aseta_ruutu_maalattavaksi() { tama_ruutu_on_maalattava = true ; } public void piirra( Graphics graphics ) { if ( ruudun_tila == RUUDUN_NAPPULA_SIIRRETTAVISSA ) { graphics.setColor( Color.cyan ) ; } else { graphics.setColor( Color.lightGray ) ; } graphics.fillRect( ruudun_paikka_pikseleina.x, ruudun_paikka_pikseleina.y, RUUDUN_KOKO_PIKSELEINA, RUUDUN_KOKO_PIKSELEINA ) ; graphics.setColor( Color.black ) ; graphics.drawRect( ruudun_paikka_pikseleina.x, ruudun_paikka_pikseleina.y, RUUDUN_KOKO_PIKSELEINA, RUUDUN_KOKO_PIKSELEINA ) ; // Aktiivinen ruutu merkitaan siten etta ruudun sisaan // piirretaan pienempi nelio. if ( ruudun_tila == RUUTU_ON_AKTIIVINEN || ruudun_tila == RUUDUN_NAPPULA_SIIRRETTAVISSA ) { graphics.drawRect( ruudun_paikka_pikseleina.x + 2, ruudun_paikka_pikseleina.y + 2, RUUDUN_KOKO_PIKSELEINA - 4, RUUDUN_KOKO_PIKSELEINA - 4 ) ; } if ( this.sisaltaa_nappulan() ) { ruudun_nappula.piirra( graphics, ruudun_paikka_pikseleina ) ; } tama_ruutu_on_maalattava = false ; } } class Pelilauta implements Lautapelivakiot { Ruutu[][] laudan_ruudut = new Ruutu [ PELILAUDAN_LEVEYS_RUUTUINA ] [ PELILAUDAN_KORKEUS_RUUTUINA ] ; Ruutu aktiivinen_ruutu ; Pelilauta() { for ( int ruudun_indeksi_y = 0 ; ruudun_indeksi_y < PELILAUDAN_KORKEUS_RUUTUINA ; ruudun_indeksi_y ++ ) { for ( int ruudun_indeksi_x = 0 ; ruudun_indeksi_x < PELILAUDAN_LEVEYS_RUUTUINA ; ruudun_indeksi_x ++ ) { laudan_ruudut [ ruudun_indeksi_x ] [ ruudun_indeksi_y ] = new Ruutu( new Point( ruudun_indeksi_x, ruudun_indeksi_y ), new Point( PELILAUDAN_VASEN_YLAKULMA_X + RUUDUN_KOKO_PIKSELEINA * ruudun_indeksi_x, PELILAUDAN_VASEN_YLAKULMA_Y + RUUDUN_KOKO_PIKSELEINA * ruudun_indeksi_y) ) ; } } // Vasemman ylakulman ruutu asetetaan alussa aktiiviseksi. aktiivinen_ruutu = laudan_ruudut [ 0 ] [ 0 ] ; aktiivinen_ruutu.aktivoi_ruutu() ; } public void aseta_nappula( Nappula asetettava_nappula, Point paikka_ruudulla ) { laudan_ruudut [ paikka_ruudulla.x ] [ paikka_ruudulla.y ] .aseta_nappula( asetettava_nappula ) ; } public void kasittele_nuoli_alas_nappaily() { // Ensin pitaa varmistua siita etta ei olla pelilaudan // alareunassa. Point nykyinen_aktiivinen_paikka = aktiivinen_ruutu.lue_ruudun_paikka_laudalla() ; if ( nykyinen_aktiivinen_paikka.y + 1 < PELILAUDAN_KORKEUS_RUUTUINA ) { Ruutu vanha_aktiivinen_ruutu = aktiivinen_ruutu ; aktiivinen_ruutu = laudan_ruudut [ nykyinen_aktiivinen_paikka.x ] [ nykyinen_aktiivinen_paikka.y + 1 ] ; if ( vanha_aktiivinen_ruutu.ruudun_nappula_siirrettavissa() ) { aktiivinen_ruutu.aseta_nappula( vanha_aktiivinen_ruutu.lue_ruudun_nappula() ) ; vanha_aktiivinen_ruutu.aseta_nappula( null ) ; } vanha_aktiivinen_ruutu.deaktivoi_ruutu() ; aktiivinen_ruutu.aktivoi_ruutu() ; } } public void kasittele_nuoli_ylos_nappaily() { // Varmistutaan etta ei olla pelilaudan ylareunassa. Point nykyinen_aktiivinen_paikka = aktiivinen_ruutu.lue_ruudun_paikka_laudalla() ; if ( nykyinen_aktiivinen_paikka.y > 0 ) { Ruutu vanha_aktiivinen_ruutu = aktiivinen_ruutu ; aktiivinen_ruutu = laudan_ruudut [ nykyinen_aktiivinen_paikka.x ] [ nykyinen_aktiivinen_paikka.y - 1 ] ; if ( vanha_aktiivinen_ruutu.ruudun_nappula_siirrettavissa() ) { aktiivinen_ruutu.aseta_nappula( vanha_aktiivinen_ruutu.lue_ruudun_nappula() ) ; vanha_aktiivinen_ruutu.aseta_nappula( null ) ; } vanha_aktiivinen_ruutu.deaktivoi_ruutu() ; aktiivinen_ruutu.aktivoi_ruutu() ; } } public void kasittele_nuoli_vasemmalle_nappaily() { } public void kasittele_nuoli_oikealle_nappaily() { // Varmistutaan etta ei olla pelilaudan oikeassa reunassa. Point nykyinen_aktiivinen_paikka = aktiivinen_ruutu.lue_ruudun_paikka_laudalla() ; if ( nykyinen_aktiivinen_paikka.x + 1 < PELILAUDAN_LEVEYS_RUUTUINA ) { Ruutu vanha_aktiivinen_ruutu = aktiivinen_ruutu ; aktiivinen_ruutu = laudan_ruudut [ nykyinen_aktiivinen_paikka.x + 1 ] [ nykyinen_aktiivinen_paikka.y ] ; if ( vanha_aktiivinen_ruutu.ruudun_nappula_siirrettavissa() ) { aktiivinen_ruutu.aseta_nappula( vanha_aktiivinen_ruutu.lue_ruudun_nappula() ) ; vanha_aktiivinen_ruutu.aseta_nappula( null ) ; } vanha_aktiivinen_ruutu.deaktivoi_ruutu() ; aktiivinen_ruutu.aktivoi_ruutu() ; } } public void kasittele_home_nappulan_painallus() { // Aktiivinen ruutu siirtyy vasempaan ylakulmaan. aktiivinen_ruutu.deaktivoi_ruutu() ; aktiivinen_ruutu = laudan_ruudut [ 0 ] [ 0 ] ; aktiivinen_ruutu.aktivoi_ruutu() ; } public void kasittele_enterin_painallus() { if ( aktiivinen_ruutu.sisaltaa_nappulan() ) { aktiivinen_ruutu.aseta_ruudun_nappula_siirrettavaksi() ; } } public void kasittele_escapen_painallus() { // Jos aktiivinen ruutu oli tilassa RUUDUN_NAPPULA_SIIRRETTAVISSA, // se palautuu normaaliksi aktiiviseksi ruuduksi. aktiivinen_ruutu.aktivoi_ruutu() ; } public void aseta_koko_pelilauta_maalattavaksi() { for ( int ruudun_indeksi_y = 0 ; ruudun_indeksi_y < PELILAUDAN_KORKEUS_RUUTUINA ; ruudun_indeksi_y ++ ) { for ( int ruudun_indeksi_x = 0 ; ruudun_indeksi_x < PELILAUDAN_LEVEYS_RUUTUINA ; ruudun_indeksi_x ++ ) { laudan_ruudut [ ruudun_indeksi_x ] [ ruudun_indeksi_y ] .aseta_ruutu_maalattavaksi() ; } } } public void piirra( Graphics graphics ) { for ( int ruudun_indeksi_y = 0 ; ruudun_indeksi_y < PELILAUDAN_KORKEUS_RUUTUINA ; ruudun_indeksi_y ++ ) { for ( int ruudun_indeksi_x = 0 ; ruudun_indeksi_x < PELILAUDAN_LEVEYS_RUUTUINA ; ruudun_indeksi_x ++ ) { laudan_ruudut [ ruudun_indeksi_x ] [ ruudun_indeksi_y ] .piirra( graphics ) ; } } } } public class LautapeliAWTApplet extends java.applet.Applet implements KeyListener { Pelilauta taman_pelin_lauta = new Pelilauta() ; boolean uudelleenmaalaus_apletin_itsensa_pyytama = false ; public void init() { addKeyListener( this ) ; // Luodaan pari nappulaoliota ja asetetaan ne // pelilaudalle. taman_pelin_lauta.aseta_nappula( new Nelionappula(), new Point( 0, 4 ) ) ; taman_pelin_lauta.aseta_nappula( new Pallonappula(), new Point( 0, 3 ) ) ; } public void keyTyped( KeyEvent event ) {} public void keyReleased( KeyEvent event ) {} public void keyPressed( KeyEvent event ) { int nappaimen_koodi = event.getKeyCode() ; switch( nappaimen_koodi ) { case KeyEvent.VK_DOWN : taman_pelin_lauta.kasittele_nuoli_alas_nappaily() ; break ; case KeyEvent.VK_UP : taman_pelin_lauta.kasittele_nuoli_ylos_nappaily() ; break ; case KeyEvent.VK_LEFT : taman_pelin_lauta.kasittele_nuoli_vasemmalle_nappaily() ; break ; case KeyEvent.VK_RIGHT : taman_pelin_lauta.kasittele_nuoli_oikealle_nappaily() ; break ; case KeyEvent.VK_HOME : taman_pelin_lauta.kasittele_home_nappulan_painallus() ; break ; case KeyEvent.VK_ENTER : taman_pelin_lauta.kasittele_enterin_painallus() ; break ; case KeyEvent.VK_ESCAPE : taman_pelin_lauta.kasittele_escapen_painallus() ; break ; default: break ; } uudelleenmaalaus_apletin_itsensa_pyytama = true ; repaint() ; } public void update( Graphics graphics ) { if ( uudelleenmaalaus_apletin_itsensa_pyytama == true ) { paint( graphics ) ; uudelleenmaalaus_apletin_itsensa_pyytama = false ; } else { int apletin_korkeus = getSize().height ; int apletin_leveys = getSize().width ; graphics.setColor( getBackground() ) ; graphics.fillRect( 0, 0, apletin_leveys, apletin_korkeus ) ; graphics.setColor( getForeground() ) ; taman_pelin_lauta.aseta_koko_pelilauta_maalattavaksi() ; paint( graphics ) ; } } public void paint( Graphics graphics ) { taman_pelin_lauta.piirra( graphics ) ; } }