这里的第一个计时器,在处理一个简单的策略游戏时遇到了Java问题。这是:
尝试节省处理器时间,我使用int数组(多维)作为数据库接口。像这样:
//database variables
public int mapSize;// amount of tiles along one side of the map
public int[][] map;// [area id] - [resource type] - value
public int[][][] trades;// [trade id] - [sender/recipient] - [resource type] - value
public Object users = new Object(){
public int usercount;// amount of users in the game
public int[][] opinion;// [first user id] - [second user id] - value
public int[][][] resources;// [user id] - [resource type] - [value type] - value
public int[][] efficiency;// [user id] - [resource type] - value
public int[][] processes;// [user id] - [resource type] - value
};
//public math function (triangular numbers by iteration)
public int triNum(int i){
return (int) i*(i+1)/2;
}
如您所见,我使用Object()
来存储用户数据。用户在这里指的是玩家+ AI,而不是任何真实的人。我是这样做的,因为我关注内存,因为resources
占用的空间比opinion
,efficiency
或processes
多得多,绝对超过{{1} }}。此代码位于usercount
。此类不是主类,也不包含class Game
方法。此代码不在任何方法内,但它在类中。这里没有错误。
问题在于public static void main(String[] args)
方法,它实际上会引发游戏。 void start(Main home, String save)
监视当前活动的游戏及其变量和对象,并始终处于活动状态。在这里,在启动框架和面板,并生成一个地图(使用方法class Game()
)后,我想填写数组。这是相关的代码:
int[][] generateMap(int size)
标记的位置会生成以下NetBeans IDE 8.1错误:
//DATA VARIABLES
if (save.equals("new")){
//make map
mapSize = 9;//placeholder value - retrieve actual value from settings file later
int mapScale = (int) Math.pow(mapSize, 2);
map = generateMap(mapSize);//9x9 grid
//make users
users.usercount = (int) Math.pow(mapSize / 3, 2);//<--- ERROR HERE
for (int i = 0; i < users.usercount; i++){//<--- ERROR HERE
}
//make trades
trades = new int[triNum(users.usercount - 1)][1][8];//<--- ERROR HERE
for (int[][] trade : trades) {
//fill array with appropriate values
for (int j = 0; j < users.usercount; j++) {//<--- ERROR HERE
for (int k = 0; k < users.usercount; k++) {//<--- ERROR HERE
if (j < k) {
trade[0][0] = j;
trade[1][0] = k;
}
}
}
}
}
同时按Alt和Enter即使没有将鼠标悬停在图标上也只显示错误。按下图标做了一个&#34;不能做&#34; Windows声音(Windows 10)。
根据我的理解,编译器无法从cannot find symbol:
symbol: variable usercount
location: variable users of type Object
----
(Alt-Enter shows hints)
方法访问对象users
。有没有办法让我从公共方法,公共类,公共变量, public中访问对象,在 同一公共 类中制作?
如果没有,你能这么好解释一下:
A)为什么不呢?
B)我没有/错误地理解什么?
C)我能做什么呢?我知道我很可能只是声明这些变量与任何start()
对象分开。但是1)我想用一个名称引用那组变量,并且一个数组会不成比例地占用内存,2)我的问题可能会在以后的不同设置中出现,如果是这样我想知道如何处理它。
我知道我只是一个Java新手,但我尝试使用谷歌搜索,而不是他们帮助我他们在这里没有帮助我。也许我使用的是不正确的搜索字词,但如果是这样,那些条款就已经是一个巨大的帮助了。
感谢您阅读这段文字,如果您愿意帮助我,请多谢一下。
答案 0 :(得分:3)
您在这里使用的方法并不是您想要的正确方法。当您宣布users
时,它就是anonymous class。基本上,它会变成一个带有自动生成名称的完整类声明。
由于Java的类型系统如何工作,如果它们在您用于引用它的引用类型中声明,则只能(直接)访问对象的字段和方法。例如,如果您说Object o = "string"
,则可以使用Object
方法中的任何一种方法,但是您无法调用仅存在于String
上的方法,因为编译器并不知道你所拥有的实际上是String
。
这对您来说是一个问题,因为您无法将对象转换为其实际类型,因为该类本身是匿名的。没有反思,就没有办法让那些领域退出,这使得这个对象实际上没用。
正确的方法是将这些字段直接放入您已声明users
的类中,或者创建一个单独的类来保存这些字段:
class Users {
public int usercount;
public int[][] opinion;
public int[][][] resources;
public int[][] efficiency;
public int[][] processes;
};
然后通过该类名称引用它:
Users users = new Users();
由于您现在已经为该类命名,因此编译器可以安全地知道它的类型以及它包含的字段。
作为旁注,那些阵列仍然很难理解。不要害怕以有用的方式声明对象来表示您的数据。 JVM非常擅长创建和管理对象,而且您尝试实现的性能提升实际上并不重要。更有可能的是,您的程序会让人感到困惑,以至于您最终编写的低效代码会比您只是将其编写为可读的速度慢。