Update:
The project is moving along well. We have most of the visuals working, the Arduino (bomb) connecting with Processing and reading/writing data, and about half of the game phases have been made. This has allowed us to do some play testing. We are moving along well despite some external circumstances.
Arduino/Processing Communication:
Arduino and Processing have to be constantly communicating within our game. Now every cycle Processing is writing to Arduino which LED’s to turn on, as well if to turn on the buzzer or now. Arduino responds with various inputs including the pressing of each button and the values of the distance meter and the potentiometer. By letting Processing handle the logic of which LEDs to turn on this allows the more powerful CPU of the computer to take the brunt of the calculations while the smaller Arduino processes will not be overwhelmed.
Game:
Following the instructions we posted last week, we have also began coding the game to be producing random outputs to Arduino and awaiting specific feedback from a user. The outputs have to be random so that the game is different each time, but controlled enough that we know what the possibilities could be and make sure the player can respond appropriately with what they are seeing.
To do so I coded a class which will contain functions for each phase of the game. Each phase will initially set some variables that are random generated, and then proceed to process inputs and compare them to these variables. Each function then decides if the user has passed this phase or if they have set the bomb off.
class GameStage {
//Manage flow of game
int gameStage; //Which instruction set is the player on?
boolean pass; //Has the user passed the stage?
boolean failed; //Has the bomb been set off
//Timers used for flashing
long timerStart;
int flashLength;
//Which stages have been set up
boolean stageTwoSetup = false;
boolean stageThreeSetup = false;
//Stage 2 variables
int numberOfLights;
boolean flashing[] = {false, false, false, false};
boolean onOff;
//Stage 3 variables
int order[] = {-1, -1, -1, -1}; //Order LEDs flash
boolean buttonsPressed[] = {false, false, false, false};
int orderIndex; //Which button should be pressed (on 0th button, 1st, 2nd, or 3rd)
boolean buttonUsed = false; //Used to determine if a button is being pressed
//Default constructor
GameStage() {
gameStage = 2;
}
int runGame() {
if (gameStage == 2) {
return stageTwo();
}
if (gameStage == 3) {
return stageThree();
}
return -1;
}
//Blink lights until the user moves the potentiometer to the right zone
int stageTwo() {
//If first time on stage
if (!stageTwoSetup) {
numberOfLights = int(random(4)+1); //Set how many lights are flashing
timerStart = millis();
flashLength = 500;
onOff = false;
stageTwoSetup = true;
//Set which lights will flash
for (int i = 0; i < numberOfLights; i++) {
int randomIndex = int(random(4)); //Set random lights to blink
while (flashing[randomIndex] == true) {
randomIndex = (randomIndex + 1)%4; //Advance until there is an index set to false
}
flashing[randomIndex] = true;
}
}
//Flash lights if needed
if (millis() - flashLength > timerStart) {
onOff = !onOff;
timerStart = millis();
for (int i = 0; i < 4; i++) {
if (onOff) {
lights[i] = flashing[i];
} else {
lights[i] = false;
}
}
}
//Check for a user input
if (numberOfLights == 1) {
if (potentiometer >= 512 && potentiometer < 777) {
//In yellow
gameStage++;
}
} else if (numberOfLights == 2) {
if (potentiometer >= 0 && potentiometer < 256) {
//In red
gameStage++;
}
} else if (numberOfLights == 3) {
if (potentiometer >= 256 && potentiometer < 512) {
//In orange
gameStage++;
}
} else if (numberOfLights == 4) {
if (potentiometer >= 777 && potentiometer < 1024) {
//In green
gameStage++;
}
}
return gameStage;
}
//Remeber the LED pattern, push the buttons in the same order
int stageThree() {
//Setup stage three
if (!stageThreeSetup) {
//Choose order of LEDS
for (int i = 0; i < 4; i++) {
//Chose random index to put light in order
int randomIndex = int(random(4));
while (order[randomIndex] != -1) {
randomIndex = (randomIndex + 1) % 4;
}
order[randomIndex] = i; //Asign light randomly in order
}
//Set timers
timerStart = millis();
orderIndex = 0;
stageThreeSetup = true;
}
for (int i = 0; i < 4; i++) {
print(buttonPressed[i] + ", " );
}
println();
//Flash lights in order//If timer if 0 - 199ms
if (millis() - timerStart < 400) {
lights[order[0]] = true;
lights[order[1]] = false;
lights[order[2]] = false;
lights[order[3]] = false;
}
//If timer is 200-399ms
else if (millis() - timerStart < 800) {
lights[order[0]] = false;
lights[order[1]] = true;
lights[order[2]] = false;
lights[order[3]] = false;
}
//If timer is 400-599ms
else if (millis() - timerStart < 1200) {
lights[order[0]] = false;
lights[order[1]] = false;
lights[order[2]] = true;
lights[order[3]] = false;
}
//If timer is 600-799ms
else if (millis() - timerStart < 1600) {
lights[order[0]] = false;
lights[order[1]] = false;
lights[order[2]] = false;
lights[order[3]] = true;
}
//If timer is below 1200
else if (millis() - timerStart < 3000) {
lights[order[0]] = false;
lights[order[1]] = false;
lights[order[2]] = false;
lights[order[3]] = false;
} else {
timerStart = millis();
}
//Look for user input
//Look to see if no buttons are being pressed
if (buttonUsed) {
boolean tempNotUsed = true;
for (int i = 0; i< 4; i++) {
if (buttonDown[i] == 1) {
tempNotUsed = false;
}
}
if (tempNotUsed) {
buttonUsed = false;
}
}
//If no buttons are being pressed, look for one to be pressed, otherwise wait for them to be released before being used again
if (!buttonUsed) {
//Yellow button pressed
if (buttonDown[0] == 1) {
buttonUsed = true;
//Check to see if the next button in the order is also a 0
if (order[orderIndex] == 0) {
orderIndex++;
}
//Wrong order
else {
fail = true;
}
}
//Green button pressed
else if (buttonDown[1] == 1) {
buttonUsed = true;
//Check to see if the next button in the order is also a 1
if (order[orderIndex] == 1) {
orderIndex++;
}
//Wrong order
else {
fail = true;
}
}
//Red button pressed
else if (buttonDown[2] == 1) {
buttonUsed = true;
//Check to see if the next button in the order is also a 2
if (order[orderIndex] == 2) {
orderIndex++;
}
//Wrong order
else {
fail = true;
}
}
//Blue button pressed
else if (buttonDown[3] == 1) {
buttonUsed = true;
//Check to see if the next button in the order is also a 3
if (order[orderIndex] == 3) {
orderIndex++;
}
//Wrong order
else {
fail = true;
}
}
//Completed
if (orderIndex == 4) {
gameStage++;
}
}
return gameStage;
}
}
User Demo:
Here is an example of an early play test where I run through two of the stages of our game, but accidentally don’t follow the order of LED’s and set the bomb off!
Looks cool!