package View;
import Controller.OthelloController;
import Model.Othello.ModeJeu;
import Model.Othello.Ligne;
import Model.Othello.Case;
import Model.Couleur;
import Model.Othello.Pion;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.TextField;
import java.lang.String;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.21D3FE72-47F3-0C45-617E-112E9A550479]
// </editor-fold>
public class GridView extends Canvas implements CommandListener, GridViewObserver, ViewInterface {
private int _lines[]; // The spacing of the lines. Auto Calculated from screen size
private int _cubeSize;
private boolean _isReady;
private String _text = "Attente du serveur";
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.5C187B4D-A788-7EA7-34FB-3F3A70CF5095]
// </editor-fold>
private static final Command NEW_GAME = new Command("Nouvelle partie", Command.SCREEN, 1);
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.D9059ACA-2490-29CB-21E7-38C3FE7B54F8]
// </editor-fold>
private static final Command EXIT_GAME = new Command("Quitter", Command.EXIT, 10);
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.5726A974-2B20-B877-7FDD-32223EE4F996]
// </editor-fold>
private static int BOARD_COLOR = 0xFFFFFF;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.834E32FA-79A0-77A2-DFED-EB08418C191D]
// </editor-fold>
private static int LINE_COLOR = 0x000000;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.009807FF-1E7B-010D-103C-7DA55B57D098]
// </editor-fold>
private static int TEXT_ALIGN = Graphics.TOP | Graphics.HCENTER;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.0ED8C370-0386-C677-A2B6-A9B91F0A15AC]
// </editor-fold>
private static int CURSOR_COLOR = 0xFF0000;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.641309C4-5CD8-AC36-D8CF-A035E96EC8A8]
// </editor-fold>
private String _winText = "Vous avez gagne !!!";
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.89E09A9B-A16A-3B1C-9AC1-3659B29D0750]
// </editor-fold>
private OthelloController _othelloController;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.88A202D4-B4F3-3D3D-594D-323D2C2AADD6]
// </editor-fold>
private Display _display;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.E2C89710-1CE1-C910-6127-A61D4816632D]
// </editor-fold>
private ViewInterface _child;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.DA9BE2C6-AB4B-46B3-8C82-F8CCC12DE816]
// </editor-fold>
private ViewInterface _parent;
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.F1B2CD87-13FD-549C-318D-B970DCC8A0B1]
// </editor-fold>
public GridView (Display disp, OthelloController ctrl) {
super();
_display = disp;
_othelloController = ctrl;
setCommandListener(this);
addCommand(EXIT_GAME);
addCommand(NEW_GAME);
_othelloController.get_gridOthello().setObserver(this);
int largeurGrille = this._othelloController.get_gridOthello().get_lignes().size();
// Calculate the distance between the lines.
// Assumes a square screen
_cubeSize = (getWidth() / largeurGrille) - 2;
_lines = new int[largeurGrille + 1];
for (int i = 0; i < largeurGrille + 1; ++i) {
_lines[i] = (i * _cubeSize);
}
this.setIsReady(true);
_text = "" ;
}
/**
* Change l'état de la vue
* @param state : Etat de la vue true = pret à jouer, sinon false
* @return
*/
public void setIsReady(boolean state) {
_isReady = state;
}
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,regenBody=yes,id=DCE.812C1C77-4061-8833-AF88-E29DE5AF01D9]
// </editor-fold>
public int getCURSOR_COLOR () {
return CURSOR_COLOR;
}
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,regenBody=yes,id=DCE.119BB724-A40F-A25D-EE1A-6458C23B939C]
// </editor-fold>
public int getTEXT_ALIGN () {
return TEXT_ALIGN;
}
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,regenBody=yes,id=DCE.37F8F1F9-E7AC-91D1-5E75-4BB88E1D8A77]
// </editor-fold>
public String get_winText () {
return _winText;
}
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,regenBody=yes,id=DCE.C8857659-339A-7EC5-7FD5-33EAD05C9D45]
// </editor-fold>
public void set_winText (String val) {
this._winText = val;
}
/**
* Affecte le message affiché dans l'état non pret à jouer
* @param t : Texte à afficher
* @return
*/
public void setText(String t) {
_text = t ;
this.othelloCursorMoveEvent();
System.out.println(_text);
}
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.5F1400D8-26E5-AC6B-913F-695E2CA3E4C5]
// </editor-fold>
public void commandAction (Command c,Displayable d) {
if (c == EXIT_GAME) {
if( (this._othelloController.get_modeJeu().get_mode() == ModeJeu.TYPE_JOUER_PLUSIEURS) ||
(this._othelloController.get_modeJeu().get_mode() == ModeJeu.TYPE_JOUER_PLUSIEURS_SERVEUR)) {
this._othelloController.notifyDestroyed();
} else {
this._parent.display() ;
}
} else if (c == NEW_GAME) {
this.display();
}
}
// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
// #[regen=yes,id=DCE.403C390D-6B9E-930E-252F-A31A6682722C]
// </editor-fold>
public void display () {
this._display.setCurrent(this);
}
public void othelloCursorMoveEvent (){
this.repaint();
}
public void othelloSetPionEvent(){
boolean partieFinie = false;
switch(this._othelloController.get_modeJeu().get_mode()){
case ModeJeu.TYPE_JOUER_PLUSIEURS|ModeJeu.TYPE_JOUER_SEUL:
if(this._othelloController.get_currentPlayer().equals(this._othelloController.get_blackPlayer())){
//tester si le nouveau joueur Rouge peut jouer
if( this._othelloController.get_gridOthello().IsCoupPossible( new Pion(new Couleur(Couleur.RED))) ){
this._othelloController.set_currentPlayer(this._othelloController.get_redPlayer());
}else if(this._othelloController.get_gridOthello().IsCoupPossible( new Pion(new Couleur(Couleur.BLACK)))){
//si le joueur noir peut jouer, c'est à son tour
this._othelloController.set_currentPlayer(this._othelloController.get_blackPlayer());
}else{
//aucun joueur ne peut jouer
partieFinie = true;
}
}else{
//tester si le nouveau joueur Noir peut jouer
if( this._othelloController.get_gridOthello().IsCoupPossible( new Pion(new Couleur(Couleur.BLACK))) ){
this._othelloController.set_currentPlayer(this._othelloController.get_blackPlayer());
}else if(this._othelloController.get_gridOthello().IsCoupPossible( new Pion(new Couleur(Couleur.RED)))){
//si le joueur noir peut jouer, c'est à son tour
this._othelloController.set_currentPlayer(this._othelloController.get_redPlayer());
}else{
//aucun joueur ne peut jouer
partieFinie = true;
}
}
break;
case ModeJeu.TYPE_JOUER_PLUSIEURS_SERVEUR:
break;
}
this._othelloController.set_partieFinie(partieFinie);
this.repaint();
}
public void setParentAndChild (ViewInterface p, ViewInterface c) {
this._child = c;
this._parent = p;
}
/**
* Dessine la grille
* @param g : Graphique à utiliser pour le dessin
* @return
*/
protected void paint(Graphics g) {
if ( (this._othelloController.get_modeJeu().get_mode() == ModeJeu.TYPE_JOUER_PLUSIEURS) ||
(this._othelloController.get_modeJeu().get_mode() == ModeJeu.TYPE_JOUER_PLUSIEURS_SERVEUR) ){
removeCommand(NEW_GAME);
} else {
addCommand(NEW_GAME);
}
addCommand(EXIT_GAME);
// clear background
g.setColor(BOARD_COLOR);
g.fillRect(0, 0, g.getClipWidth(), g.getClipHeight());
// draw lines
g.setColor(LINE_COLOR);
for (int l = 0; l < _lines.length; ++l) {
drawGridLines(g, _lines, l);
}
g.setColor(LINE_COLOR);
// draw cells
for (int l = 0; l < _lines.length; l += 3) {
drawGridLines(g, _lines, l);
}
g.setColor(LINE_COLOR);
//affichage des pions
int nbRedPion = 0;
int nbBlackPion = 0;
for (int row = 0; row < this._othelloController.get_gridOthello().get_lignes().size(); ++row) {
Ligne ligne = (Ligne)this._othelloController.get_gridOthello().get_lignes().elementAt(row);
for (int col = 0; col < ligne.get_cases().size(); ++col) {
Case c = (Case)ligne.get_cases().elementAt(col);
//s'il y a un pion
if(c.get_pion() == null){
//drawCell(g, _grid, _lines, _cubeSize, row, col);
}else{
int codeCouleur = 0x000000;
switch(c.get_pion().get_couleur().get_valeur()){
case Couleur.BLACK:
nbBlackPion++;
codeCouleur = 0x000000;
break;
case Couleur.RED:
nbRedPion++;
codeCouleur = 0xFF0000;
break;
}
g.setColor(codeCouleur);
g.fillArc( (_lines[col] + _cubeSize / 2) - 5, (_lines[row] + _cubeSize / 2) - 5, (_cubeSize / 2) + 4, (_cubeSize / 2) + 4, 0, 360);
}
}
}
//affichage des scores
g.setColor(0x000000); //score du noir
g.drawString( String.valueOf(nbBlackPion), g.getClipWidth() - 10, 40, TEXT_ALIGN);
g.setColor(0xFF0000); //score du rouge
g.drawString( String.valueOf(nbRedPion), g.getClipWidth() - 10, 70, TEXT_ALIGN);
int codeCouleur = 0x000000;
String texteJoueur = "";
if(this._othelloController.get_currentPlayer().equals(this._othelloController.get_blackPlayer())){
codeCouleur = 0x000000;
texteJoueur = "JOUEUR NOIR";
}else if(this._othelloController.get_currentPlayer().equals(this._othelloController.get_redPlayer())){
codeCouleur = 0xFF0000;
texteJoueur = "JOUEUR ROUGE";
}
//on vérifie si la partie est finie
if(this._othelloController.get_partieFinie()){
if(nbBlackPion>nbRedPion){
codeCouleur = 0x000000;
texteJoueur = ":) NOIR!!!!!";
}else if(nbBlackPion<nbRedPion){
codeCouleur = 0xFF0000;
texteJoueur = ":) ROUGE!!!!";
}else{
codeCouleur = 0xababab;
texteJoueur = " MATCH NUL !! :( ";
}
}
g.setColor(codeCouleur);
g.drawString(texteJoueur, g.getClipWidth() / 2, g.getClipHeight()/2 + 55, TEXT_ALIGN);
// drawCursor
g.setColor(CURSOR_COLOR);
g.drawRect(_lines[_othelloController.get_gridOthello().getCursorCol()], _lines[_othelloController.get_gridOthello().getCursorRow()], _cubeSize, _cubeSize);
g.drawRect( _lines[_othelloController.get_gridOthello().getCursorCol()]-1, _lines[_othelloController.get_gridOthello().getCursorRow()]-1, _cubeSize, _cubeSize);
g.drawRect( _lines[_othelloController.get_gridOthello().getCursorCol()]+1, _lines[_othelloController.get_gridOthello().getCursorRow()]+1, _cubeSize, _cubeSize);
if (!_isReady) {
g.setColor(BOARD_COLOR);
g.fillRect(10, (g.getClipHeight() / 2) - 10, g.getClipWidth() - 20, 30);
g.setColor(LINE_COLOR);
g.drawRect(10, (g.getClipHeight() / 2) - 10, g.getClipWidth() - 20, 30);
g.drawString(_text, g.getClipWidth() / 2, g.getClipHeight() / 2, TEXT_ALIGN);
}
}
/**
* Dessine les lignes de la grille
* @param g : Graphique à utiliser pour le dessin
* @param lines : Ligne à dessiner
* @param l : index de la ligne
* @return
*/
private void drawGridLines(Graphics g, int lines[], int l) {
int largeurGrille = this._othelloController.get_gridOthello().get_lignes().size();
g.drawLine(lines[0], lines[l], lines[largeurGrille], lines[l]);
g.drawLine(lines[l], lines[0], lines[l], lines[largeurGrille]);
}
/**
* Translation du code de la touche en numéro
* @param keyCode : code de la touche
* @return
*/
protected void keyPressed(int keyCode) {
//pour gérer le mouvemznt du curseur ainsi que l'appui sur la touche action
int action = this.getGameAction(keyCode);
int col = _othelloController.get_gridOthello().getCursorCol();
int row = _othelloController.get_gridOthello().getCursorRow();
int largeurGrille = this._othelloController.get_gridOthello().get_lignes().size();
switch (action) {
case Canvas.LEFT:
if (-1 == --col) {
col = largeurGrille - 1;
}
break;
case Canvas.RIGHT:
if (largeurGrille == ++col) {
col = 0;
}
break;
case Canvas.UP:
if (-1 == --row) {
row = largeurGrille - 1;
}
break;
case Canvas.DOWN:
if (largeurGrille == ++row) {
row = 0;
}
break;
case Canvas.FIRE:
int couleurPion = Couleur.RED;
if(this._othelloController.get_currentPlayer().equals(this._othelloController.get_blackPlayer())){
couleurPion = Couleur.BLACK;
}else if(this._othelloController.get_currentPlayer().equals(this._othelloController.get_redPlayer())){
couleurPion = Couleur.RED;
}
this._othelloController.get_gridOthello().setCell(row, col, new Pion(new Couleur(couleurPion)));
break;
}
_othelloController.get_gridOthello().setCursorPos(row, col);
}
}