//il .class di questo file è lanciato dall'HTML
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class Forza4App extends Applet implements ActionListener, Runnable{
public Forza4App(){
X0 = 10;
Y0 = 10;
HT = 340;
LT = 510;
X1 = 0;
Y1 = 0;
LC = 50;
HC = 50;
X2 = 0;
Y2 = 0;
BO = 8;
font = new Font("Arial", 0, 17);
aral1i2 = new Font("Arial", 0, 12);
lineaStato = "";
rigenera = true;
partita = new PartitaForza4();
tratto = 1;
inizia = 1;
umano = true;
computerPensa = false;
esecuzioneMossa = false;
nuova = false;
fine = false;
sosp = false;
vittoria = false;
esecuzioneDisegno = false;
esecuzioneDisegnoIn = false;
campo = new int[7][6];
sfondo = new Color(147, 227, 179);
rosso = new Color(222, 0, 0);
blu = new Color(0, 0, 222);
nuovaPartita = new Button("Nuova partita");
scegliPedina = new Label("Scegli pedina:");
bluUomo = new Checkbox("");
rossoUomo = new Checkbox("");
scegliPrima = new Label("Prima mossa:");
bluPrima = new Checkbox("");
rossoPrima = new Checkbox("");
}
public void actionPerformed(ActionEvent actionevent){
String s = actionevent.getActionCommand();
if(s.equals("Nuova partita"))
nuovaPartita();
}
public void azzeraPartita(){
giocatore[0] = giocatoreNuova[0];
giocatore[1] = giocatoreNuova[1];
partita.azzeraPartita();
for(int i = 0; i < 7; i++)
{
for(int j = 0; j < 6; j++)
campo[i][j] = 0;
}
}
public void disegna(){
xc = X0 + (colonna - 1) * LC + BO / 2;
yc = Y0 + (7 - partita.casellaVuota(colonna)) * HC + BO / 2;
trattoD = tratto;
tratto = (tratto + 1) % 2;
sosp = true;
rigenera = false;
repaint();
}
public void init(){
super.init();
setName("Forza4");
setLayout(null);
setSize(426, 240);
setBackground(sfondo);
nuovaPartita.addActionListener(this);
add(nuovaPartita);
bluUomo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemevent){
giocatoreNuova[0] = 2;
giocatoreNuova[1] = 1;
bluUomo.setState(true);
rossoUomo.setState(false);
}
});
add(bluUomo);
bluUomo.setState(true);
rossoUomo.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemevent){
giocatoreNuova[0] = 1;
giocatoreNuova[1] = 2;
bluUomo.setState(false);
rossoUomo.setState(true);
}
});
add(rossoUomo);
add(scegliPedina);
bluPrima.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemevent){
inizia = 1;
bluPrima.setState(true);
rossoPrima.setState(false);
if(partita.numeroPedine() == 0)
nuovaPartita();
}
});
add(bluPrima);
bluPrima.setState(true);
rossoPrima.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent itemevent){
inizia = 0;
bluPrima.setState(false);
rossoPrima.setState(true);
if(partita.numeroPedine() == 0)
nuovaPartita();
}
});
add(rossoPrima);
add(scegliPrima);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent mouseevent){
int i = mouseevent.getX();
int j = mouseevent.getY();
if(giocatore[tratto] == 1 && !sosp && !fine)
{
sosp = true;
colonna = mossa(i, j);
if(colonna > 0)
if(!partita.colonnaPiena(colonna))
{
if(partita.mossaVincente(tratto + 1, colonna))
vittoria = true;
put(tratto, colonna);
if(vittoria || partita.numeroPedine() == 42)
fine = true;
disegna();
mossaComputer();
} else
{
sosp = false;
}
}
}
public void mouseReleased(MouseEvent mouseevent){
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent mouseevent){
}
});
azzeraPartita();
setVisible(true);
}
public int mossa(int i, int j){
int k = 1 + (i - X0) / LC;
if(k < 1 || k > 7 || j < Y0 || j > Y0 + HC * 6)
k = -1;
return k;
}
public void mossaComputer() {
(new Thread(this)).start();
}
public synchronized void mossaComputerT() {
long l = 10L;
if(nuova){
tratto = inizia;
azzeraPartita();
lineaStato = " ";
esecuzioneDisegno = true;
nuova = false;
fine = false;
vittoria = false;
repaint();
}
while(esecuzioneDisegno || sosp)
try {
l += l;
wait(l);
}
catch(Exception _ex) { }
if(giocatore[tratto] == 2 && !sosp && !fine){
sosp = true;
colonna = partita.rispondi(tratto + 1);
if(partita.mossaVincente(tratto + 1, colonna))
vittoria = true;
put(tratto, colonna);
if(vittoria || partita.numeroPedine() == 42)
fine = true;
disegna();
for(int i = 1; i <= 7; i++)
if(!partita.colonnaPiena(i) || i == colonna){
int j = 0;
String s = partita.vetscelta[i] + " ";
String s1 = "";
for(j = 0; j < s.length(); j++)
s1 = s1 + s.charAt(j);
for(int k = j; k < 7; k++)
s1 = " " + s1;
}
}
}
public void nuovaPartita(){
nuova = true;
vittoria = false;
mossaComputer();
}
public void paint(Graphics g) {
LC = 50;
HC = 50;
X1 = LC * 7 + X0;
Y1 = Y0 + 10;
X2 = X0;
Y2 = Y0 + 6 * HC;
lineaStato = "";
if(giocatore[tratto] == 1 && !fine && partita.numeroPedine() > 0)
lineaStato = "Ho messo la pedina nella " + nomeColonna[colonna] + " colonna";
if(giocatore[tratto] == 2 && !fine)
lineaStato = "Sto pensando";
if(vittoria)
lineaStato = partitaFinitaArr[(tratto + 1) % 2];
if(fine && !vittoria)
lineaStato = partitaFinitaArr[2];
if(esecuzioneDisegno)
rigenera = true;
esecuzioneDisegno = true;
java.awt.Dimension dimension = getSize();
int i = getFontMetrics(font).getHeight();
if(!rigenera){
if(trattoD == 0)
g.setColor(rosso);
else
g.setColor(blu);
g.fillOval(xc, yc, LC - BO, HC - BO);
}
if(rigenera){
g.setColor(sfondo);
g.fillRect(X0, Y0, LT, HT);
nuovaPartita.setBounds(X1 + 20, Y1 + 5, 120, 25);
bluUomo.setBounds(X1 + 20, Y1 + 69, 17, 17);
rossoUomo.setBounds(X1 + 120, Y1 + 69, 17, 17);
scegliPedina.setBounds(X1 + 20, Y1 + 40, 120, 25);
g.setColor(rosso);
g.fillOval(X1 + 85, Y1 + 65, 25, 25);
g.setColor(blu);
g.fillOval(X1 + 47, Y1 + 65, 25, 25);
bluPrima.setBounds(X1 + 20, Y1 + 124, 17, 17);
rossoPrima.setBounds(X1 + 120, Y1 + 124, 17, 17);
scegliPrima.setBounds(X1 + 20, Y1 + 95, 120, 25);
g.setColor(rosso);
g.fillOval(X1 + 85, Y1 + 120, 25, 25);
g.setColor(blu);
g.fillOval(X1 + 47, Y1 + 120, 25, 25);
g.setColor(new Color(33, 168, 121));
g.fillRect(X0, Y0, 7 * LC, HC * 6);
for(int j = 0; j < 6; j++){
for(int k = 0; k < 7; k++){
if(partita.pedina(k + 1, 6 - j) == '.')
g.setColor(sfondo);
if(partita.pedina(k + 1, 6 - j) == 'X')
g.setColor(rosso);
if(partita.pedina(k + 1, 6 - j) == 'O')
g.setColor(blu);
g.fillOval(X0 + k * LC + BO / 2, Y0 + j * LC + BO / 2, LC - BO, LC - BO);
}
}
}
g.setColor(sfondo);
g.fillRect(X2, Y2, LC * 7, 30);
g.setColor(Color.black);
g.setFont(font);
g.drawString(String.valueOf(lineaStato), X2 + 5, Y2 + 25);
rigenera = true;
esecuzioneDisegno = false;
sosp = false;
mossaComputer();
}
public void put(int i, int j){
campo[j - 1][partita.casellaVuota(j) - 1] = i + 1;
partita.put(i + 1, j);
}
public void run(){
mossaComputerT();
}
public void update(Graphics g){
paint(g);
}
int x;
int colonna;
int altCella;
int larghCella;
int X0;
int Y0;
int HT;
int LT;
int X1;
int Y1;
int LC;
int HC;
int X2;
int Y2;
int BO;
Font font;
Font aral1i2;
String lineaStato;
Graphics ge;
boolean rigenera;
PartitaForza4 partita;
int giocatoreNuova[] = {
2, 1
};
int giocatore[] = {
2, 1
};
int tratto;
int inizia;
boolean umano;
boolean computerPensa;
boolean esecuzioneMossa;
boolean nuova;
boolean fine;
boolean sosp;
boolean vittoria;
boolean esecuzioneDisegno;
boolean esecuzioneDisegnoIn;
int trattoD;
int xc;
int yc;
int campo[][];
Color sfondo;
Color rosso;
Color blu;
String partitaFinitaArr[] = {
"Ha vinto il Rosso", "Ha vinto il Blu", "Partita patta"
};
String nomeColonna[] = {
"", "prima", "seconda", "terza", "quarta", "quinta", "sesta", "settima"
};
static Forza4App ilF4;
Button nuovaPartita;
Label scegliPedina;
Checkbox bluUomo;
Checkbox rossoUomo;
Label scegliPrima;
Checkbox bluPrima;
Checkbox rossoPrima;
}