// // Pelialue.java // Kimmon tyonayte // // Created by Kimmo Savolainen on 5.7.2007. // Version 1.0. // Copyright 2007 Kimmo Savolainen. All rights reserved. // import java.awt.Point; import javax.swing.*; import java.awt.*; public class Pelialue extends JPanel{ Palikka pelipalikka; int[][] tila; int [] sana = {1,2,3}; // Kimmon peli -moodin sana = "kim" int tilax; int tilay; int moodi = 1; Pelialue() { tila = new int [10][20]; tilax = 10; tilay = 20; } public void uusiPeli() { tila = new int [10][20]; } public Point pelipalikanPaikka() { return pelipalikka.paikka; } public void uusiPalikka(int moodi) { this.moodi = moodi; if ( moodi == 1 ) pelipalikka = new Palikka(); if ( moodi == 2 ) pelipalikka = new Palikka(moodi); if ( moodi == 3 ) pelipalikka = new Palikka(moodi); repaint(); } public void lisaaPalikka() { // pelipalikka lisätään pelialueeseen int xpaikka = (int)(pelipalikka.paikka.getX()); int ypaikka = (int)(pelipalikka.paikka.getY()); for (int j = 0; j < pelipalikka.getKoko(); j++) { for (int k = 0; k < pelipalikka.getKoko(); k++) { if (pelipalikka.joukko [j][k] != 0 ) tila [j + xpaikka][k + ypaikka] = pelipalikka.joukko[j][k]; } } } public void Maalaa() { this.repaint(); } protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.white); if ( moodi == 1 ) { for (int j = 0; j < tilax; j++) { for (int k = 0; k < tilay; k++) { if ( tila[j][k] == 0 ) g.setColor(Color.black); if ( tila[j][k] != 0 ) { g.setColor(Color.white); } g.fillRect(j*20,k*20, 20, 20); //20 staattinen koko neliöille } } } if ( moodi == 2 ) { for (int j = 0; j < tilax; j++) { for (int k = 0; k < tilay; k++) { if ( tila[j][k] == 0 ) g.setColor(Color.black); if ( tila[j][k] == 1 ) g.setColor(Color.yellow); if ( tila[j][k] == 2 ) g.setColor(Color.blue); if ( tila[j][k] == 3 ) g.setColor(Color.green); /* if ( tila[j][k] > 10 ) { for (int c = 0; c < 10000; c++ ) { g.setColor(Color.white); g.fillRect(j*20,k*20, 20, 20); g.setColor(Color.black); g.fillRect(j*20,k*20, 20, 20); } }*/ g.fillRect(j*20,k*20, 20, 20); //20 staattinen koko neliöille } } } if ( moodi == 3 ) { g.setFont(new Font ("ARIAL", Font.PLAIN, 18)); for (int j = 0; j < tilax; j++ ) { for ( int k = 0; k < tilay; k++ ) { if ( tila[j][k] == 0) g.setColor(Color.black); else g.setColor(Color.blue); g.fillRect(j*20,k*20, 20, 20); g.setColor(Color.white); if ( tila[j][k] == 1 ) g.drawString("K", j*20+5, (k+1)*20-4); if ( tila[j][k] == 2 ) g.drawString("I", j*20+5, (k+1)*20-4); if ( tila[j][k] == 3 ) g.drawString("M", j*20+5, (k+1)*20-4); if ( tila[j][k] == 4 ) g.drawString("O", j*20+5, (k+1)*20-4); } } } //Piirretään pelipalikka if ( pelipalikka != null ) { //Vain jos peli on käynnissä... for (int j = 0; j < pelipalikka.getKoko(); j++) { for (int k = 0; k < pelipalikka.getKoko(); k++ ) { if ( pelipalikka.joukko[j][k] != 0 && moodi != 3) { if ( pelipalikka.joukko [j][k] == 1) g.setColor(Color.yellow); if ( pelipalikka.joukko [j][k] == 2) g.setColor(Color.blue); if ( pelipalikka.joukko [j][k] == 3) g.setColor(Color.green); if ( pelipalikka.joukko [j][k] == 4) g.setColor(Color.red); if ( pelipalikka.joukko [j][k] == 5) g.setColor(Color.white); if ( pelipalikka.joukko [j][k] == 6) g.setColor(Color.magenta); if ( pelipalikka.joukko [j][k] == 7) g.setColor(Color.cyan); g.fillRect(((int)((( pelipalikanPaikka()).getX())+j))*20, ((int)(((pelipalikanPaikka()).getY())+k))*20, 19, 19 ); } if ( pelipalikka.joukko[j][k] != 0 && moodi == 3 ) { String v = new String(); if ( pelipalikka.joukko [j][k] == 1 ) v = "K"; if ( pelipalikka.joukko [j][k] == 2 ) v = "I"; if ( pelipalikka.joukko [j][k] == 3 ) v = "M"; if ( pelipalikka.joukko [j][k] == 4 ) v = "O"; g.setColor(Color.blue); g.fillRect(((int)(((pelipalikanPaikka()).getX())+j))*20, ((int)(((pelipalikanPaikka()).getY())+k))*20, 19, 19 ); g.setColor(Color.white); g.drawString(v, ((int)(((pelipalikanPaikka()).getX())+j))*20+5, ((int)(((pelipalikanPaikka()).getY())+k+1))*20-4); } } } }//if ( pelipalikka != null ) }//paintComponent public boolean onkoTilaa(int suunta) { //1 = ylös, 2 = oikealle, 3 = alhaalle, 4 = vasemmalle int xpaikka = (int)(pelipalikka.paikka.getX()); int ypaikka = (int)(pelipalikka.paikka.getY()); for (int k = 0; k < pelipalikka.getKoko(); k++ ) { for (int j = 0; j < pelipalikka.getKoko(); j++) { if ( pelipalikka.joukko[k][j] != 0) { if (suunta == 1 && ypaikka +j-1 <= 0) return false; if (suunta == 2 && k+xpaikka+1 >= tilax) return false; if (suunta == 3 && j+ypaikka+1 >= tilay) return false; if (suunta == 4 && k+xpaikka <= 0) return false; if ( suunta == 1 && tila[k+xpaikka][j+ypaikka-1] != 0 ) return false; if ( suunta == 2 && ( tila[k+xpaikka+1][j+ypaikka] != 0 || xpaikka+k+1 == tilax) ) return false; if ( suunta == 3 && ( tila[k+xpaikka][j+ypaikka+1] != 0 || ypaikka+j+1 == tilay ) ) return false; if ( suunta == 4 && ( tila[k+xpaikka-1][j+ypaikka] != 0 || xpaikka+k == 0) ) return false; } } } return true; } public boolean onkoPalikkaTiella() { int xpaikka = (int)(pelipalikka.paikka.getX()); int ypaikka = (int)(pelipalikka.paikka.getY()); for (int k = 0; k < pelipalikka.getKoko(); k++ ) { for (int j = 0; j < pelipalikka.getKoko(); j++) { if (pelipalikka.joukko[k][j] != 0) { if ( tila [k + xpaikka][j + ypaikka] == pelipalikka.joukko[k][j] ) return true; } } } return false; } public boolean onkoPalikkaUlkona() { int xpaikka = (int)(pelipalikka.paikka.getX()); int ypaikka = (int)(pelipalikka.paikka.getY()); for (int k = 0; k < pelipalikka.getKoko(); k++ ) { for (int j = 0; j < pelipalikka.getKoko(); j++) { if (pelipalikka.joukko[k][j] != 0) { if ( xpaikka + k > tilax-1 ) return true; if ( xpaikka + k + 1 < 1 ) return true; if ( ypaikka + j < 1 ) return true; if ( ypaikka + j > tilay-1 ) return true; } } } return false; } public void Dump(String mista) { // tulostetaan konsoliin pelialueen tila String tuloste = ""; for (int k = 0; k < tilay; k++ ) { for (int j = 0; j < tilax; j++) { tuloste += "."; tuloste += tila[j][k]; tuloste += "."; } System.out.println(tuloste); tuloste = ""; } System.out.println("^^^^^---" + mista + "---^^^^^"); } public int Poista(int moodi, int vari) { int poistettaviariveja = 0; if (moodi == 1) { // tetris-moodi int poistettavarivi = tilay+1; for (int k = 0; k < tilay; k++) { for (int j = 0; j < tilax; j++) { poistettavarivi = tilay+1; if (tila[j][k] == 0) break; poistettavarivi = k; } if (poistettavarivi != tilay+1) { PoistaRivi(poistettavarivi); poistettaviariveja++; } } } if (moodi == 2) { //Columns-moodi for (int k = 0; k < tilay; k++) { for (int j = 0; j < tilax; j++) { if (tila [j][k] == vari || tila [j][k] == vari+10) { // väri kerrallaan poistetaan //Ensin merkitään poistettavat pulikat //jos pulikka on kolmen suoran keskellä, se merkitään (lisätään sen arvoa 10:llä)... //... tämä täytyy ottaa huomioon värisuoria tarkasteltaessa if ( k < tilay-1 && k > 0 ) { // pystylaitoja ei tarkastella if ( tila [j][k] == tila [j][k+1] || tila [j][k]+10 == tila [j][k+1] || tila [j][k] == tila [j][k+1]+10 ) { if ( tila [j][k] == tila [j][k-1] || tila [j][k]+10 == tila [j][k-1] || tila [j][k] == tila [j][k-1] +10 ) { if ( tila [j][k] < 10 ) tila [j][k] += 10; poistettaviariveja++; if ( tila [j][k+1] < 10 ) tila [j][k+1] += 10; // merkitään varmuuden vuoksi joka kerta... if ( tila [j][k-1] < 10 ) tila [j][k-1] += 10; // ...myös suoran reunapalat. } } } if ( j < tilax-1 && j > 0 ) { // vaakalaitoja ei tarkastella if ( tila [j][k] == tila [j+1][k] || tila [j][k]+10 == tila [j+1][k] || tila [j][k] == tila [j+1][k] + 10 ) { if ( tila [j][k] == tila [j-1][k] || tila [j][k]+10 == tila [j-1][k] || tila [j][k] == tila [j-1][k]+10 ) { if ( tila [j][k] < 10 ) tila [j][k] += 10; poistettaviariveja++; if ( tila [j+1][k] < 10 ) tila [j+1][k] += 10; if ( tila [j-1][k] < 10 ) tila [j-1][k] += 10; } } } if ( k < tilay-1 && k > 0 && j < tilax-1 && j > 0 ) { //molempia laitoja ei tarkastella if ( tila [j][k] == tila [j+1][k+1] || tila [j][k]+10 == tila [j+1][k+1] || tila [j][k] == tila [j+1][k+1]+10 ) { if ( tila [j][k] == tila [j-1][k-1] || tila [j][k]+10 == tila [j-1][k-1] || tila [j][k] == tila [j-1][k-1] +10 ) { if ( tila [j][k] < 10 ) tila [j][k] += 10; poistettaviariveja++; if ( tila [j+1][k+1] < 10 ) tila [j+1][k+1] += 10; if ( tila [j-1][k-1] < 10 ) tila [j-1][k-1] += 10; } } if ( tila [j][k] == tila [j+1][k-1] || tila [j][k]+10 == tila [j+1][k-1] || tila [j][k] == tila [j+1][k-1] +10) { if ( tila [j][k] == tila [j-1][k+1] || tila [j][k]+10 == tila [j-1][k+1] || tila [j][k] == tila [j-1][k+1]+10 ) { if ( tila [j][k] < 10 ) tila [j][k] += 10; poistettaviariveja++; if ( tila [j-1][k+1] < 10 ) tila [j-1][k+1] += 10; if ( tila [j+1][k-1] < 10 ) tila [j+1][k-1] += 10; } } } } } } poistaPulikat(); } if ( moodi == 3 ) { boolean alas = true; boolean ylos = true; boolean oikealle = true; boolean vasemmalle = true; for (int k = 0; k < tilay; k++) { for (int j = 0; j < tilax; j++) { for (int t = 0; t < 3; t++ ) { // Käydään tilan pulikat läpi, jos löydetään sanan ensimmäinen kirjain, tsekataan neljään suuntaan... // löytyykö sanan muita kirjaimia oikeassa järjestyksessä. Jos päästään viimeiseen kirjaimeen (t = 2) niin... // merkitään kirjaimet sanasta +10:llä. if ( tila [j][k] == 0 ) break; if ( k - t > 0 && ylos ) { if ( tila [j][k-t] == sana [t] ) { if ( t == 2 ) { poistettaviariveja++; tila[j][k] += 10; tila[j][k-1] += 10; tila[j][k-2] += 10; poistaPulikat(); } } else { ylos = false; } } if ( k + t < tilay && alas ) { if ( tila [j][k+t] == sana [t] ) { if ( t == 2 ) { poistettaviariveja++; tila[j][k] += 10; tila[j][k+1] += 10; tila[j][k+2] += 10; poistaPulikat(); } } else { alas = false; } } if ( j - t > 0 && vasemmalle ) { if ( tila [j-t][k] == sana [t] ) { if ( t == 2 ) { poistettaviariveja++; tila [j][k] += 10; tila [j-1][k] += 10; tila [j-2][k] += 10; poistaPulikat(); } } else { vasemmalle = false; } } if ( j + t < tilax && oikealle ) { if ( tila [j+t][k] == sana [t] ) { if ( t == 2 ) { tila [j][k] += 10; tila [j+1][k] += 10; tila [j+2][k] += 10; poistettaviariveja++; poistaPulikat(); } } else { oikealle = false; } } } // for ylos = true; alas = true; vasemmalle = true; oikealle = true; } //for } //for }// if ( moodi == 3 ) return poistettaviariveja; } public void poistaVajaat() { //poistetaan tilasta kaikki yli 10:n arvot for (int k = 0; k < tilay; k++) { for (int j = 0; j < tilax; j++) { while ( tila [j][k] >= 10 ) tila [j][k] -= 10; } } } public void poistaPulikat() { //columns ja Kimmon peli -moodien poisto for (int k = 0; k < tilay; k++) { for (int j = 0; j < tilax; j++) { if ( tila [j][k] > 10 ) { tila [j][k] = 0; siirraRiviaAlaspain(j, k); } } } repaint(); } public boolean PoistaRivi(int rivi) { for (int j = 0; j < tilax; j++) { tila [j][rivi] = 0; } for (int k = rivi; k > 0; k-- ) {// siirretään muita rivejä yksi alaspäin... for (int j = 0; j < tilax; j++ ) { tila [j][k] = tila [j][k-1]; } } repaint(); return true; } public void siirraRiviaAlaspain(int j, int k) { for ( int y = k; k > 0; k-- ) { tila [j][k] = tila [j][k-1]; } repaint(); } }