Teoria dei Giochi

Dama Italiana

  Board.java

Implementazione della parte grafica
Costruttore

Metodo per la gestione del giocatore umano
mouseDown



Codice

import java.awt.*;
import java.util.*;

/**
 *	Definizione della classe board
 *
 */
public class Board extends Canvas{

//	I) definizione delle campi della classe

	boolean incomplete = false;					// flag che indica se la mossa e' incompleta
	boolean highlight = false;					// flag che indica se mossa e' stata iniziata

	private int start_i,start_j,end_i,end_j;			// coordinate di partenza e di arrivo
	private int dimCasella;						// dimensione della casella
	private int dimPedina;						// dimensione della pedina
	private int offset;						// offset
	private int offsetDama;						// offset per la dama

	public Vector> mosseObbligate, mosseInizialiTurno; // struttura dati di gestion delle mosse
	public int incompleteIndex;
	Checkers game;

	Image offImage;
	Graphics offGraphics;


//	II) definizione del costrurre della classe

	/**
	  *	Costruttore della classe
	  */
 Indice 	  
  
	Board (Checkers checkers){

		game = checkers;
		dimCasella=50;						// dimensione di una casella
		dimPedina=30;						// dimensione di una pedina
		offset=(dimCasella-dimPedina)/2;			// inizializzazione offset
		offsetDama=5;						// inizializzazione del bordo della dama
		incompleteIndex=0;					// inizializzazione indice di controllo del numero di catture in una cattura multipla
		mosseInizialiTurno = new Vector>();	// inizializzazione delle mosse iniziali
	}


 Indice
//	III) definizione dei metodi della classe

//	A) Metodo di gestione degli eventi sulla board
	/**
	  *	Metodo che gestisce gli eventi del giocatore umano che esegue le mosse spostando le pedine sulla dama
	  *	@param evt evento registrato
	  *	@param x coordinata x dove e' stato cliccato il mouse
	  *	@param y coordinata y dove e' stato cliccato il mouse
	  */
	public boolean mouseDown(Event evt, int x, int y){

		if(!game.giocoIniziato)			// si controlla se il gioco e' iniziato, altrimenti si termina
			return true;

		// si impostano le variabili i, j che indicano le coordinate virtuali dove e' stato cliccato
		int j = x / dimCasella;
		int i = y / dimCasella;

		// si controlla se le coordinate sono valide e si e' cliccato nella board, altrimenti si termina
		if(!Move.inRange(i,j))
			return true;


		// si deve controllare in quale fase della mossa ci si trova:
		//	- se si sta scegliendo la pedina da muovere, e questa e' legale
		if(!highlight || (highlight && (game.toMove == Checkers.WHITE && (game.position[i][j] == Checkers.WHITE || game.position[i][j] == Checkers.WKING)
				 || game.toMove == Checkers.BLACK && (game.position[i][j] == Checkers.BLACK || game.position[i][j] == Checkers.BKING)) && incompleteIndex==0)){

		// inizializzazione struttura dati per la copia delle mosse possibili
			mosseObbligate=new Vector>();	

		// copia delle mosse iniziali
			for(int x1=0; x1(mosseInizialiTurno.elementAt(x1).size()));
				for(int x2=0; x2 0)		// se la mossa e' permessa
					g.setColor(Color.orange);	// coloro di arancione
				else					// altrimenti
					g.setColor(Color.red);		// coloro di rosso
				g.fillRect(start_j*dimCasella,start_i*dimCasella,dimCasella,dimCasella); // ridisegno la casella
			}

		// B) Disegno il pezzo della damiera, contenuto nella corrispondente board virtuale
			switch (game.position[i][j])
			{
				case Checkers.WHITE:			// se c'e' una pedina bianca:
				g.setColor(Color.white);		// - si setta il colore di bianco
				g.fillOval(j*dimCasella+offset,i*dimCasella+offset,dimPedina,dimPedina); // - si crea il cerchio che rappresenta la pedina bianca
				break;
				case Checkers.BLACK:			// se c'e' una pedina nera
				g.setColor(Color.black);		// - si setta il colore di nero
				g.fillOval(j*dimCasella+offset,i*dimCasella+offset,dimPedina,dimPedina); // - si crea il cerchio che rappresenta la pedina nera
				break;
				case Checkers.WKING:			// se c'e' una dama bianca
				g.setColor(Color.white);		// - si setta il colore bianco
				g.fillOval(j*dimCasella+offset,i*dimCasella+offset,dimPedina,dimPedina); // - si crea il cerchio piu' grande della dama bianca
				g.setColor(Color.red);			// - si setta il colore di rosso
				g.fillOval(j*dimCasella+offset+offsetDama,i*dimCasella+offset+offsetDama,dimPedina-offsetDama*2,dimPedina-offsetDama*2);		// - si crea il cerchio piccolo rosso per creare la dama bianca
				//g.setFont(new Font("Times New Roman",Font.BOLD, 20));
				g.setColor(Color.white);		// - si setta il colore bianco	
				g.drawString(new 		String("*"),j*dimCasella+offset+dimPedina/2,i*dimCasella+offset+dimPedina/2); // - si disegna la stellina
				break;
				case Checkers.BKING:			// se c'e' una dama nera
				g.setColor(Color.black);		// - si setta il colore di nero
				g.fillOval(j*dimCasella+offset,i*dimCasella+offset,dimPedina,dimPedina); // - si crea il cerchio piu' grande della dama nera
				g.setColor(Color.yellow);		// - si setta il colore giallo
				g.fillOval(j*dimCasella+offset+offsetDama,i*dimCasella+offset+offsetDama,dimPedina-offsetDama*2,dimPedina-offsetDama*2);		// - si crea il cerchio piccolo giallo per creare la dama nera			
				g.setColor(Color.white);
				g.drawString(new String("*"),j*dimCasella+offset+dimPedina/2,i*dimCasella+offset+dimPedina/2); // - si crea disegna la stellina
			} // switch
			g.setColor(Color.red);
			g.drawString(new String(""+i),j*dimCasella,i*dimCasella+10);
			g.drawString(new String(","+j),j*dimCasella+5,i*dimCasella+10);
			
			// se il gioco non e' ancora iniziato, si visualizza la scritta di inizio partita
			if(!game.giocoIniziato){			
				Font f=g.getFont();				
				g.setFont(new Font("Arial",Font.BOLD,40));	// si setta il font per la scritta
				g.drawString(new String("PREMI NEW GAME"),4*dimCasella-180,4*dimCasella+10); // si disegna la scritta
				g.setFont(f);
			}
		} // for

	} // paint()


//	D) Metodo per aggiornare la grafica
	/**
	  *	overriden so as to avoid flicker
	  */
	public void update(Graphics g)
	{
		paint(g);
	} // update()

} // Board