import java.awt.*;
import java.util.*;
import java.applet.*;
import java.awt.event.*;
import java.lang.*;
import java.math.*;
import javax.swing.*;
/*
Tekija: Pekka Laitinen 15.11.2000
Lahdekoodi vapaasti kaytettavissa ja muokattavissa taloudellista voittoa tavoittelemattomiin tarkoituksiin.
Edelleen lahdekoodin kaikkinainen kaytto kaikkia hierarkioita tukevaan toimintaan on kielletty.
Naita kommenttiriveja ei saa poistaa uusistakaan versioista.
*/

public class Sata extends java.applet.Applet implements ActionListener
{	
	Button nappi[] = new Button[100];
	Button uusipeli = new Button("Uusi peli");
	Panel napit = new Panel();
	TextField tiedot = new TextField();
	int pressed[][] = new int[10][10];
	boolean ekaKierros;	
	private int kierrosnro;
	private int currentX, currentY;
	private int bx, by;
	private int edellinenNappi;
	private int tulos;
	
	public void init()
	{
		for (int i=0; i<10; i++) {
			for (int j=0; j<10; j++) {
				pressed[i][j] = 0; // jos pressed[][] == 1, sita on jo painettu, alustetaan siis nollaksi
			}
		}
		tulos = 0;
		currentY = 10; // nykyisen paikan alustus jonnekin olemattomaan paikkaan, koska ei olla viela missaan..
		currentX = 10;
		kierrosnro = 0;
		ekaKierros = true; // joo, eka kierros on kyseessa tassa vaiheessa
		uusipeli.addActionListener(this);
		resize(400,400);
		tiedot.setEditable(false);
		for(int i=0; i<100; i++) {
			setFont( new Font( "serif", Font.PLAIN, 18 ) );
			nappi[i] = (Button) new Button(i + ""); // napeille numerot
			nappi[i].addActionListener(this);
		}

		napit.setLayout(new GridLayout(10,10));
		for(int i=0; i<100; i++) {
			napit.add(nappi[i]);
		}
		setLayout(new BorderLayout(20, 20) );
		add(napit, BorderLayout.NORTH );
		add(uusipeli, BorderLayout.CENTER );
		add(tiedot, BorderLayout.SOUTH );
	}
	
	// TAMA FUNKTIO EI JOSTAIN SYYSTA SKULAA!?
	
	public boolean jatkuukoPeli() {
		boolean tulos = false;
		for (int i=0; i<10; i++) {
			for (int j=0; j<10; j++) {
				boolean tulos2 = kelpaako(i, j); // kelpaako kylla pitaisi toimia, koska pelaillessa ei virhevalintoja sallita...
				if ((pressed[i][j] == 0) && tulos2) { // nappia ei siis saisi olla viela painettu ja sen pitaisi kelvata
					tulos = true;
					i = 10; // Ymmartaakseni talla hypataan luupista pois, kun pistetaan tuon ehdon yli..?
					j = 10;
				}
			}
		}
		return tulos;
	}
	
	public int getB (int i, boolean kumpi) {
		if (i < 10) {
			bx = 0;
			by = i;
		} else if (i >= 10 && i < 20) {
			bx = 1;
			by = i - 10;
		} else if (i >= 20 && i < 30) {
			bx = 2;
			by = i - 20;
		} else if (i >= 30 && i < 40) {
			bx = 3;
			by = i - 30;
		} else if (i >= 40 && i < 50) {
			bx = 4;
			by = i - 40;
		} else if (i >= 50 && i < 60) {
			bx = 5;
			by = i - 50;
		} else if (i >= 60 && i < 70) {
			bx = 6;
			by = i - 60;
		} else if (i >= 70 && i < 80) {
			bx = 7;
			by = i - 70;
		} else if (i >= 80 && i < 90) {
			bx = 8;
			by = i - 80;
		} else if (i >= 90 && i < 100) {
			bx = 9;
			by = i - 90;
		} else { // VIRHE!
			bx = 10;
			by = 10;
		}
		if (kumpi) {
			return bx;
		} else {
			return by;
		}
	}
	
	public void actionPerformed( ActionEvent e ) {
		String command = e.getActionCommand();
		if (command == "Uusi peli") {
			newGame();
		}
		for (int i=0; i<100; i++) {
			int tempValue = Integer.parseInt( command ); // napin arvo muuttujaan
			if (tempValue == i) { // no tama on miltei aina totta, paitsi Uudella pelilla..
				
				bx = getB(i, true); // hajotetaan se napin numero kahteen osaan, kymmeniin
				by = getB(i, false); // ..ja ykkosiin
				
				boolean sallittuRuutu = false;
				if (kierrosnro == 0) { // Ekalla kierroksella ei tarkisteta, onko ruutu sallittu	
					sallittuRuutu = true; // enaa ei ole eka kierros
				} 
				else { // Muilla tarkistetaan
					sallittuRuutu = kelpaako(bx, by);
				}
				if (sallittuRuutu) {
					nappi[i].setLabel("X"); // viimeinen pistetaan X:ksi, niin pelaajakin pysyy karryilla, vaikka menisi kesken pelin jaakaapille			
					currentX = bx; 
					currentY = by;					
					pressed[bx][by] = 1; // sita nappia painettiin..
					if (kierrosnro != 0) { // Ekalla kierroksella ei ole edellista nappia
						nappi[edellinenNappi].setLabel(""); // edellinen nappi X:sta tyhjaksi
					}
					edellinenNappi = i;
					tulos = tulos + 1;
					boolean jatko = jatkuukoPeli();							
					if (!jatko) { // ja tassako mattaa..?
						tiedot.setText("Peli ohi! Sait " + tulos + " pts.");
					}
					kierrosnro += 1;
				}
				else { // tulosta huomautus virheellisesta valinnasta, ei toteudu, lienee jotain vanhaa tauhkaa..
					setFont( new Font( "serif", Font.PLAIN, 18 ) );
				}
			}
		}
	}

	public boolean kelpaako(int b_x, int b_y) { // tassapa algoritmi laillisen nappivalinnan tarkastukseen
		if (b_x == currentX && (b_y == currentY - 3 || b_y == currentY + 3)) {
			return true;
		} if ((b_x == currentX - 3 || b_x == currentX + 3) && b_y == currentY) {
			return true;
		} if ((b_x == currentX - 2 || b_x == currentX + 2) && (b_y == currentY - 2 || b_y == currentY + 2)) {
			return true;
		} else {
			return false;
		}
	}
			
	
	public void newGame() { // nollataan kaikki, jotta voidaan aloittaa uusi peli
		int arvo;
    for (int i=0; i<100; i++) {
			nappi[i].setLabel(i + ""); 
		}
		for (int i=0; i<10; i++) {
			for (int j=0; j<10; j++) {
				pressed[i][j] = 0;
			}
		}
		currentY = 10;
		currentX = 10;
		kierrosnro = 0;
		ekaKierros = true;
		tulos = 0;
  }
}


