Estoy practicando la programación de estilo MVC. Tengo un juego Mastermind en un solo archivo, funcionando bien (tal vez aparte del hecho de que el botón "Verificar" es invisible al inicio).
http://paste.pocoo.org/show/226726/
Pero cuando lo he reescrito para modelar, ver, archivos de controlador, y cuando hago clic en Pin vacío (que debe actualizarse y volver a pintar con un nuevo color), ocurre la observación. ¿Alguien puede ver algún problema aquí? He intentado colocar repintar () en diferentes lugares, pero simplemente no funciona en absoluto: /
Principal :
public class Main {
public static void main(String[] args){
Model model = new Model();
View view = new View("Mastermind", 400, 590, model);
Controller controller = new Controller(model, view);
view.setVisible(true);
}
}
Modelo:
import java.util.Random;
public class Model{
static final int
LINE = 5,
SCORE = 10, OPTIONS = 20;
Pin pins[][] = new Pin[21][LINE];
int combination[] = new int[LINE];
int curPin = 0;
int turn = 1;
Random generator = new Random();
int repaintPin;
boolean pinsRepaint=false;
int pinsToRepaint;
boolean isUpdate = true, isPlaying = true, isRowFull = false;
static final int HIT_X[] = {270,290,310,290,310}, HIT_Y[] = {506,496,496,516,516};
public Model(){
for ( int i=0; i < SCORE; i++ ){
for ( int j = 0; j < LINE; j++ ){
pins[i][j] = new Pin(20,0);
pins[i][j].setPosition(j*50+30,510-i*50);
pins[i+SCORE][j] = new Pin(8,0);
pins[i+SCORE][j].setPosition(HIT_X[j],HIT_Y[j]-i*50);
}
}
for ( int i=0; i < LINE; i++ ){
pins[OPTIONS][i] = new Pin( 20, i+2 );
pins[OPTIONS][i].setPosition( 370,i * 50 + 56);
}
}
void fillHole(int color) {
pins[turn-1][curPin].setColor(color+1);
pinsRepaint = true;
pinsToRepaint = turn;
curPin = (curPin+1) % LINE;
if (curPin == 0){
isRowFull = true;
}
pinsRepaint = false;
pinsToRepaint = 0;
}
void check() {
int junkPins[] = new int[LINE], junkCode[] = new int[LINE];
int pinCount = 0, pico = 0;
for ( int i = 0; i < LINE; i++ ) {
junkPins[i] = pins[turn-1][i].getColor();
junkCode[i] = combination[i];
}
for ( int i = 0; i < LINE; i++ ){
if (junkPins[i]==junkCode[i]) {
pins[turn+SCORE][pinCount].setColor(1);
pinCount++;
pico++;
junkPins[i] = 98;
junkCode[i] = 99;
}
}
for ( int i = 0; i < LINE; i++ ){
for ( int j = 0; j < LINE; j++ )
if (junkPins[i]==junkCode[j]) {
pins[turn+SCORE][pinCount].setColor(2);
pinCount++;
junkPins[i] = 98;
junkCode[j] = 99;
j = LINE;
}
}
pinsRepaint = true;
pinsToRepaint = turn + SCORE;
pinsRepaint = false;
pinsToRepaint=0;
if ( pico == LINE ){
isPlaying = false;
}
else if ( turn >= 10 ){
isPlaying = false;
}
else{
curPin = 0;
isRowFull = false;
turn++;
}
}
void combination() {
for ( int i = 0; i < LINE; i++ ){
combination[i] = generator.nextInt(6) + 1;
}
}
}
class Pin{
private int color, X, Y, radius;
public Pin(){
X = 0; Y = 0; radius = 0; color = 0;
}
public Pin( int r,int c ){
X = 0; Y = 0; radius = r; color = c;
}
public int getX(){
return X;
}
public int getY(){
return Y;
}
public int getRadius(){
return radius;
}
public void setRadius(int r){
radius = r;
}
public void setPosition( int x,int y ){
this.X = x ;
this.Y = y ;
}
public void setColor( int c ){
color = c;
}
public int getColor() {
return color;
}
}
Ver:
import java.awt.*;
import javax.swing.*;
public class View extends Frame{
Model model;
JButton checkAnswer;
private JPanel button;
private static final Color COLORS[] = {Color.black, Color.white, Color.red, Color.yellow, Color.green, Color.blue, new Color(7, 254, 250)};
public View(String name, int w, int h, Model m){
model = m;
setTitle( name );
setSize( w,h );
setResizable( false );
this.setLayout(new BorderLayout());
button = new JPanel();
button.setSize( new Dimension(400, 100));
button.setVisible(true);
checkAnswer = new JButton("Check");
checkAnswer.setSize( new Dimension(200, 30));
button.add( checkAnswer );
this.add( button, BorderLayout.SOUTH);
button.setVisible(true);
}
@Override
public void paint( Graphics g ) {
g.setColor( new Color(238, 238, 238));
g.fillRect( 0,0,400,590);
for ( int i=0; i < model.pins.length; i++ ) {
paintPins(model.pins[i][0],g);
paintPins(model.pins[i][1],g);
paintPins(model.pins[i][2],g);
paintPins(model.pins[i][3],g);
paintPins(model.pins[i][4],g);
}
}
@Override
public void update( Graphics g ) {
if ( model.isUpdate ) {
paint(g);
}
else {
model.isUpdate = true;
paintPins(model.pins[model.repaintPin-1][0],g);
paintPins(model.pins[model.repaintPin-1][1],g);
paintPins(model.pins[model.repaintPin-1][2],g);
paintPins(model.pins[model.repaintPin-1][3],g);
paintPins(model.pins[model.repaintPin-1][4],g);
}
}
void repaintPins( int pin ) {
model.repaintPin = pin;
model.isUpdate = false;
repaint();
}
public void paintPins(Pin p, Graphics g ){
int X = p.getX();
int Y = p.getY();
int color = p.getColor();
int radius = p.getRadius();
int x = X-radius;
int y = Y-radius;
if (color > 0){
g.setColor( COLORS[color]);
g.fillOval( x,y,2*radius,2*radius );
}
else{
g.setColor( new Color(238, 238, 238) );
g.drawOval( x,y,2*radius-1,2*radius-1 );
}
g.setColor( Color.black );
g.drawOval( x,y,2*radius,2*radius );
}
}
Controlador:
import java.awt.*;
import java.awt.event.*;
public class Controller implements MouseListener, ActionListener {
private Model model;
private View view;
public Controller(Model m, View v){
model = m;
view = v;
view.addWindowListener( new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
} });
view.addMouseListener(this);
view.checkAnswer.addActionListener(this);
model.combination();
}
public void actionPerformed( ActionEvent e ) {
if(e.getSource() == view.checkAnswer){
if(model.isRowFull){
model.check();
}
}
}
public void mousePressed(MouseEvent e) {
Point mouse = new Point();
mouse = e.getPoint();
if (model.isPlaying){
if (mouse.x > 350) {
int button = 1 + (int)((mouse.y - 32) / 50);
if ((button >= 1) && (button <= 5)){
model.fillHole(button);
if(model.pinsRepaint){
view.repaintPins( model.pinsToRepaint );
}
}
}
}
}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}