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!