首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于java的白蚁菌落模拟器

基于java的白蚁菌落模拟器
EN

Stack Overflow用户
提问于 2011-01-12 08:40:16
回答 3查看 451关注 0票数 0

我必须设计一个模拟器来维护一个环境,该环境由排列在任意大小的矩形网格中的补丁集合组成。每个补丁包含零个或多个木片。

一个补丁可能被一个或多个白蚁或捕食者占据,这些白蚁或捕食者是生活在世界内并根据简单规则行为的移动实体。

白蚁可以从它当前所在的地块上拾起木片,或者掉下它携带的木片。白蚁通过从它们当前的补丁随机移动到邻近的补丁,在四个可能的方向中的一个方向上围绕网格移动。新的白蚁可能会从卵中孵化出来,这是通过在环境中随机出现一只新的白蚁来模拟的。

捕食者的移动方式与白蚁相似,如果捕食者移动到白蚁占据的地块上,那么捕食者就会吃掉白蚁。

在初始化时,白蚁、捕食者和木屑随机分布在环境中。然后,模拟在循环中进行,并在每次迭代中获得环境的新状态。

我已经使用JPanel设计了竞技场,但我不能在竞技场中随机放置木头、白蚁和捕食者。有谁能帮我吗?

我的竞技场代码如下:

代码语言:javascript
复制
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 }
EN

回答 3

Stack Overflow用户

发布于 2011-01-12 08:50:30

一句忠告:忘记UI和Swing,直到你的底层模型完美运行。如果你能让你的模型与纯文本驱动的界面一起工作,你一定会有很好的MVC分离。实际上,您使用该模型的困难与您的Java/Swing问题混淆了。

Java是一种面向对象的语言: Termite、Predator、Wood、Egg、Board等类在哪里?将所需的行为封装在对象中不是更好吗?在担心显示问题之前,您不希望能够模拟规则驱动的世界的行为吗?

你做的这些都错了。

票数 4
EN

Stack Overflow用户

发布于 2011-01-12 08:51:07

尽量避免使用面板来表示数据,我建议使用二维数组来表示数据,并创建一个函数来获取两个参数,来自PanelGraphics对象和二维数组。

要获得二维数组,请执行类似于int[][] board = new int[rows][cols]的操作

票数 1
EN

Stack Overflow用户

发布于 2011-01-12 08:47:39

看起来你已经有了一个网格,如果我没理解错的话,你想知道如何生成随机坐标。你可能会使用下面这样的东西:

int xcoord行(Math.random()*=Math.floor);

int ycoord = Math.floor(Math.random()*Cols);

这将得到你的随机坐标;你将不得不重复这个过程,直到你落在一个空白的地方。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4664309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档