# RNG Based Cellular Automata Cave Generation Platformer

**URL:** https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626
**Category:** Gallery
**Created:** [October 15, 2020, 10:42pm UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626 "2020-10-15T22:42:25Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![Aoyanco](https://avatars.discourse-cdn.com/v4/letter/a/22d042/32.png) [@Aoyanco](https://discourse.processing.org/u/Aoyanco)
#### Post date: [October 15, 2020, 10:42pm UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626/1 "2020-10-15T22:42:26Z")

</div>

```auto
//int areaCounter=0;
//int[][] caves;
int cols;
int rows;
int bias=42;
int[][] grid;
int[][] finalGrid;
int onGroundTimer=1000000000;
boolean isColliding;
int onGround=1;
boolean switch1;
boolean wasd=true;
boolean isLeft, isRight, isUp, isDown;
float x;
float y;
int unit;
int c;
float yVel=0;
float xVel=0;
boolean gravity=true;
int[] endingBlackValues;
boolean doneWithSimulation=false;

void setup() {
  fullScreen();
  unit=width/50;
  x=width/2;
  y=height/2;
  x=400;
  y=200;
  cols = width/20;
  rows = height/20;
  grid = new int[cols][rows];
  finalGrid = new int[cols][rows];
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      grid[i][j] = int(random(100));
      if(grid[i][j]<bias)grid[i][j]=0;
      if(grid[i][j]>=bias)grid[i][j]=1;
    }
  }
}
void draw() {
  if(yVel<-20)yVel=-20;
  println("x: "+x);
  println("y: "+y);
  println(c);
  c+=1;
  smooth();
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      
      stroke(grid[i][j]*256);
      textSize(4);
      rectMode(CENTER);
      fill(grid[i][j]*256,127);
      rect(20*i,20*j,20,20);
      rectMode(CORNER);      
    }
  } 
  
  onGroundTimer-=1;
  if(onGroundTimer>0)onGround=2;
  y=y-yVel/3.0;
  x=x+xVel/3.0;
  if(y>height-15)y=height-15;
  if(y==height-15)yVel=-yVel*.30;
  if(isLeft && isRight)xVel=xVel*0.8;
  if(!(isRight && isLeft)){
   if (isLeft && abs(xVel)<3){
     if(xVel<-0.1)xVel=xVel*1.1;
     if(xVel>0.1)xVel=xVel-0.5;
    if(xVel<0.1 && xVel>-0.1)xVel=0.2;
   }  
   if (isRight && abs(xVel)<3){
    if(xVel>0.1)xVel=xVel*1.1;
    if(xVel<-0.1)xVel=xVel+0.5;
    if(xVel<0.1 && xVel>-0.1)xVel=0.2;
   }
  }
  if(isUp && onGround>1)yVel=12;
  if(isUp && onGround>0)onGround=onGround-1;
  if (!isRight && !isLeft)xVel=xVel*0.8;
  
  //Gravity
  if(gravity){
    if(yVel>0.1)yVel=yVel*0.95-0.06;
    if(yVel<0.1)yVel=-abs(yVel*1.05-0.06);
  } 
  
  
  
  
  //Buttons
  fill(255,127);
  rect(20, 20, 50, 30);
  fill(0,127);
  textSize(unit/2);
  text("close", 45, 35);
  
  
  
  
  //Key Indacator
  fill(255);
  rect(unit/4,height-2.75*unit,3.25*unit,2.5*unit);
  //W or Up
  fill(128,127);
  if(isUp)fill(255,127);
  rect(unit*3/2.0,height-7.0/4*unit,unit*3.0/4,unit/2.0);
  
  //A or Left
  fill(128,127);
  if(isLeft)fill(255,127);
  rect(unit/2.0,height-unit,unit*3.0/4,unit/2.0);
  
  //S or Down
  fill(128,127);
  if(isDown)fill(255,127);
  rect(unit*3/2.0,height-unit,unit*3.0/4,unit/2.0);
  
  //D or Right
  fill(128,127);
  if(isRight)fill(255,127);  
  rect(unit*5/2.0,height-unit,unit*3.0/4,unit/2.0);
  
  //WASD and arrow keys switcher
  textSize(unit/3);
  textAlign(CENTER, CENTER);
  fill(0);
  if(!switch1)text("WASD Mode",unit*1.875,height-8.875/4*unit);
  if(switch1)text("Arrow Keys Mode",unit*1.875,height-8.875/4*unit);
  fill(256);
  rect(unit/2.0,height-10.0/4*unit,unit*2.75,unit/2.0);
  
  noStroke();
  fill(255,10);
  rect(0,0,width,height);
  fill(255,0,0);
  rectMode(CENTER);
  
  rect(x,y+6,3,3);
  if(!isDown)rect(x,y,3,9);
  rectMode(CORNER);
  
}
 
void mousePressed() {
  if (mouseX >= unit*0.5 && mouseX < unit*3.25 && mouseY >= height-2.5*unit && mouseY < height-2*unit) {
      if(switch1==true)switch1=false;
      else if(switch1==false)switch1=true;
  }
  if (mouseX >= 20 && mouseX < 70 && mouseY >= 20 && mouseY < 50) {
      exit();
  }
}

void keyPressed() {
  if(!switch1)setMove(key, true);
  if(switch1)setMove(keyCode, true);
}
 
void keyReleased() {
  if(!switch1)setMove(key, false);
  if(switch1)setMove(keyCode, false);
}
boolean setMove(int k, boolean b) {
  switch (k) {
  case 'w':
    return isUp = b;
  case UP:
    return isUp = b;
  case 's':
    return isDown = b;
  case DOWN:
    return isDown = b;
  case 'a':
    return isLeft = b;
  case LEFT:
    return isLeft = b;
  case 'd':
    return isRight = b;
  case RIGHT:
    return isRight = b;
  default:
    return b;
  }
}
void rectCollisions(int rectX,int rectY,int side){
 rect(rectX, rectY, side, side);
 collision(rectX, rectY, side);
  
}
void collision(int squareX, int squareY, int sideLength){
  if(x-squareX*x-squareX+y-squareY*y-squareY<50){
    rectMode(CENTER); 
    if(x<squareX+sideLength/2+3&&x>squareX-sideLength/2-3&&y<squareY+sideLength/2+9&&y>squareY-sideLength/2-9){
      if(abs(squareX-x)<abs(squareY-y)){
        if(y-squareY<0)y=squareY-sideLength/2-9; //top
        if(y-squareY<0)yVel=0; //top
        if(y-squareY<0)onGroundTimer=25;
        if(y-squareY>0)y=squareY+sideLength/2+9; //top
        if(y-squareY>0)yVel=0; //bottom
      }
      if(abs(squareX-x)>abs(squareY-y)){
        if(x-squareX<0)xVel=0; //left
        if(x-squareX<0)x=x-1; //left
        if(x-squareX>0)xVel=0; //right
        if(x-squareX>0)x=x+1; //right
      }
    }
    rectMode(CORNER);
  }
}

int numberOfNeighbors(int gridX, int gridY){
  int c=0;
  for (int i = gridX-1; i < gridX+2; i++) {
    for (int j = gridY-1; j < gridY+2; j++) {
      if(j!=-1 && i!=-1 && i!=cols && j!=rows){
        if(grid[i][j]==0){
          if(!(i==gridX && j==gridY)){
            c=c+1;
          }
        }
      }else{
       c=c+1;    
      }
    }
  }
  return(c);
}
void smooth(){
  fill(255);
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      
      if(numberOfNeighbors(i,j)<4)finalGrid[i][j]=1;
      if(numberOfNeighbors(i,j)>6)finalGrid[i][j]=0;
      stroke(finalGrid[i][j]*256,127);
      rectMode(CENTER);
      fill(finalGrid[i][j]*256,127);
      rect(20*i,20*j,20,20);   
      if(grid[i][j]==0 && numberOfNeighbors(i,j)!=8)rectCollisions(20*i,20*j,20);   
    }
  }
  if(finalGrid==grid && doneWithSimulation==false){
    for (int i = 0; i < cols; i++) {
      for (int j = 0; j < rows; j++) {
        if(grid[i][j]==0){
          
        }
      }
    }   
  doneWithSimulation=true;
  }
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      grid[i][j]=finalGrid[i][j];
    }
  }
}

```

---

<div class="post-metadata">

### Author: ![noel](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/noel/32/213_2.png) [@noel](https://discourse.processing.org/u/noel)
#### Post date: [October 16, 2020, 11:09am UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626/2 "2020-10-16T11:09:57Z")

</div>

The screen is displayed, but when using the keys in both modes, a small red line moves only a little bit up and down, nothing more.

---

<div class="post-metadata">

### Author: ![Aoyanco](https://avatars.discourse-cdn.com/v4/letter/a/22d042/32.png) [@Aoyanco](https://discourse.processing.org/u/Aoyanco)
#### Post date: [October 16, 2020, 12:45pm UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626/3 "2020-10-16T12:45:59Z")

</div>

I don’t think i understand what you’re saying. The “little red line” can move with WASD or ARROW mode with the switcher at bottom left

---

<div class="post-metadata">

### Author: ![noel](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/noel/32/213_2.png) [@noel](https://discourse.processing.org/u/noel)
#### Post date: [October 16, 2020, 1:01pm UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626/4 "2020-10-16T13:01:00Z")

</div>

Only slowly up and down, not to the right or left.

---

<div class="post-metadata">

### Author: ![Aoyanco](https://avatars.discourse-cdn.com/v4/letter/a/22d042/32.png) [@Aoyanco](https://discourse.processing.org/u/Aoyanco)
#### Post date: [October 16, 2020, 1:55pm UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626/5 "2020-10-16T13:55:59Z")

</div>

Try using A or D. You need to hold them down, not press them quickly

---

<div class="post-metadata">

### Author: ![noel](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/noel/32/213_2.png) [@noel](https://discourse.processing.org/u/noel)
#### Post date: [October 16, 2020, 2:56pm UTC](https://discourse.processing.org/t/rng-based-cellular-automata-cave-generation-platformer/24626/6 "2020-10-16T14:56:49Z")

</div>

I hold them down but It’s just really really slow. Maybe it’s my computer.
