////////////////////////////// |
// Global Variables // |
////////////////////////////// |
private Game game = new Game(); |
private Question question = new Question(); |
private Answer[] answers = new Answer[3]; |
// Coordinates for where to draw the buttons |
private static final int[] buttonXCoords = {40, 240, 440}; |
// Limits for generating the random numbers in the questions |
private static final int[] limits = {1, 301}; |
// To store the coordinates of the mouse when clicked |
private float[] mouseCoordsOnClick = new float[2]; |
// Flag for whether we need a new question for the user |
private boolean newQuestion = true; |
// Flag for whether the game has been started |
private boolean gameStarted = false; |
// Flag for winning or losing the game |
private int gameWon = 0; |
// Create new object for the class Cars |
private Cars cars = new Cars(); |
///////////////////////////// |
// Setup method // |
///////////////////////////// |
void setup(){ |
frameRate(30); |
size(600, 600); |
smooth(); |
// Initialise the Answer objects |
for(int i=0; i<3; i++){ |
answers[i] = new Answer(); |
// Set each answer box's x-coordinate |
answers[i].setXCoord(buttonXCoords[i]); |
} |
} |
////////////////////////////// |
// Main draw method // |
////////////////////////////// |
void draw(){ |
// Draw background |
fill(255); |
rect(0, 0, width, 250); |
// If the button has been pressed to start the game |
if(gameStarted == true){ |
// Game lost |
if(gameWon==1){ |
fill(0); |
textSize(35); |
text("YOU LOST!", 215, 200); |
} |
else if(gameWon==2){ |
fill(0); |
textSize(35); |
text("YOU WON!", 215, 200); |
} |
if(gameWon==0){ |
// If a new question is needed (user answered) |
if(newQuestion == true){ |
// No new questions until the user has answered |
newQuestion = false; |
// Draw background |
fill(255); |
rect(0, 250, width, 350); |
// New question! |
game.newQuestion(); |
} |
cars.moveCars(); |
cars.drawCars(); |
cars.checkWin(); |
} |
} |
else{ |
fill(0); |
rect(200, 200, 200, 100); |
fill(255); |
textSize(25); |
text("Start Game", 235, 255); |
} |
} |
////////////////////////////// |
// Game class // |
////////////////////////////// |
class Game{ |
// Constructor |
public void Game(){ |
} |
// Sets up and initiates the Question and Answer classes, |
// creating a new question and answer selection for the user |
public void newQuestion(){ |
int rand=0; |
// Draw a new question to the screen |
question.drawQuestion(); |
// Reset the 'correct' answer box |
for(int i=0; i<3; i++){ |
answers[i].setCorrect(false); |
} |
// Randomly designate an answer box as the 'correct' one |
answers[int(random(0, 3))].setCorrect(true); |
for(int i=0; i<3; i++){ |
if(answers[i].isCorrect()==true){ |
// Give the 'correct' answer box the value of the answer that was worked out earlier |
answers[i].setValue(question.getAnswer()); |
} |
else{ |
// Give the two other answer boxes random numbers in the possible range |
do{ |
rand = int(random(-149, 301)); |
} while(rand==question.getAnswer()); |
answers[i].setValue(int(random(-149, 301))); |
} |
// Draw the box that the answer sits in |
answers[i].drawButton(); |
// Draw the answer text in the box |
answers[i].drawText(); |
} |
} |
} |
////////////////////////////// |
// Question class // |
////////////////////////////// |
class Question{ |
private int num1; |
private int num2; |
private int operator; |
private int answer; |
private String questionString; |
// For use in building questionString |
private final String[] operators = {"+", "-", "*", "/"}; |
// Constructor |
public void Question(){ |
} |
// Used by drawQuestion to build a question to display to the |
// user and set fields we'll need later such as the answer |
private void createQuestion(){ |
// Create the two random numbers |
num1 = int(random(limits[0], limits[1])); |
num2 = int(random(limits[0], limits[1])); |
// Select a random operator (multiplication and division aren't used) |
int opSelect = int(random(0, 2)); |
switch(opSelect){ |
case 0: |
answer = num1 + num2; |
break; |
case 1: |
answer = num1 - num2; |
break; |
case 2: // Unused |
answer = num1 * num2; |
break; |
case 3: // Unused |
answer = num1 / num2; |
break; |
} |
// Build the question string we want to display to the user |
questionString = num1 + " " + operators[opSelect] + " " + num2 + " = ?"; |
} |
// Create and display the question string to the user |
public void drawQuestion(){ |
createQuestion(); |
fill(0); |
textSize(30); |
text(questionString, 175, 300); |
} |
// Used for returning the correct answer to the random question |
public int getAnswer(){ |
return answer; |
} |
// Use the mouse coordinates stored by the mouseclicked event handler |
// and the known coordinates of the answer boxes to find which answer |
// the user actually clicked on, returns -1 if no box was clicked. |
public int getAnswerChoice(){ |
// For simplicity |
float x = mouseCoordsOnClick[0]; |
float y = mouseCoordsOnClick[1]; |
if((y>=475) && (y<=550)){ // Check if mouse is on the right level (y-coordinates) |
if((x>=40) && (x<=165)){ // Leftmost box |
//print("First answer\n"); |
return 0; |
} |
else if((x>=240) && (x<=365)){ // Middle box |
//print("Second answer\n"); |
return 1; |
} |
else if((x>=440) && (x<=565)){ // Rightmost box |
//print("Third answer\n"); |
return 2; |
} |
else{ |
return -1; |
} |
} |
else{ |
return -1; |
} |
} |
// Check if the user's answer pick was the correct one |
public void checkAnswer(){ |
int choice = getAnswerChoice(); |
// A return value of -1 indicates that the user |
// did not click within any of the answer boxes |
if(choice==-1){ |
print("Not a button\n"); |
return; |
} |
else if(answers[choice].isCorrect()==true){ |
print("Correct answer\n"); |
cars.speedUp(); |
} |
else if(answers[0].isCorrect()==false){ |
print("Wrong answer\n"); |
cars.slowDown(); |
} |
// Set the flag to start a new question |
newQuestion = true; |
} |
} |
////////////////////////////// |
// Answer class // |
////////////////////////////// |
class Answer{ |
// X-coordinate of the box to draw |
private int xCoord; |
// Value of the answer to display |
private int value = 0; |
// Whether this answer box is the 'correct' one |
private boolean correct = false; |
// Constructor |
public void Answer(){ |
} |
// Draw the box in which the answer text sits |
public void drawButton(){ |
fill(0); |
rect(xCoord, 475, 125, 75); |
} |
// Draw the text onto the box |
public void drawText(){ |
fill(255); |
text(value, xCoord+35, 525); |
} |
// Mutator for the x-coordinate |
public void setXCoord(int newXCoord){ |
xCoord = newXCoord; |
} |
// Mutator for the answer value |
public void setValue(int newValue){ |
value = newValue; |
} |
// Accessor for the answer value |
public int getValue(){ |
return value; |
} |
// Mutator for the 'correct answer box' boolean |
public void setCorrect(boolean isCorrect){ |
correct = isCorrect; |
} |
// Accessor for the 'correct answer box' boolean |
public boolean isCorrect(){ |
return correct; |
} |
} |
////////////////////////////// |
// Cars Class // |
////////////////////////////// |
class Cars{ |
float car1speed; |
float car2speed; |
float x1; |
float x2; |
boolean value; |
boolean correct; |
boolean win; |
//Initialise Variables |
public Cars(){ |
x1 = 0; |
x2 = 0; |
} |
public void drawCars(){ |
//Draw two cars |
fill(#FF0000); |
rect(x1, 120, 50, 20); |
fill(#03FF04); |
rect(x2, 180, 50, 20); |
// To indicate that the green car is the player's |
fill(0); |
textSize(13); |
text("Player", x2+10, 195); |
} |
public void moveCars(){ |
x1 += 0.4; |
x2 += 0.25; |
} |
public void speedUp(){ |
x2 += 15; |
} |
public void slowDown(){ |
x2 -= 25; |
} |
public void checkWin(){ |
if(x1>=550){ |
gameWon=1; |
} |
else if(x2>=550){ |
gameWon=2; |
} |
} |
} |
//////////////////////////////// |
// Mouseclick event handler // |
//////////////////////////////// |
void mouseClicked(){ |
// Store the mouse's current coordinates |
// for use in another method |
if(gameStarted==true){ |
mouseCoordsOnClick[0] = mouseX; |
mouseCoordsOnClick[1] = mouseY; |
question.checkAnswer(); |
} |
else{ |
if(mouseX>200 && mouseX<400 && mouseY>200 && mouseY<300){ |
gameStarted = true; |
} |
} |
} |