0
import java.awt.*;
import hsa.Console;
public class Game{
    static Console c;
    public static void Wait (int time){
        try{
            Thread.sleep (time);
        }
        catch (InterruptedException e){
        }
    }
    public static class Tile{
        public int x,y,stack;
        public Tile(){
            x = 0;
            y = 0;
            stack = 0;
        }
        public Tile(int xco, int yco, int stacknum){
            x = xco;
            y = yco;
            stack = stacknum;
        }
        public void draw(Tile tile){ //To draw the tile
            if(stack>0){
                c.setColor(Color.red);
                c.fillRect(x*78+1+x,y*78+1+y,78,78); //Calculate coordinates
            }
            else{
                c.setColor(Color.blue);
                c.fillRect(x*78+1+x,y*78+1+y,78,78);
            }
        }
    }
    public static void main (String[] args){
        c = new Console ();

        for(int i=0;i<640;i+=79) c.drawLine(i,0,i,474);
        for(int i=0;i<500;i+=79) c.drawLine(0,i,632,i);
        //8x6 tiling
        Tile[][] tile = new Tile[8][6];
        for(int i=0;i<8;i++){
            for(int j=0;j<6;j++){
                tile[i][j] = new Tile();
                tile[i][j].x = i;
                tile[i][j].y = j; //Set x and y coordinates
                tile[i][j].stack = 5;
            }
        }
        Tile.draw(tile[0][0]);
    }
}

在这里,我有一个使用多维数组的 8x6 方块。我认为坐标将对应于正确的数字,但由于某种原因,坐标似乎复制了之前创建的坐标。有人可以告诉我为什么会发生这种情况以及应该如何更正代码吗?顺便说一句,我开始使用 java,所以我不完全习惯于面向对象编程:P

4

2 回答 2

3

您的坐标被声明为静态:

public static int x,y,stack;

在声明中具有static修饰符的字段称为static字段或类变量。它们与 相关联class,而不是与任何对象相关联。类的每个实例共享一个静态类变量,该变量位于内存中的一个固定位置。

但是,您应该删除static修饰符以使每个对象具有特定值Tile

编辑: 根据您的以下评论并为了您更好地理解,使用draw()功能:

方法1:如果我们希望绘制功能是static

public static void draw(Tile tile){ //To draw the tile
            if(stack>0){
                c.setColor(Color.red);
                c.fillRect(tile.x*78+1 + tile.x, tile.y*78+1+tile.y, 78, 78); 
                   //Calculate coordinates
            }
            else{
                c.setColor(Color.blue);
                c.fillRect(tile.x*78+1 + tile.x, tile.y*78+1+tile.y, 78, 78); 
            }
        }

Tile.draw(tile)您可以通过;调用此函数 tile的一个实例在哪里Tile

方法 2:如果draw(Title tile)函数是非静态的:您根本不需要传递tile实例:

public  void draw(){ //To draw the tile
            if(stack>0){
                c.setColor(Color.red);
                c.fillRect(tile.x*78+1 + tile.x, tile.y*78+1+tile.y, 78, 78); 
                   //Calculate coordinates
            }
            else{
                c.setColor(Color.blue);
                c.fillRect(tile.x*78+1 + tile.x, tile.y*78+1+tile.y, 78, 78); 
            }
        }

然后创建一个实例Tile title = new Title()并调用title.draw()

于 2013-11-08T04:07:13.567 回答
0

您已将 x、y、z 标记为静态,因此您的类的所有实例都使用相同的实例,只需删除 static 关键字

于 2013-11-08T04:08:15.320 回答