Your browser does not support the canvas tag.

previous        Show / Hide Source        Download        next
//Hungry Square
//By Alexander Massart
/////////////////////////
//P.S everything is called snake because i was going to use arrayLists to make a snake, changed to a square later
///Define any global variables
int score;
String snakeDir;
int sideLen;
float snakeX, snakeY, snakeRed, snakeGreen, snakeBlue;
float foodX, foodY, foodRed, foodGreen, foodBlue;
int timer;
int fade;
float foodAmount;
//Only define at top to allow for reset button DONT SET
void setup() {
  //Setup all the variables values and the size of the screen
  //GIVE VARIABLES VALUES
  size(400, 400);
  frameRate(14);
  rectMode(CENTER);
  textAlign(CENTER, CENTER);
  score = 0;
  sideLen = 20;
  snakeSetup();
  foodReset();
  //7 real seconds for the timer not 7 frames
  timer = int(frameRate * 7);
  fade = 255;
  foodAmount = 100;
  print("WASD to move, Run into the Circles, Dont let your hunger bar empty\n");
}
void draw() {
  rectMode(CENTER);
  background(255-foodRed, 255-foodGreen, 255-foodBlue);
  noStroke();
  //draw persistent things
  drawGrid();
  drawScenery();
  drawFoodBar();
  drawScore();
  //setup if statment to manage game over
  if (foodAmount > 0) {
    //Calls the drawing functions that wont draw after game over
    rectMode(CENTER);
    foodDisplay();
    snakeDisplay();
    //Call movement
    snakeMove();
    //Check collision
    checkHit();
    //Timer to manage drawing the title
    if (timer > 0) {
      drawIntro();
    }
  } else {
    //Gameover
    gameOver();
  }
}
void keyPressed() {
  //using the char for both the capital and lowercase letters i can check if the user pressed W A S D
  //inside the if statements set the direction of the movement
  if (key == 'w' || key == 'W') {
    snakeDir = "up";
  }
  if (key == 's' || key == 'S') {
    snakeDir = "down";
  }
  if (key == 'a' || key == 'A') {
    snakeDir = "left";
  }
  if (key == 'd' || key == 'D') {
    snakeDir = "right";
  }
  if (foodAmount <= 0 && (key == 'r' || key == 'R')) {
    //run setup to reset the playstate
    setup();
  }
}

void drawGrid() {
  //Draw grid pattern
  for (int i = 0; i < 19; i ++) {
    //loop twice to move horizantal and vertical
    for (int k = 0; k < 19; k ++) {
      //Use foodRed, Green, Blue so that it can change
      fill(foodRed, foodGreen, foodBlue);
      //Offset the position based on i and k and 50
      rect(i * 25, k * 50 + (i%2) * 25, 25, 25);
    }
  }
}
void drawScore() {
  rectMode(CENTER);
  fill(255);
  textSize(25);
  //draw score text, add an int to a string makes it into a string, YAY
  text("Score = " + score, width - 90, height - 35);
  rectMode(CORNER);
}
void gameOver() {
  //What draws when there is a game over
  fill(0, 0, 0); 
  textSize(41); 
  text( "Game Over", width/2, 30);
  fill(255, 255, 255); 
  textSize(40); 
  text( "Game Over", width/2, 30);
}
void drawIntro() {
  //drawing the title and setting up the fade effect
  fill(0, 0, 0, fade); 
  textSize(41); 
  text( "Hungry Square", width/2, 30); 
  fill(0, 0, 0, fade); 
  textSize(20.5); 
  text( "By: Alexander Massart", width/2, 60); 
  fill(255, 255, 255, fade); 
  textSize(40); 
  text( "Hungry Square", width/2, 30); 
  fill(255, 255, 255, fade); 
  textSize(20); 
  text( "By: Alexander Massart", width/2, 60);
  timer --;
  fade -= 10;
}
void drawScenery() {
  //draw the carpets
  rectMode(CORNER);
  fill(124, 2, 152);
  rect(0, 0, 75, height);
  rect(width-75, 0, 75, height);
  rect(0, 0, width, 75);
  rect(0, height - 75, width, 75);
  fill(142, 0, 175);
  rect(13, 20, 50, height - 75);
  rect(width-63, 20, 50, height-75);
  rect(13, 13, width - 26, 50);
  rect(13, height - 63, width - 26, 50);
}

void drawFoodBar() {
  //draw the food bar that changes based on foodAmount
  fill(255);
  textSize(20);
  text("Hunger Meter", 70, height - 40);
  fill(203, 165, 66);
  rectMode(CORNER);
  rect(0, height - 15, foodAmount, 15);
  foodAmount --;
}

void snakeSetup() {
  //sets the variables for the square/snake
  snakeDir = "right";
  snakeX = width/2;
  snakeY = height/2;
  snakeRed = random(256);
  snakeGreen = random(256);
  snakeBlue  = random(256);
}
void snakeDisplay() {
  //draws the square based on position
  stroke(0);
  strokeWeight(1);
  fill(snakeRed, snakeGreen, snakeBlue);
  rect(snakeX, snakeY, sideLen, sideLen);
}
void snakeMove() {
  //The actual movement of the square based upon the directions set in keyPressed
  if (snakeDir == "left") {
    snakeX -= sideLen;
  }
  if (snakeDir == "right") {
    snakeX += sideLen;
  }
  if (snakeDir == "up") {
    snakeY -= sideLen;
  }
  if (snakeDir == "down") {
    snakeY += sideLen;
  }
  //Looping code
  //By adding the width/height and getting the remainder from moding the value by width/height you guarentee 
  //that the square is in the screen
  snakeX = (snakeX + width) % width;
  snakeY = (snakeY + height) % height;
}
void checkHit() {
  //check if snake hits food
  //Distance between food and snake is less than the side length
  //only works for perfect circles and squares
  if (dist(foodX, foodY, snakeX, snakeY) < sideLen) {
    //add to score, food amount and reset the food position
    foodReset();
    foodAmount += 10;
    score += 1;
    if (dist(foodX, foodY, snakeX, snakeY) < sideLen + 100) {
      //reset the position again if the position of the food is too close
      foodReset();
    }
  }
}
void foodReset() {
  //Changes the color and position of the food
  foodX = random(50, width - 100);
  foodY = random(50, height - 100);
  foodRed = random(256);
  foodGreen = random(256);
  foodBlue = random(256);
}
void foodDisplay() {
  //draws the food
  stroke(0);
  strokeWeight(2);
  fill(foodRed, foodGreen, foodBlue);
  ellipse(foodX, foodY, sideLen, sideLen);
}