尝试在Java

时间:2017-02-22 18:59:00

标签: java

在我正在制作的名为Flood It的游戏中,我无法打印我正在制作的具有以下构造函数的对象:

Dot(int x, int y, int color)

我有三个类,一个类是DotInfo.java:

public class DotInfo {


private int x;
private int y;
private int color;
private boolean captured;

public DotInfo(int x, int y, int color){
    this.x = x;
    this.y = y;
    this.color = color;
    captured = false;
}

public int getX(){
    return x;
}

public int getY(){
    return y;
}


public void setCaptured(boolean captured) {
    this.captured = captured;
}

public boolean isCaptured(){
    return captured;
}

public int getColor() {
    return color;
}

}

我的第二堂课是GameModel.java:

import java.util.Random;

public class GameModel {


/**
 * predefined values to capture the color of a DotInfo
 */
public static final int COLOR_0           = 0;
public static final int COLOR_1           = 1;
public static final int COLOR_2           = 2;
public static final int COLOR_3           = 3;
public static final int COLOR_4           = 4;
public static final int COLOR_5           = 5;
public static final int NUMBER_OF_COLORS  = 6;

public static DotInfo[][] dots;
private DotInfo dot;
private int size;
private int currentColor;
private Random generator;
private int steps;
private String rep;

/**
 * Constructor to initialize the model to a given size of board.
 * 
 * @param size
 *            the size of the board
 */
public GameModel(int size) {
    this.size = size;
}


/**
 * Resets the model to (re)start a game. The previous game (if there is one)
 * is cleared up . 
 */
public void reset(){
    int color = 0;
    dots = new DotInfo[size][size];
    for (int i=0;i<size;i++) {
        for (int j=0;j<size;j++) {
            new DotInfo(i, j, generator.nextInt(NUMBER_OF_COLORS)+1);
            System.out.println(dots[i][j]);
        } 
    }
}


/**
 * Getter method for the size of the game
 * 
 * @return the value of the attribute sizeOfGame
 */   
public int getSize(){
    return size;
}

/**
 * returns the current color  of a given dot in the game
 * 
 * @param i
 *            the x coordinate of the dot
 * @param j
 *            the y coordinate of the dot
 * @return the status of the dot at location (i,j)
 */   
public int getColor(int i, int j){
    int color=0;
    for (int x=0;x<size;x++) {
        for (int y=0;y<size;y++) {
            if (dots[x][y].getX()==i && dots[x][y].getY()==j) {
                color=dots[x][y].getColor();
            }
        }
    }
    return color;
}

/**
 * returns true is the dot is captured, false otherwise
* 
 * @param i
 *            the x coordinate of the dot
 * @param j
 *            the y coordinate of the dot
 * @return the status of the dot at location (i,j)
 */   
public boolean isCaptured(int i, int j){
    boolean capture = true;
    for (int x=0;x<size;x++) {
        for (int y=0;y<size;y++) {
            if (dots[x][y].getX()==i && dots[x][y].getY()==j) {
                capture=dots[x][y].isCaptured();
            }
        }
    }
    return capture;   
}

/**
 * Sets the status of the dot at coordinate (i,j) to captured
 * 
 * @param i
 *            the x coordinate of the dot
 * @param j
 *            the y coordinate of the dot
 */   
public void capture(int i, int j){
    for (int x=0;x<size;x++) {
        for (int y=0;y<size;y++) {
            if (dots[x][y].getX()==i && dots[x][y].getY()==j) {
                dots[x][y].setCaptured(true);
            }
        }
    }  
}


/**
 * Getter method for the current number of steps
 * 
 * @return the current number of steps
 */   
public int getNumberOfSteps(){
    return steps;
}

/**
 * Setter method for currentSelectedColor
 * 
 * @param val
 *            the new value for currentSelectedColor
*/   
public void setCurrentSelectedColor(int val) {
    currentColor = val;
}

/**
 * Getter method for currentSelectedColor
 * 
 * @return currentSelectedColor
 */   
public int getCurrentSelectedColor() {
    return currentColor;
}


/**
 * Getter method for the model's dotInfo reference
 * at location (i,j)
 *
  * @param i
 *            the x coordinate of the dot
 * @param j
 *            the y coordinate of the dot
 *
 * @return model[i][j]
 */   
public DotInfo get(int i, int j) {
    for (int x=0;x<size;x++) {
        for (int y=0;y<size;y++) {
            if (dots[x][y].getX()==i && dots[x][y].getY()==j) {
                dot = dots[x][y];
            }
        }
    }
    return dot;
}


 /**
 * The metod <b>step</b> updates the number of steps. It must be called 
 * once the model has been updated after the payer selected a new color.
 */
 public void step(){
    steps++;
}

 /**
 * The metod <b>isFinished</b> returns true iff the game is finished, that
 * is, all the dats are captured.
 *
 * @return true if the game is finished, false otherwise
 */
public boolean isFinished(){
    boolean flag=true;
    for (int x=0;x<size;x++) {
        for (int y=0;y<size;y++) {
            if (dots[x][y].isCaptured()==false) {
                flag=false;
            }
        }
    }
    return flag;
}


 /**
 * Builds a String representation of the model
 *
 * @return String representation of the model
 */
public String toString(){
    for (int x=0;x<size;x++) {
        for (int y=0;y<size;y++) {
            rep += "Dot("+dots[x][y].getX()+", "+ dots[x][y].getY()+", "+dots[x][y].getColor()+")";
        }
    }
    return rep;
}
}

我的主要课程是Floodit.java

public class FloodIt {


 /**
 * <b>main</b> of the application. Creates the instance of  GameController 
 * and starts the game. If a game size (<12) is passed as parameter, it is 
 * used as the board size. Otherwise, a default value is passed
 * 
 * @param args
 *            command line parameters
 */
 public static void main(String[] args) {
  GameModel model = new GameModel(5);
  model.reset();
  System.out.println(model);

  }


}

有人能告诉我为什么在调用reset()方法时我的数组不会更新吗?

2 个答案:

答案 0 :(得分:1)

您忘了将新的DotInfo()对象分配给数组的每个位置。

该行:

dots[i][j] = new DotInfo(i, j, generator.nextInt(NUMBER_OF_COLORS)+1);

应该是:

   assert page.find("#visu")[:class].include?("hidden") # this passes
   assert page.has_xpath?("//*[@id='visu'][contains(@style, 'display: none')]")
   click_button("Show/hide")
   assert page.has_xpath?("//*[@id='visu'][contains(@style, 'display: block')]")

答案 1 :(得分:1)

在重置方法中你有一个for循环:

 dots = new DotInfo[size][size];
    for (int i=0;i<size;i++) {
        for (int j=0;j<size;j++) {
            new DotInfo(i, j, generator.nextInt(NUMBER_OF_COLORS)+1);
            System.out.println(dots[i][j]);
        } 
    }

这一行,

new DotInfo(i, j, generator.nextInt(NUMBER_OF_COLORS)+1);

正在做什么......

你正在创建一个对象,是的,但是没有把它分配给任何东西,所以这个对象迷失了....

您必须将该新对象分配给2D数组中的元素...

dots[i][j] = new DotInfo(i, j, generator.nextInt(NUMBER_OF_COLORS)+1);

编辑:

另一方面,

需要初始化生成器对象:

public GameModel(int size) {
    this.size = size;
    generator = new Random();

}