我必须设计一个模拟器来维护一个环境,该环境由排列在任意大小的矩形网格中的补丁集合组成。每个补丁包含零个或多个木片。
一个补丁可能被一个或多个白蚁或捕食者占据,这些白蚁或捕食者是生活在世界内并根据简单规则行为的移动实体。
白蚁可以从它当前所在的地块上拾起木片,或者掉下它携带的木片。白蚁通过从它们当前的补丁随机移动到邻近的补丁,在四个可能的方向中的一个方向上围绕网格移动。新的白蚁可能会从卵中孵化出来,这是通过在环境中随机出现一只新的白蚁来模拟的。
捕食者的移动方式与白蚁相似,如果捕食者移动到白蚁占据的地块上,那么捕食者就会吃掉白蚁。
在初始化时,白蚁、捕食者和木屑随机分布在环境中。然后,模拟在循环中进行,并在每次迭代中获得环境的新状态。
我已经使用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 }发布于 2011-01-12 08:50:30
一句忠告:忘记UI和Swing,直到你的底层模型完美运行。如果你能让你的模型与纯文本驱动的界面一起工作,你一定会有很好的MVC分离。实际上,您使用该模型的困难与您的Java/Swing问题混淆了。
Java是一种面向对象的语言: Termite、Predator、Wood、Egg、Board等类在哪里?将所需的行为封装在对象中不是更好吗?在担心显示问题之前,您不希望能够模拟规则驱动的世界的行为吗?
你做的这些都错了。
发布于 2011-01-12 08:51:07
尽量避免使用面板来表示数据,我建议使用二维数组来表示数据,并创建一个函数来获取两个参数,来自Panel的Graphics对象和二维数组。
要获得二维数组,请执行类似于int[][] board = new int[rows][cols]的操作
发布于 2011-01-12 08:47:39
看起来你已经有了一个网格,如果我没理解错的话,你想知道如何生成随机坐标。你可能会使用下面这样的东西:
int xcoord行(Math.random()*=Math.floor);
int ycoord = Math.floor(Math.random()*Cols);
这将得到你的随机坐标;你将不得不重复这个过程,直到你落在一个空白的地方。
https://stackoverflow.com/questions/4664309
复制相似问题