[JAVA] Implementieren Sie das Boxball-System mit Processing

Umfassender Mathematik-Adventskalender 2017 der Meiji-Universität hat ebenfalls eine Woche überschritten. Es ist lang. ..

In diesem Artikel wird das Boxball-System, das in Letztes Mal "Über das Boxball-System" angezeigt wurde, von Processing implementiert. Finden Sie die Bewegungsgleichung (weil es keinen Spaß macht, sie zu implementieren) und versuchen Sie, sie mithilfe zu implementieren.

Bewegungsgleichung des Boxballsystems

Um das Boxballsystem zu implementieren, muss zunächst die zeitliche Entwicklung des Boxballsystems erfolgen Muss gefragt werden.

Überdenken Sie das Boxball-System als binäre CA, in der $ u_n ^ t $ den Wert $ 0,1 $ annimmt. box-ball2_3.016.jpeg box-ball2_3.017.jpeg

Wenn die Anzahl der Bälle auf der linken Seite nicht abnimmt, Gemäß der Boxball-Regel (von links nach rechts zur nächsten leeren Box rechts gehen) Das nächste Mal wird es definitiv $ 0 $ sein. box-ball2_3.018.jpeg box-ball2_3.019.jpeg box-ball2_3.020.jpeg Dies ist die kinetische Gleichung des Boxballsystems. (Es kann endlich implementiert werden.)

Implementierung des Boxball-Systems

In der Verarbeitung implementiert.

Besteht aus der Hauptkörper- und Box-Klasse. (Es ist eine verschwenderische Berechnung, aber ist es okay?)

Code ([GitHub](https://github.com/massss/box-and-ball))

Main


final int boxSize = 40;
final int num = 25;

int Width = num * boxSize;
boolean isRunning = false;
Box[] boxes = new Box[num];
int[] tempBoxes = new int[num];

int t = 0;
int delay = 50;
int framerate;

void settings() {
  size(Width, boxSize + 50);
}

void setup() {
  background(255);
  for (int i = 0; i < num; i++) {
    boxes[i] = new Box(i, 0);
  }
}

void draw() {
  background(255);
  if (t % delay == 0) {
    framerate = (int)frameRate;
    if (isRunning) {
      for (int i = 0; i < num; i++) {
        tempBoxes[i] = boxes[i].ball;
      }
      for (int i = 0; i < num; i++) {
        boxes[i].calcState();
      }
    }
    t = 0;
  }
  t++;
  for (int i = 0; i < num; i++) {
    boxes[i].display();
  }

  fill(250, 0, 0);
  textAlign(LEFT);
  textSize(30);
  if (isRunning) {
    text("Run", 0, height - 10);
  } else {
    text("Stop", 0, height - 10);
  }
  textAlign(RIGHT);
  textSize(18);
  text("frameRate: " + framerate +" / " + delay, width - 10, height - 10);
}

void mouseClicked() {
  int cellColumn = (int)(mouseX / boxSize);
  if (cellColumn < boxes.length) {
    boxes[cellColumn].changeState();
  }
}

void mouseDragged() {
  int cellColumn = (int)(mouseX / boxSize);
  if (0 < mouseX && mouseX < Width && 0 < mouseY && mouseY < boxSize) {
    boxes[cellColumn].changeState();
  }
}

void keyReleased() {
  if (key == ' ') {
    isRunning = !isRunning;
  } else if (key == 'r' || key == 'R') {
    randomSetup();
  } else if (key == 'c' || key == 'C') {
    setup();
  } else if (keyCode == UP) {
    if (delay != 100) {
      delay += 10;
    }
  } else if (keyCode == DOWN) {
    if (delay != 10) {
      delay -= 10;
    }
  } else if (keyCode == ENTER) {
    printInfo();
  }
}

void randomSetup() {
  for (int i = 0; i < num; i++) {
    float coinSpeed = random(1);
    int coin;
    if (coinSpeed > 0.8) {
      coin = 1;
    } else {
      coin = 0;
    }
    boxes[i].ball = coin;
  }
}

void printInfo() {
  for (int i = 0; i < num; i++) {
    if (i == num - 1) {
      println(boxes[i].ball);
    } else {
      print(boxes[i].ball + ", ");
    }
  }
}

BoxClass


class Box {
  int pos;
  int num;
  int ball;

  Box (int num, int ball) {
    this.pos = num * boxSize;
    this.num = num;
    this.ball = ball;
  }
  
  void changeState() {
    if (ball == 1) {
      this.ball = 0;
    }else {
      this.ball = 1;
    }
  }
  
  void calcState() {
    int countPast = 0;
    int countNext = 0;
    for (int i = 0; i < this.num; i++) {
      if (boxes[i].ball == 1) {
        countNext++;
      }
      if (tempBoxes[i] == 1) {
        countPast++;
      }
    }
    this.ball = min(countPast - countNext, 1 - this.ball);
  }

  void display() {
    fill(255);
    rect(pos, 0, boxSize, boxSize);
    fill(0);
    if (ball == 1) {
      ellipse(pos + boxSize / 2, boxSize / 2, boxSize * 2/3, boxSize * 2/3);
    }
  }
}

Command

Key or mouse Processing
click add or remove ball
drag
r, R setup balls randomly
c, C clear all balls
up delay rate
down delay rate
space run or stop
ENTER print data in console

Sample hakodama-1.gif

hakodama-2.gif

Recommended Posts

Implementieren Sie das Boxball-System mit Processing
Bildverarbeitung: Spielen wir mit dem Bild
Überprüfen Sie den Verarbeitungsinhalt mit [Rails] Binding.pry
Verwenden Sie die Mac-Menüleiste mit Processing 3-Apps
Weihnachten mit Verarbeitung
Implementieren Sie iOS14 UICollectionView mit dem minimal erforderlichen Code.
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
Hinter dem 10-Jahres-System
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Implementieren Sie dieselbe Funktion wie das C, C ++ - System ("cls") in Java