/*
''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''
'' Name: Ali El-Kaafarani ''
'' Project Name: 2 Player FSE.ino ''
'' Date: 10/21/2024 ''
'' Desc: A racing wire game! 2 players ''
'' have to race across a wire ''
'' without touching it at all. if a ''
'' player touchs the wire at all, ''
'' they have to restart from the ''
'' start of the wire. also, there ''
'' is a fairStart mechanic where ''
'' the players are forced to start ''
'' at the exact same time to ''
'' prevent cheating. Have fun! ''
''''''''''''''''''''''''''''''''''''''''''''
''''''''''''''''''''''''''''''''''''''''''''
*/
const byte speaker = A0; // sets the const byte "speaker" to A0
const byte P1Start = 2; // sets the const byte "P1Start" to pin 2
const byte P1Wire = 3; // sets the const byte "P1Wire" to pin speaker
const byte P1Win = 4; // sets the const byte "P1Win" to pin 4
const byte P1StartLED = 8; // sets the const byte "P1StartLED" to pin 8
const byte P1PlayLED = 9; // sets the const byte "P1PlayLED" to pin 9
const byte P1WinLED = 10; // sets the const byte "P1WinLED" to pin 10
byte P1Victory = 0; // sets the byte "P1Victory" to 0
const byte P2Start = 5; // sets the const byte "P2Start" to pin 5
const byte P2Wire = 6; // sets the const byte "P2Wire" to pin 6
const byte P2Win = 7; // sets the const byte "P2Win" to pin 7
const byte P2StartLED = 11; // sets the const byte "P2StartLED" to pin 11
const byte P2PlayLED = 12; // sets the const byte "P2PlayLED" to pin 12
const byte P2WinLED = 13; // sets the const byte "P2WinLED" to pin 1speaker
byte P2Victory = 0; // sets the byte "P2Victory" to 0
byte leaveLoop = 0; // sets the byte "leaveLoop" to 0
void setup() {
// put your setup code here, to run once:
pinMode(speaker, OUTPUT); // sets "speaker" to an output
pinMode(P1Start, INPUT_PULLUP); // sets "P1Start" to an input_pullup
pinMode(P1Wire, INPUT_PULLUP); // sets "P1Wire" to an input_pullup
pinMode(P1Win, INPUT_PULLUP); // sets "P1Win" to an input_pullup
pinMode(P1StartLED, OUTPUT); // sets "P1StartLED" to an output
pinMode(P1PlayLED, OUTPUT); // sets "P1PlayLED" to an output
pinMode(P1WinLED, OUTPUT); // sets "P1WinLED" to an output
pinMode(P2Start, INPUT_PULLUP); // sets "P2Start" to an input_pullup
pinMode(P2Wire, INPUT_PULLUP); // sets "P2Wire" to an input_pullup
pinMode(P2Win, INPUT_PULLUP); // sets "P2Win" to an input_pullup
pinMode(P2StartLED, OUTPUT); // sets "P2StartLED" to an output
pinMode(P2PlayLED, OUTPUT); // sets "P2PlayLED" to an output
pinMode(P2WinLED, OUTPUT); // sets "P2WinLED" to an output
randomSeed(analogRead(0)); // sets up the randomization for later
digitalWrite(P1StartLED, LOW); // turns OFF the repective player LED
digitalWrite(P1PlayLED, LOW); // same as previous
digitalWrite(P1WinLED, LOW); // same as previous
digitalWrite(P2StartLED, LOW); // same as previous
digitalWrite(P2PlayLED, LOW); // same as previous
digitalWrite(P2WinLED, LOW); // same as previous
delay(1000); // wait 1 second
tone(speaker, 700, 1000); // plays a tone from the speaker at 700Hz for 1 second
delay(500); // wait 1 second
tone (speaker, 800, 1000); // plays a tone from the speaker at 800Hz for 1 second
delay (500); // wait 1 second
tone(speaker, 900, 1000); // plays a tone from the speaker at 900Hz for 1 second
fairStart(); // runs the custom function "fairStart"
} // end void setup()
void loop() {
// put your main code here, to run repeatedly:
if (leaveLoop == 0) {
fairStart(); // runs the custon function "fairStart"
} // end if
if ((digitalRead(P1Wire) == LOW) && leaveLoop == 1) {
digitalWrite(P1StartLED, HIGH); // turns P1StartLED on
digitalWrite(P1PlayLED, LOW); // turns P1PlayLED off
digitalWrite(P1WinLED, LOW); // turns P1WinLED off
} // end if
if ((digitalRead(P2Wire) == LOW) && leaveLoop == 1) {
digitalWrite(P2StartLED, HIGH); // turns P2StartLED on
digitalWrite(P2PlayLED, LOW); // turns P2PlayLED off
digitalWrite(P2WinLED, LOW); // turns P2WinLED off
} // end if
if ((digitalRead(P1Start) == LOW) && leaveLoop == 1) {
digitalWrite(P1StartLED, LOW); // turns P1StartLED off
digitalWrite(P1PlayLED, HIGH); // turns P1PlayLED on
digitalWrite(P1WinLED, LOW); // turn P1WinLED off
} // end if
if ((digitalRead(P2Start) == LOW) && leaveLoop == 1) {
digitalWrite(P2StartLED, LOW); // turns P2StartLED off
digitalWrite(P2PlayLED, HIGH); // turns P2PlayLED on
digitalWrite(P2WinLED, LOW); // turns P2WinLED off
} // end if
if ((digitalRead(P1Win) == LOW) && (digitalRead(P1StartLED) == LOW) && leaveLoop == 1) {
digitalWrite(P1StartLED, LOW); // turns P1StartLED off
digitalWrite(P1PlayLED, LOW); // turns P1PlayLED off
digitalWrite(P1WinLED, HIGH); // turns P1WinLED on
leaveLoop = 0; // sets the variable leaveLoop to 0
P1Victory = 1; // same with P1Victory
} // end if
if ((digitalRead(P2Win) == LOW) && (digitalRead(P2StartLED) == LOW) && leaveLoop == 1) {
digitalWrite(P2StartLED, LOW); // turns P2StartLED off
digitalWrite(P2PlayLED, LOW); // turns P2PlayLED off
digitalWrite(P2WinLED, HIGH); // turns P2WinLED on
leaveLoop = 0; // sets the variable leavLoop to 0
P2Victory = 1; // same with P2Victory
} // end if
// the "if" statement below makes the P2's LEDs blink randomly
if (P1Victory == 1) {
victoryMusic(); // runs the custon function "victoryMusic"
while (P1Victory == 1) { // |
analogWrite(P2StartLED, random(1-255)); // |
analogWrite(P2PlayLED, random(1-255)); // |
analogWrite(P2WinLED, random(1-255)); // V
delay (100); // wait 0.1 seconds
} // end while
} // end if
// the "if" statement below makes the P1's LEDs blink randomly
if (P2Victory == 1) {
victoryMusic(); // runs the custon function "victoryMusic"
while (P2Victory == 1) { // |
analogWrite(P1StartLED, random(1-255)); // |
analogWrite(P1PlayLED, random(1-255)); // |
analogWrite(P1WinLED, random(1-255)); // V
delay (100); // wait 0.1 seconds
} // end while
} // end if
} // end void loop()
// VVV below are the custom functions VVV
/*
'''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''
'' Name: fairStart ''
'' Input: NA ''
'' Output: NA ''
'' Desc: forces both players to ''
'' start at the same time, ''
'' making the start of the ''
'' game fair. ''
'''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''
*/
void fairStart() {
do {
if ((digitalRead(P1Start) != 0)) {
digitalWrite(P1StartLED, HIGH); // turns P1StartLED on
} else {
digitalWrite(P1StartLED, LOW); // turns the same LED off
} // end if else statement
if ((digitalRead(P2Start) != 0)) {
digitalWrite(P2StartLED, HIGH); // turns P2StartLED on
} else {
digitalWrite(P2StartLED, LOW); // turns the same LED off
} // end if else statement
if ((digitalRead(P1Start) == LOW) && (digitalRead(P2Start) == LOW)) {
leaveLoop = 1; // sets the variable "leaveLoop" to 1
} // end if statement
} while (leaveLoop == 0); // end do statement
digitalWrite(P1StartLED, LOW); // turns P1StartLED off
digitalWrite(P2StartLED, LOW); // turns P2StartLED off
tone(speaker, 500, 1000); // plays a specific tone from the speaker
delay(500); // wait half a second
tone(speaker, 600, 1000); // plays a specific tone from the speaker
delay(500); // wait half a second
tone(speaker, 1000, 700); // plays a specific tone from the speaker
delay(random(1,5)* 1000); // wait a random time between 1 - 5 seconds
if ((digitalRead(P1Start) == LOW) && (digitalRead(P2Start) == LOW)) {
tone(speaker, 1100, 1000); // plays a specific tone from the speaker
digitalWrite(P1PlayLED, HIGH); // turns P1PlayLED on
digitalWrite(P2PlayLED, HIGH); // same with P2PlayLED
} else {
leaveLoop = 0; // sets the variable "leaveLoop" to 0
tone(speaker, 200, 1000); // plays a specific tone from the speaker
} // end if else statement
} // end void fairStart
/*
'''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''
'' Name: victorySong ''
'' Input: NA ''
'' Output: NA ''
'' Desc: plays the tetris theme ''
'' once someone wins. ''
'''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''
*/
void victoryMusic() {
tone(speaker,659,444);//E5
delay(444);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,659,111);//E5
delay(111);
tone(speaker,587,111);//D5
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,222);//A4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,444);//B4
delay(444);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,880,444);//A5
delay(444);
tone(speaker,784,222);//G5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,659,222);//E5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,444);//B4
delay(444);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,659,111);//E5
delay(111);
tone(speaker,587,111);//D5
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,222);//A4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,444);//B4
delay(444);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,880,444);//A5
delay(444);
tone(speaker,784,222);//G5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,659,222);//E5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,444);//B4
delay(444);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
//Half Notes
tone(speaker,659,888);//E5
delay(888);
tone(speaker,523,888);//C5
delay(888);
tone(speaker,587,888);//D5
delay(888);
tone(speaker,494,888);//B4
delay(888);
tone(speaker,523,888);//C5
delay(888);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,415,888);//Ab/G#4
delay(888);
tone(speaker,494,888);//B4
delay(888);
tone(speaker,659,888);//E5
delay(888);
tone(speaker,523,888);//C5
delay(888);
tone(speaker,587,888);//D5
delay(888);
tone(speaker,494,888);//B4
delay(888);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,880,444);//A5
delay(444);
tone(speaker,880,444);//A5
delay(444);
tone(speaker,831,1776);//Ab/G#5
delay(1776);
//Literally the same things as the intro
tone(speaker,659,444);//E5
delay(444);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,659,111);//E5
delay(111);
tone(speaker,587,111);//D5
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,222);//A4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,30,222);//E4
delay(222);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,880,404);//A5
delay(404);
tone(speaker,880,40);//A5
delay(40);
tone(speaker,784,20);//G5
delay(20);
tone(speaker,784,202);//G5
delay(202);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,659,222);//E5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,30,222);//E4
delay(222);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,659,111);//E5
delay(111);
tone(speaker,587,111);//D5
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,222);//A4
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,30,222);//E4
delay(222);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,880,444);//A5
delay(444);
tone(speaker,784,222);//G5
delay(222);
tone(speaker,698,222);//F5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,659,222);//E5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,587,222);//D5
delay(222);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,494,222);//B4
delay(222);
tone(speaker,30,222);//E4
delay(222);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,494,111);//B4
delay(111);
tone(speaker,523,222);//C5
delay(222);
tone(speaker,587,444);//D5
delay(444);
tone(speaker,659,444);//E5
delay(444);
tone(speaker,523,444);//C5
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,888);//A4
delay(888);
//ending
tone(speaker,30,888);//E4
delay(888);
tone(speaker,261,888);//C4(middle)
delay(888);
tone(speaker,294,888);//D4
delay(888);
tone(speaker,247,888);//Bspeaker
delay(888);
tone(speaker,261,888);//C4(middle)
delay(888);
tone(speaker,220,888);//Aspeaker
delay(888);
tone(speaker,208,888);//Ab/G#speaker
delay(888);
tone(speaker,247,888);//Bspeaker
delay(888);
tone(speaker,3,888);//E4
delay(888);
tone(speaker,261,888);//C4(middle)
delay(888);
tone(speaker,294,888);//D4
delay(888);
tone(speaker,247,888);//Bspeaker
delay(888);
tone(speaker,261,444);//C4(middle)
delay(444);
tone(speaker,30,444);//E4
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,440,444);//A4
delay(444);
tone(speaker,415,1776);//Ab/G#4
delay(7500);
} // end void victorySong