[JAVA] Implémentez le système de box ball avec Processing

Calendrier de l'avent 2017 de mathématiques complètes de l'Université Meiji a également dépassé une semaine. C'est long. ..

Dans cet article, le système de box ball apparu dans Dernière fois "À propos du système de box ball" est implémenté par Processing. Trouvez l'équation du mouvement (car ce n'est pas amusant de l'implémenter) et essayez de l'implémenter en l'utilisant.

Équation de mouvement du système de balle box

Pour mettre en œuvre le système de box ball, d'abord comment le développement temporel du système de box ball Besoin d'être demandé.

Reconsidérez le système box ball comme une CA binaire dans laquelle $ u_n ^ t $ prend la valeur de 0,1 $. box-ball2_3.016.jpeg box-ball2_3.017.jpeg

Si le nombre de balles sur le côté gauche ne diminue pas, Selon la règle de la balle de la boîte (de gauche à droite, déplacez-vous vers la boîte vide la plus proche à droite) Ce sera certainement 0 $ la prochaine fois. box-ball2_3.018.jpeg box-ball2_3.019.jpeg box-ball2_3.020.jpeg C'est l'équation cinétique du système box ball. (Il peut enfin être implémenté.)

Implémentation du système Box Ball

Implémenté en traitement.

Se compose du corps principal et de la classe Box. (C'est un calcul inutile, mais est-ce que ça va?)

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

Implémentez le système de box ball avec Processing
Traitement d'image: jouons avec l'image
Vérifiez le contenu du traitement avec [rails] binding.pry
Utilisez la barre de menus Mac avec les applications Processing 3
Noël avec traitement
Implémentez iOS14 UICollectionView avec le code minimum requis.
Contrôlez le flux de traitement Spring Batch avec JavaConfig.
Derrière le système de 10 ans
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
Implémenter la même fonction que C, système C ++ ("cls"); en Java