我必须设计一个维护环境的模拟器,它由一系列以任意大小的矩形网格排列的补丁组成。每个贴片包含零个或多个木片。
补丁可能被一个或多个白蚁或捕食者占据,这些白蚁或捕食者是生活在世界范围内并按照简单规则行事的移动实体。
TERMITE可以从当前所在的贴片中拾取木片,或者放下它携带的木片。白蚁通过从当前补丁随机移动到相邻的补丁,在四个可能的方向之一中围绕网格行进。新的白蚁可能会从卵中孵化出来,这可以通过环境中随机斑块上新白蚁的出现来模拟。
PREDATOR以类似于白蚁的方式移动,如果捕食者移动到一个补丁上 被白蚁占据,然后捕食者吃白蚁。
初始化时,白蚁,捕食者和木屑在环境中随机分布。然后,模拟在循环中进行,并且在每次迭代时获得环境的新状态。
我使用JPanel设计了竞技场但我无法在该竞技场中随机放置木头,白蚁和捕食者。任何人都可以帮助我吗?
竞技场的代码如下:
01 import java.awt.*;
02 import javax.swing.*;
03
04 public class Arena extends JPanel
05 {
06 private static final int Rows = 8;
07 private static final int Cols = 8;
08 public void paint(Graphics g)
09 {
10 Dimension d = this.getSize();
11 // don't draw both sets of squares, when you can draw one
12
// fill in the entire thing with one color
13
g.setColor(Color.WHITE);
14
// make the background
15
g.fillRect(0,0,d.width,d.height);
16
// draw only black
17
g.setColor(Color.BLACK);
18
// pick a square size based on the smallest dimension
19
int sqsize = ((d.width<d.height) ? d.width/Cols : d.height/Rows);
20
// loop for rows
21
for (int row=0; row<Rows; row++)
22
{
23 int y = row*sqsize; // y stays same for entire row, set here
24 int x = (row%2)*sqsize; // x starts at 0 or one square in
25 for (int i=0; i<Cols/2; i++)
26 {
27 // you will only be drawing half the squares per row
28 // draw square
29 g.fillRect(x,y,sqsize,sqsize);
30 // move two square sizes over
31 x += sqsize*2;
32 }
33 }
34
35 }
36
37
38
39 public void update(Graphics g) { paint(g); }
40
41
42
43 public static void main (String[] args)
44 {
45
46 JFrame frame = new JFrame("Arena");
47 frame.setSize(600,400);
48 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
49 frame.setContentPane(new Arena());
50 frame.setVisible(true);
51 }
52
53 }
答案 0 :(得分:4)
建议:忘记UI和Swing,直到底层模型完美运行。如果您可以使用纯文本驱动的界面使您的模型工作,您将确保具有良好的MVC分离。事实上,您对模型的困难与Java / Swing问题相混淆。
Java是一种面向对象的语言:白蚁,捕食者,木头,蛋,棋盘等类在哪里?在封装对象内部所需的行为时,你会不会更好?在担心显示问题之前,您不希望能够模拟规则驱动世界的行为吗?
你说这一切都错了。
答案 1 :(得分:1)
尽量避免使用面板来表示数据,我建议使用二维数组来表示数据,然后创建一个获得2个参数的函数,来自Graphics
的{{1}}对象和二维数组。
获取二维数组,执行Panel
答案 2 :(得分:0)
看起来你已经有了一个网格,如果我理解正确,你想知道如何产生随机坐标。你可能会使用类似的东西:
int xcoord = Math.floor(Math.random()* Rows);
int ycoord = Math.floor(Math.random()* Cols);
这将获得您的随机坐标;你必须重复这个,直到你降落在空旷的地方。