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.
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 $.
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. C'est l'équation cinétique du système box ball. (Il peut enfin être implémenté.)
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?)
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
Recommended Posts