⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spore2.pde

📁 This is processing for java examples.
💻 PDE
字号:
/** * Spore 2  * by Mike Davis.  *  * A short program for alife experiments. Click in the window to restart.  * Each cell is represented by a pixel on the display as well as an entry in * the array 'cells'. Each cell has a run() method, which performs actions * based on the cell's surroundings.  Cells run one at a time (to avoid conflicts * like wanting to move to the same space) and in random order.  */ World w;int maxcells = 8000;int numcells;Cell[] cells = new Cell[maxcells];color spore1, spore2, spore3, spore4;color black = color(0, 0, 0);// set lower for smoother animation, higher for faster simulationint runs_per_loop = 10000;void setup(){  size(640, 200, P2D);  frameRate(24);  clearscr();  w = new World();  spore1 = color(128, 172, 255);  spore2 = color(64, 128, 255);  spore3 = color(255, 128, 172);  spore4 = color(255, 64, 128);  numcells = 0;  seed();}void seed(){  // Add cells at random places  for (int i = 0; i < maxcells; i++)  {    int cX = int(random(width));    int cY = int(random(height));    int c;    float r = random(1);    if (r < 0.25) c = spore1;    else if (r < 0.5) c = spore2;    else if (r < 0.75) c = spore3;    else c = spore4;    if (w.getpix(cX, cY) == black)    {      w.setpix(cX, cY, c);      cells[numcells] = new Cell(cX, cY);      numcells++;    }  }}void draw(){  // Run cells in random order  for (int i = 0; i < runs_per_loop; i++) {    int selected = min((int)random(numcells), numcells - 1);    cells[selected].run();  }}void clearscr(){  for (int y = 0; y < height; y++) {    for (int x = 0; x < width; x++) {      set(x, y, color(0));    }  }}class Cell{  int x, y;  Cell(int xin, int yin)  {    x = xin;    y = yin;  }  // Perform action based on surroundings  void run()  {    // Fix cell coordinates    while(x < 0) {      x+=width;    }    while(x > width - 1) {      x-=width;    }    while(y < 0) {      y+=height;    }    while(y > height - 1) {      y-=height;    }    // Cell instructions    int myColor = w.getpix(x, y);    if (myColor == spore1) {      if (w.getpix(x - 1, y + 1) == black && w.getpix(x + 1, y + 1) == black && w.getpix(x, y + 1) == black) move(0, 1);      else if (w.getpix(x - 1, y) == spore2 && w.getpix(x - 1, y - 1) != black) move(0, -1);      else if (w.getpix(x - 1, y) == spore2 && w.getpix(x - 1, y - 1) == black) move(-1, -1);      else if (w.getpix(x + 1, y) == spore1 && w.getpix(x + 1, y - 1) != black) move(0, -1);      else if (w.getpix(x + 1, y) == spore1 && w.getpix(x + 1, y - 1) == black) move(1, -1);      else move((int)random(3) - 1, 0);    } else if (myColor == spore2) {      if (w.getpix(x - 1, y + 1) == black && w.getpix(x + 1, y + 1) == black && w.getpix(x, y + 1) == black) move(0, 1);      else if (w.getpix(x + 1, y) == spore1 && w.getpix(x + 1, y - 1) != black) move(0, -1);      else if (w.getpix(x + 1, y) == spore1 && w.getpix(x + 1, y - 1) == black) move(1, -1);      else if (w.getpix(x - 1, y) == spore2 && w.getpix(x - 1, y - 1) != black) move(0, -1);      else if (w.getpix(x - 1, y) == spore2 && w.getpix(x - 1, y - 1) == black) move(-1, -1);      else move((int)random(3) - 1, 0);    }    else if (myColor == spore3)    {      if (w.getpix(x - 1, y - 1) == black && w.getpix(x + 1, y - 1) == black && w.getpix(x, y - 1) == black) move(0, -1);      else if (w.getpix(x - 1, y) == spore4 && w.getpix(x - 1, y + 1) != black) move(0, 1);      else if (w.getpix(x - 1, y) == spore4 && w.getpix(x - 1, y + 1) == black) move(-1, 1);      else if (w.getpix(x + 1, y) == spore3 && w.getpix(x + 1, y + 1) != black) move(0, 1);      else if (w.getpix(x + 1, y) == spore3 && w.getpix(x + 1, y + 1) == black) move(1, 1);      else move((int)random(3) - 1, 0);    }    else if (myColor == spore4)    {      if (w.getpix(x - 1, y - 1) == black && w.getpix(x + 1, y - 1) == black && w.getpix(x, y - 1) == black) move(0, -1);      else if (w.getpix(x + 1, y) == spore3 && w.getpix(x + 1, y + 1) != black) move(0, 1);      else if (w.getpix(x + 1, y) == spore3 && w.getpix(x + 1, y + 1) == black) move(1, 1);      else if (w.getpix(x - 1, y) == spore4 && w.getpix(x - 1, y + 1) != black) move(0, 1);      else if (w.getpix(x - 1, y) == spore4 && w.getpix(x - 1, y + 1) == black) move(-1, 1);      else move((int)random(3) - 1, 0);    }  }    // Will move the cell (dx, dy) units if that space is empty  void move(int dx, int dy) {    if (w.getpix(x + dx, y + dy) == black) {      w.setpix(x + dx, y + dy, w.getpix(x, y));      w.setpix(x, y, color(0));      x += dx;      y += dy;    }  }}//  The World class simply provides two functions, get and set, which access the//  display in the same way as getPixel and setPixel.  The only difference is that//  the World class's get and set do screen wraparound ("toroidal coordinates").class World{  void setpix(int x, int y, int c) {    while(x < 0) x+=width;    while(x > width - 1) x-=width;    while(y < 0) y+=height;    while(y > height - 1) y-=height;    set(x, y, c);  }    color getpix(int x, int y) {    while(x < 0) x+=width;    while(x > width - 1) x-=width;    while(y < 0) y+=height;    while(y > height - 1) y-=height;    return get(x, y);  }}void mousePressed(){  setup();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -