/*Use arrow keys to move paddle. //<>//
Hit the ball into the orange carrot to gain points (you lose points if you hit the purple carrot).
If you fail to hit the ball, the game resets.
Reach 31 points to win & click on heart to play again. */
//intialize variables//
float borderW, borderH;
float paddleX, paddleY, paddleW, paddleH, paddleSX, paddleSY;
float ballX, ballY, ballW, ballH, ballSX, ballSY;
float carrotX, carrotY, carrotW, carrotH, carrotNX, carrotNY, carrotNW, carrotNH;
float score;
int bubbleColor, heartPink, mainPink, darkPink, midPink, lightPink, orange, green, purple, negGreen, orangeOne, orangeTwo, orangeThree;
boolean padLeft, padRight, padUp, padDown;
boolean playAgain;
//set window size and variables//
void setup() {
//set window size
size(400, 400);
//set all colors for game
bubbleColor = color(250, 144, 172, 150);
heartPink = color (255, 0, 0, 150);
mainPink = color(247, 140, 165);
darkPink = color(222, 150, 169);
midPink = color(232, 176, 191);
lightPink = color(240, 198, 208);
orange = color(242, 177, 108);
green = color(134, 206, 133);
purple = color(174, 127, 193);
negGreen = color(104, 178, 164);
orangeOne = color(215, 149, 79);
orangeTwo = color(229, 172, 111);
orangeThree = color(215, 152, 85);
//set dimensions for L&R borders
borderW = 25;
borderH = height;
//set initial location, dimensions & speed for the paddle
paddleX = width/2;
paddleY = 80;
paddleW = 96;
paddleH = 10;
paddleSX = 5;
paddleSY = 2;
//set initial location, dimensions & speed for the ball
ballX = width/2;
ballY = height/2;
ballW = 25;
ballH = 25;
ballSX = 2;
ballSY = 5;
//set dimensions for token box & randomize location
carrotX = random(borderW+carrotW/2+10, width-borderW-carrotW/2-10);
carrotY = random(height/4+carrotH/2+10, height-carrotH/2-10);
carrotW = 30;
carrotH = 30;
//set dimensions for token box (bad carrot) & randomize location
carrotNX = random(borderW+carrotW/2+10, width-borderW-carrotW/2-10);
carrotNY = random(height/4+carrotH/2+10, height-carrotH/2-10);
carrotNW = 30;
carrotNH = 30;
//set initial score for game
score = 0;
}
//call all functions
void draw() {
background(lightPink);
println(score);
carrot();
negCarrot();
borders();
bunny();
paddle();
ball();
ballReset();
carrotScore();
scoreMark();
circlePrint();
//create reset menu when player gets to 31 points
if (playAgain == true) {
resetMenu();
}
}
//draw borders and background objects for game
void borders() {
rectMode(CENTER);
noStroke();
//draw mid square
fill(midPink);
rect(width/2, 50, width, 100);
//draw top square
fill(darkPink);
rect(width/2, 25, width, 50);
//left border
fill(255);
strokeWeight(2);
stroke(mainPink);
rect(borderW/2, borderH/2, borderW, borderH);
//right border
rect(width-borderW/2, borderH/2, borderW, borderH);
//create outline for entire window
fill(0, 0, 0, 0);
rect(width/2, height/2, width, height);
}
//draw bunny character for paddle
void bunny() {
rectMode(CORNERS);
fill(255);
noStroke();
//head and ears
rect(paddleX-paddleW/4, paddleY-35, paddleX+paddleW/4, paddleY, 15);
rect(paddleX-paddleW/6, paddleY-55, paddleX-paddleW/15, paddleY, 20);
rect(paddleX+paddleW/6, paddleY-55, paddleX+paddleW/15, paddleY, 20);
//eyes
stroke(0);
strokeWeight(5);
point(paddleX - paddleW/8, paddleY-20);
point(paddleX + paddleW/8, paddleY-20);
//muzzle
stroke(120);
strokeWeight(.5);
line(paddleX-paddleW/30, paddleY-12, paddleX+paddleW/30, paddleY-15);
line(paddleX+paddleW/30, paddleY-12, paddleX-paddleW/30, paddleY-15);
//blush
noStroke();
fill(lightPink);
ellipse(paddleX-paddleW/6, paddleY-13, 6, 4);
ellipse(paddleX+paddleW/6, paddleY-13, 6, 4);
}
//draw paddle (includes movement and constraints)
void paddle() {
rectMode(CENTER);
fill(mainPink);
noStroke();
//draw paddle
rect(paddleX, paddleY, paddleW, paddleH);
//move paddle using keypad
if (padLeft) {
paddleX = paddleX - paddleSX;
}
if (padRight) {
paddleX = paddleX + paddleSX;
}
if (padUp) {
paddleY = paddleY - paddleSY;
}
if (padDown) {
paddleY = paddleY + paddleSY;
}
//restrict paddle from moving outside of playing field
if (paddleX - paddleW/2 - borderW < 0) {
paddleX = paddleX + paddleSX;
}
if (paddleX + paddleW/2 + borderW > width) {
paddleX = paddleX - paddleSX;
}
if (paddleY + paddleH/2 > 100) {
paddleY = paddleY - paddleSY;
}
if (paddleY - paddleH/2 < 50) {
paddleY = paddleY + paddleSY;
}
}
//draw ball (includes movement + restrictions + reaction to contact with paddle)
void ball() {
ellipseMode(CENTER);
fill(255);
noStroke();
//ball
ellipse(ballX, ballY, ballW, ballH);
//create heart icon
fill(mainPink);
quad(ballX, ballY, ballX+5, ballY-8, ballX+10, ballY, ballX, ballY+11);
quad(ballX, ballY, ballX-5, ballY-8, ballX-10, ballY, ballX, ballY+11);
//create ball movement
ballX = ballX + ballSX;
ballY = ballY + ballSY;
//create bounderies for ball on X and Y axis; ball will move in opposite direction if it makes contact
if (ballX + ballW/2 > width-borderW || ballX - ballH/2 < borderW) {
ballSX = ballSX*-1;
}
if (ballY + ballH/2 > height || ballY - ballH/2 < 0) {
ballSY = ballSY*-1;
}
//ball will change directions if it touches the paddle
if (ballY - ballH/2 < paddleY + paddleH/2 && ballX < paddleX + paddleW/2 && ballX > paddleX - paddleW/2) {
if (ballSY < 0) {
ballSY = -ballSY;
}
}
}
//create game reset if ball falls behind paddle (paddle resets, tokens randomize, score turns to zero)
void ballReset() {
if (ballY-ballH < paddleY-paddleH-30) {
//delay(1500);
ballX = width/2;
ballY = 3*height/4;
paddleX = width/2;
carrotX = random(borderW+carrotW/2+10, width-borderW-carrotW/2-10);
carrotY = random(height/4+carrotH/2+10, height-carrotH/2-10);
score = 0;
}
}
//draw hit box and carrot token
void carrot() {
rectMode(CENTER);
fill(252, 227, 235);
noStroke();
//hit box
rect(carrotX, carrotY, carrotW, carrotH);
//draw carrot
fill(green);
triangle(carrotX+2, carrotY+3, carrotX+3, carrotY-15, carrotX+10, carrotY-10);
triangle(carrotX+14, carrotY, carrotX, carrotY, carrotX+14, carrotY-10);
fill(orange);
triangle(carrotX-15, carrotY+15, carrotX+10, carrotY+5, carrotX-2, carrotY-10);
}
//draw the bad carrot token
void negCarrot() {
if (score>25) {
rectMode(CENTER);
fill(0);
//hit box
rect(carrotNX, carrotNY, carrotNW, carrotNH);
//draw bad carrot
fill(negGreen);
triangle(carrotNX-2, carrotNY+3, carrotNX-3, carrotNY-15, carrotNX-10, carrotNY-10);
triangle(carrotNX-14, carrotNY, carrotNX, carrotNY, carrotNX-14, carrotNY-10);
fill(purple);
triangle(carrotNX+15, carrotNY+15, carrotNX-10, carrotNY+5, carrotNX+2, carrotNY-10);
}
}
//create ability to gain and lose points depending on whether ball touches good or bad token
void carrotScore() {
//touches good token, adds to score when touched
if ((ballX > carrotX-carrotW/2 && ballX < carrotX+carrotW/2 && ballY > carrotY-carrotH/2 && ballY < carrotY + carrotH/2)
|| (ballX + ballW/2> carrotX-carrotW/2 && ballX + ballW/2 < carrotX+carrotW/2 && ballY > carrotY-carrotH/2 && ballY < carrotY + carrotH/2)
|| (ballX - ballW/2> carrotX-carrotW/2 && ballX - ballW/2 < carrotX+carrotW/2 && ballY > carrotY-carrotH/2 && ballY < carrotY + carrotH/2)
|| (ballX > carrotX-carrotW/2 && ballX < carrotX+carrotW/2 && ballY+ballH/2 > carrotY-carrotH/2 && ballY+ballH/2 < carrotY + carrotH/2)
|| (ballX + ballW/2> carrotX-carrotW/2 && ballX + ballW/2 < carrotX+carrotW/2 && ballY-ballH/2 > carrotY-carrotH/2 && ballY-ballH/2 < carrotY + carrotH/2)) {
score = score+1;
carrotX = random(borderW+carrotW/2+10, width-borderW-carrotW/2-10);
carrotY = random(height/4+carrotH/2+10, height-carrotH/2-10);
}
//bad token appears when over 25, subtracts from score when touched
if (score > 25) {
if ((ballX > carrotNX-carrotNW/2 && ballX < carrotNX+carrotNW/2 && ballY > carrotNY-carrotNH/2 && ballY < carrotNY + carrotNH/2)
|| (ballX + ballW/2> carrotNX-carrotNW/2 && ballX + ballW/2 < carrotNX+carrotNW/2 && ballY > carrotNY-carrotNH/2 && ballY < carrotNY + carrotNH/2)
|| (ballX - ballW/2> carrotNX-carrotNW/2 && ballX - ballW/2 < carrotNX+carrotNW/2 && ballY > carrotNY-carrotNH/2 && ballY < carrotNY + carrotNH/2)
|| (ballX > carrotNX-carrotNW/2 && ballX < carrotNX+carrotNW/2 && ballY+ballH/2 > carrotNY-carrotNH/2 && ballY+ballH/2 < carrotNY + carrotNH/2)
|| (ballX + ballW/2> carrotNX-carrotNW/2 && ballX + ballW/2 < carrotNX+carrotNW/2 && ballY-ballH/2 > carrotNY-carrotNH/2 && ballY-ballH/2 < carrotNY + carrotNH/2)) {
score = score - 1;
carrotNX = random(borderW+carrotW/2+10, width-borderW-carrotW/2-10);
carrotNY = random(height/4+carrotH/2+10, height-carrotH/2-10);
}
}
//create true and false statement for reset menu, dependant on player's score
if (score>30) {
playAgain = true;
ballSX = 0;
ballSY = 0;
}
if (score<30) {
playAgain = false;
}
}
//create leftward marks for score; each point = one circle
void scoreMark() {
fill(bubbleColor);
int circle = 25;
while ((circle < 25+25*score) && (circle < 400)) {
ellipse(borderW/2, circle, 25, 25);
circle = circle + 25;
}
//create rightward marks for score; each point = one circle
if (score > 15) {
fill(bubbleColor);
int circleR = 25;
while (circleR < 25 + (score-15)*25) {
ellipse(width-borderW/2, circleR, 25, 25);
circleR = circleR + 25;
}
}
}
//draw print on borders using loop
void circlePrint() {
strokeWeight(1);
stroke(247, 140, 165);
fill(0, 0, 0, 0);
int circle = 0;
while (circle<height+50) {
ellipse(borderW/2, circle, 25, 25);
ellipse(width-borderW/2, circle, 25, 25);
circle = circle + 25;
}
}
void resetMenu() {
background(lightPink);
noStroke();
//draw carrots
//greenery
fill(green);
quad(0, 250, 0, 300, 70, 300, 70, 250);
triangle(0, 300, 70, 300, 50, 320);
quad(10, 220, 10, 250, 90, 250, 90, 220);
triangle(10, 220, 60, 220, 40, 210);
quad(60, 220, 80, 210, 120, 250, 80, 270);
quad(70, 240, 90, 280, 80, 290, 70, 280);
quad(380, 290, 380, 300, 390, 300, 390, 290);
quad(390, 290, 390, 300, 400, 320, 400, 260);
quad(330, 140, 330, 180, 380, 140, 360, 120);
quad(330, 180, 380, 140, 400, 140, 400, 260);
triangle(370, 220, 370, 250, 400, 260);
quad(340, 220, 360, 210, 370, 220, 350, 230);
//back
fill(orangeOne);
triangle(100, 350, 310, 210, 360, 280);
quad(310, 210, 340, 215, 360, 240, 360, 280);
//middle
fill(orangeTwo);
triangle(60, 320, 365, 270, 360, 340);
quad(365, 270, 360, 340, 390, 320, 380, 280);
//left
fill(orangeThree);
triangle(65, 335, 125, 250, 320, 355);
quad(65, 335, 125, 250, 100, 270, 75, 295);
//draw bunny
fill(255);
quad(240, 260, 240, 360, 270, 330, 260, 260);
quad(200, 240, 180, 360, 130, 340, 140, 280);
triangle(200, 240, 140, 280, 170, 240);
quad(200, 240, 240, 240, 240, 360, 180, 360);
triangle(240, 250, 240, 260, 260, 260);
quad(190, 240, 260, 260, 280, 250, 300, 220);
quad(190, 240, 300, 220, 160, 190, 160, 220);
quad(160, 190, 300, 220, 300, 170, 200, 160);
triangle(200, 160, 300, 170, 240, 150);
quad(210, 120, 230, 90, 240, 110, 230, 160);
quad(230, 90, 210, 120, 180, 130, 140, 120);
//right ear
quad(310, 90, 300, 170, 290, 180, 280, 120);
fill(245);
//left foot
quad(120, 270, 120, 360, 100, 310, 100, 290);
quad(120, 270, 120, 360, 130, 360, 140, 300);
//right foot
quad(180, 295, 180, 380, 160, 320, 170, 290);
quad(180, 295, 180, 380, 200, 370, 190, 300);
//left paw
triangle(160, 250, 160, 280, 190, 260);
quad(160, 250, 160, 280, 140, 280, 140, 260);
//right paw
quad(240, 280, 240, 320, 205, 310, 200, 290);
quad(240, 280, 240, 320, 260, 320, 260, 310);
//right ear
quad(280, 100, 260, 150, 290, 140, 310, 90);
triangle(280, 100, 260, 150, 250, 130);
//eyes
fill(0);
ellipse(200, 190, 10, 10);
ellipse(260, 210, 10, 10);
//mouth
stroke(0);
strokeWeight(.5);
line(225, 212, 215, 218);
line(215, 210, 225, 220);
//draw bubble and point
fill(255);
ellipseMode(CENTER);
noStroke();
ellipse(100, 130, 80, 100);
quad(110, 170, 150, 190, 140, 180, 130, 160);
//draw heart - if mouse hovers over bubble, heart turns red
if (mouseX < 140 && mouseX > 60 && mouseY<180 && mouseY>80) {
fill(heartPink);
} else fill(mainPink);
triangle(100, 125, 130, 135, 100, 165);
quad(100, 125, 130, 135, 130, 105, 105, 110);
triangle(100, 125, 100, 165, 70, 135);
quad(100, 125, 70, 135, 70, 105, 95, 110);
}
//initialize controls for the paddle
void keyPressed() {
if (keyCode == LEFT) {
padLeft = true;
}
if (keyCode == RIGHT) {
padRight = true;
}
if (keyCode == UP) {
padUp = true;
}
if (keyCode == DOWN) {
padDown = true;
}
}
//initialize controls for the paddle
void keyReleased() {
if (keyCode == LEFT) {
padLeft = false;
}
if (keyCode == RIGHT) {
padRight = false;
}
if (keyCode == UP) {
padUp = false;
}
if (keyCode == DOWN) {
padDown = false;
}
}
//reset game by clicking on bubble after reaching reset menu
void mouseClicked() {
if ((mouseX < 140 && mouseX > 60 && mouseY<180 && mouseY>80) && (score>30)) {
ballX = width/2;
ballY = 3*height/4;
paddleX = width/2;
carrotX = random(borderW+carrotW/2+10, width-borderW-carrotW/2-10);
carrotY = random(height/4+carrotH/2+10, height-carrotH/2-10);
score = 0;
ballSX = 2;
ballSY = 5;
}
}