import java.awt.Color;
import java.awt.event.MouseEvent;
import sk.upjs.jpaz2.*;
public class Piskvorky extends WinPane {
/**
* Cislo hraca (1 alebo 2), ktory je prave na tahu
*/
private int naTahu = 1;
/**
* Referencia na 2D pole, v ktorom si pamatame
* obsadenost policok
*/
private int[][] policka;
/**
* Pamatame si, ci bezi hra
*/
private boolean hraBezi = true;
/**
* Specialna inicializacna metoda objektov triedy Piskvorky
*/
public Piskvorky() {
// Nakreslime mriezku
this.mriezka();
// Vytvorime 2D pole. Po vytvoreni je pole naplnene
// 0-ami (je to defaultna hodnota pre int).
this.policka = new int[15][15];
}
/**
* Nakresli mriezku 15 x 15
*/
public void mriezka() {
// Vytvorime kresliacu korytnacku
Turtle k = new Turtle();
// Pridame korytnacku do plochy
this.add(k);
// Nakreslime 15 vertikalnych ciar
for (int i=1; i<16; i++) {
k.setPosition(i*20, 0);
k.moveTo(i*20, this.getHeight());
}
// Nakreslime 15 horizontalnych ciar
for (int i=1; i<16; i++) {
k.setPosition(0, i*20);
k.moveTo(this.getWidth(), i*20);
}
// Odstranime kresliacu korytnacku z (tejto) plochy
this.remove(k);
}
/**
* Nakresli bodku zadanej farby na policku v riadku r a stlpci s
*/
public void bodka(int r, int s, Color c) {
// Vytvorenie kresliacej korytnacky
Turtle k = new Turtle();
// Pridanie korytnacky do (tejto) kresliacej plochy
this.add(k);
// Nastavime sa na stred policka a nakreslime bodku
k.setPosition(s*20 + 10, r*20 + 10);
k.setFillColor(c);
k.dot(8);
// Odstranime korytnacku z kresliacej plochy
this.remove(k);
}
@Override
protected void onMouseClicked(int x, int y, MouseEvent detail) {
// Vypocitame si riadok a stlpec policka,
// do ktoreho sme klikli
int r = y/20;
int s = x/20;
// Ak nebezi hra, tak koncime
if (this.hraBezi == false)
return;
// Ak je policko obsadene koncime ...
if (this.policka[r][s] != 0)
return;
// V poli si poznacime, ze obsadzujeme policko
// (cislom hraca na tahu)
this.policka[r][s] = this.naTahu;
// Ak je tahu hrac 1, tak nakreslime cervenu bodku
// a nastavime, ze na tahu je hrac 2
// (v opacnom pripade je na tahu hrac 1)
if (this.naTahu == 1) {
this.bodka(r, s, Color.red);
this.naTahu = 2;
} else {
this.bodka(r, s, Color.blue);
this.naTahu = 1;
}
// Po kazdom tahu overime, ci uz nemame vitaza
this.overHru();
}
/**
* Vrati, ci suradnice policka (riadok, stlpec) su platne
*/
public boolean jePolicko(int r, int s) {
return ((r >= 0) && (s >= 0) && (r < 15) && (s < 15));
}
/**
* Spocita pocet rovnakych policok (bez prerusenia), ak sa vyberieme
* z policka v riadku r a stlpci s, pricom v kazdom kroku
* zmenime riadok o rPosun a stlpec o sPosun
*/
public int rovnakychVSmere(int r, int s, int rPosun, int sPosun) {
// Pocitadlo krokov
int pocitadlo = 0;
// Hodnota, ktorej suvisly sled hladame
int startHodnota = this.policka[r][s];
// Kym je sme v ploche a na polickach je sledovana hodnota,
// tak sa hybeme
while (this.jePolicko(r, s) &&
(this.policka[r][s] == startHodnota)) {
// V kazdom kroku posunieme "aktualny riadok a stlpec"
r = r + rPosun;
s = s + sPosun;
// a tiez zvysime pocitadlo krokov
pocitadlo++;
}
// Dlzka suvisleho sledu je rovna poctu krokov
return pocitadlo;
}
/**
* Overi, ci v policku v riadku r a stlpci s nezacina vyhernych 5 kamenov v
* nejakom smere
*/
public void overPolicko(int r, int s) {
int[][] posuny = { { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
// Ak je policko volne, nie je co riesit a koncime
if (this.policka[r][s] == 0)
return;
// Skusame kazdy zo smerov "posunutia"
for (int smer = 0; smer < posuny.length; smer++) {
// Spocitame si dlzku suvisleho sledu
int vSmere = this.rovnakychVSmere(r, s, posuny[smer][0],
posuny[smer][1]);
// Ak je to viac, ako 5 tak nakreslime ciaru a koncime hru
if (vSmere >= 5) {
this.spoj(r, s, r + posuny[smer][0] * (vSmere - 1),
s + posuny[smer][1] * (vSmere - 1));
this.hraBezi = false;
}
}
}
/**
* Overi, ci nemame vyhernu poziciu
*/
public void overHru() {
// Skusame kazde policko
for (int r = 0; r < 15; r++)
for (int s = 0; s < 15; s++)
this.overPolicko(r, s);
}
/**
* Nakresli vyhernu spojovaciu ciaru z policka [r1][s1]
* do policka [r2][s2]
*/
public void spoj(int r1, int s1, int r2, int s2) {
Turtle k = new Turtle();
this.add(k);
k.setPenColor(Color.black);
k.setPenWidth(2);
k.setPosition(s1*20+10, r1*20+10);
k.moveTo(s2*20+10, r2*20+10);
this.remove(k);
}
}