Midterm Project – BAMBOO🎋

A. BAMBOO – Ting&Cassandra – Prof. Andy Garcia 

B. CONTEXT AND SIGNIFICANCE

a.  Previous Research Inspiration

In the previous research, I read Chris Crawford’s article, “The Art of Interactive Design: A Euphonious and Illuminating Guide to Building Successful Software.” In this article, Chris defined interaction, as “a cyclic process in which two actors alternately listen, think, and speak”. Besides, I found a project that fits my imagination of an interactive project, which is Narratron, an interactive projector with a storytelling AI. It allows the audience to decide the story’s role and the storytelling’s pace. The project gives the participants the experience of being a significant role in this artwork from beginning to end. Then, it can inspire the participants’ feelings and opinions on this project.

These inspired my own definition of interactivity. I believe that interaction is reciprocal and cyclic. Action (input) and Reaction (output) need to both exist in an interactive project. The project should at first lead the users to form their own ideas about how to operate it. Then, the project can be operated and give a reaction to the action, which arouses users to think and take the next step again. The uniqueness of my project may be the reaction to every action and many implied hints. Players need to think about what to do next by noticing and thinking about the hints.

b. Recreation

We recreate the maze game in a new form. Our contribution to its development is that we combine this maze game with room escape elements. We need to complete the certain tasks to gain the passcode, get the bamboo (key), and give it to Nezuko (door). 

c. Target audience

Everyone can be my project intended for, but definitely, my project is of special value to the fans of “Demon Slayer”. We kept the setting of the characters and part of the plots in this animation. Players can play the role of the main character, Tanjiro. Because I am also a big fan of this animation, I would love to try everything about it and feel excited about the interaction I can have with this animation. Therefore, based on my imagination, almost all the fans will love it. In addition, it is also a challenging game for everyone and I hope it can attract people to watch this animation and love it.

C. CONCEPTION AND DESIGN

a. Conception

Here is our brainstorming sheet about the midterm project as follows.

We finally picked “Demon Slayer” as our theme and maze as our main form of the game. Players need to get the bamboo, which is the key of the puzzle. On their way to Nezuko, they have to power up themselves to beat the demon and get the passcode to open the barrier to get the bamboo.

b. Design and Mechanism

Here is the drawing I did in the proposal and the mechanism ideas during the building process..

c. Interaction

We first want our game to be a game of two players. One plays the main character and the other plays the bad demon to stop the first player. Therefore, we chose the speed game using two buttons. However, in this case, it’s unfair for the players. The bad demon player can only experience this speed game while the main character player can experience the whole maze, so later, we deleted this speed game and changed the game to a one-player game.

For better experience of interaction, we added a lot of figures poping up and beeping sounds after the players finish the tasks. 

d. Form, Material or Elements

MAGNETs!!! They are the soul of the mechanism in our game.

Here are the materials we used.

M/M jumper cables xn;

Flexible cables xn;

Magnet switch x3; 

Servo x5;

Magnet x18;

10k Ohm Resister x3;

Breadboard x2;

Arduino Uno x1;

220 Ohm Resister x1;

Potentiometer x1;

LED x1;

Buzzer x1;

Temperature sensor x1;

D. FABRICATION AND PRODUCTION

I did the circuit, the code, the handle stick, and half of the decorations.

And Cassandra built the main cardboard prototype and half of the decorations. She used the hot glue gun super well!!! and made a perfect maze!!

a. Cardboard

     • Prototype

I took some thinner cardboards in the trash cart. After we got the big cardboards, I drew the maze on it and Cassandra made the barriers and stuck them on it with hot glue.

I made the player figure with magnets underneath.

I took the tenon and mortise joint as a reference to make the stick more stable inside without the hot glue. Then, I used hot glue to fill the gap between the cardboard to make it firm.

The first image is the one we used for user testing. It turned out that it was too low that users were easily blocked by the messy cables. Therefore, We heightened the cardboard.

I made this little sword and this bad demon with cardboard, copper paper and tape.

I decorated the potentiometer with little arrow and the sticker.

       

This is the final decoration. I printed out the pattern and Cassandra glued it on the surface of the project. I decorated the front surface and added the instructions.     

b. Circuit

First day: I borrowed a bunch of sensors and the magnet switch to test their feasibility in my project.

Second day: It was the circuit with only button switches and the buzzer.

(~MESSY~)

Third day: The circuit was mostly done.

Fourth day: We cut the flexible cables and lengthened the cables of the servos, so that the players won’t be blocked by the cables.

Fifth day: A bunch of cables…

Sixth and seventh day: I spent two hours to reassemble the cables and make it tidy and stable with tapes. And I added more equipments (servos x3, LED x1) these two days.

c. Code

#include “pitches.h”
int StartVal;
int prevStartVal;
int EndVal;
int prevEndVal;
int DemonVal;
int Passcodeval;
int Barrier = 9;
int potentiometer = A0;
int temperatureVal;
long StartTime;
long GameTime;
int Buzzer = 8;
int state = 1;
int sword = 13;
int swordState;
int prevState;
int count = 0;
int LED = 5;
int val;
bool punching = false;
bool playing = false;
bool fire = false;
#include <Servo.h>
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
int d = 500;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(4, INPUT);
servo1.attach(9);
servo2.attach(10);
servo3.attach(11);
servo4.attach(6);
servo5.attach(3);
servo1.write(0);
servo2.write(0);
servo3.write(90);
servo4.write(0);
servo5.write(0);
pinMode(sword, OUTPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
}
void loop() {
if(state == 1){
state1();
}elseif(state == 2){
state2();
}elseif(state == 3){
state3();
}elseif(state == 4){
state4();
}elseif(state == 5){
state5();
}
GameTime = millis() – StartTime;
}
void state1() {
//countdown starts
StartVal = digitalRead(2);
EndVal = digitalRead(4);
if(EndVal == LOW && StartVal == HIGH && prevStartVal == LOW){
Serial.println(“Start!”);
StartTime = millis();
state = 2;
}
prevStartVal = StartVal;
}
void state2(){
// Demon appears
DemonVal = digitalRead(12);
if(DemonVal == HIGH){
servo3.write(0);
}
// Raise body temperature
int temperatureVal = analogRead(A1);
Serial.println(temperatureVal);
delay(5);
val = analogRead(A1);
val = map(val, 55, 62, 0, 255);
analogWrite(5, val);
// Defeat the demon
swordState = digitalRead(sword);
Serial.println(count);
// High temperature
if (temperatureVal >= 60 && fire == false){
tone(8, 800, 200);
fire = true;}
if(swordState == HIGH && prevState ==LOW && fire == true){
count = count + 1;
}
prevState = swordState;
if(count == 5){
if(punching == false){
tone(8, 400, 500);
 
punching = true;
delay(100);
}
if(punching == true){servo4.write(180);
}
state = 3;
}
//low temperature
if(temperatureVal < 60 && fire == false){
if(swordState == HIGH && prevState ==LOW){
count = count + 1;
}
prevState = swordState;
if(count > 4){
count = 0;
}
}
}
void state3(){
// Bamboo passcode and barrier
int Passcode = analogRead(potentiometer);
//Serial.println(Passcode);
//delay(1);
Passcodeval = analogRead(0);
if(Passcodeval >= 500 && Passcodeval <= 550){
servo1.write(180);
servo2.write(180);
state = 4;
}
}
void state4(){
//countdown ends
EndVal = digitalRead(4);
if(EndVal == HIGH && prevEndVal == LOW){
Serial.print(“Game over! “);
Serial.println(GameTime);
if(Serial.print(“Game over! “)){
state = 5;
}
}
}
void state5(){
//win or lose
if(GameTime <= 300000 && playing == false){
Serial.print(“You Win!”);
servo5.write(180);
int melody[] = {
NOTE_C5, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, 0, NOTE_B4, NOTE_C5
};
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
for(int thisNote = 0; thisNote < 8; thisNote++){
int noteDuration = 1000 / noteDurations[thisNote];
tone(Buzzer, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(Buzzer);
playing = true;
}
}
if(GameTime > 300000 && playing == false){
Serial.print(“You Lose…”);
int melody[] = {
NOTE_D3, NOTE_CS3, NOTE_C3, 0, NOTE_B2, NOTE_A2, NOTE_G2, NOTE_F2, NOTE_FS2, NOTE_F2, NOTE_FS2, NOTE_F2
};
int noteDurations[] = {
6, 5, 4, 8, 3, 2, 2, 2, 9, 9, 9, 2
};
for(int thisNote = 0; thisNote < 8; thisNote++){
int noteDuration = 1000 / noteDurations[thisNote];
tone(Buzzer, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(Buzzer);
playing = true;
}
}
prevEndVal = EndVal;
}
 
pitches.h
/*************************************************
Public Constants
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
/**
* The melody was adapted from a the tutorial found here:
* https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody
*/
I coded all and I feel the code we learnt in class helped me a lot. Especially, the “state” code helped me divide the code and make it orderly successfully.
(SPECIAL THANKS to Andy for helping me a lot with the code!!!)
 

d. User Testing

• User Testing

Due to the unfixed circuit, some cables just unplug themselves from the breadboard (GOD! I was crying inside my heart). Therefore, I had to plug them in again fast before the user testing. Unfortunately, It was such a hurry that I mistook a few of them and the circuit didn’t work. We have to fake it and perform by ourselves…

We got a lot of suggestions from the user testing recitation.

Later, we added more magnets on the main charater figure and the stick handle to solve the “HARD TO MOVE” problem, which we thought was the crucial one. Also, we adjusted a lot of barriers’s length to make the room to pass bigger.

• Final Critique

-MORE INSTRUCTIONS!!

For the stick handle, people may have no idea how to play the game with it. We should add more instructions about it.

-WIDER ROAD!!

I believe this critique was also based on the “HARD TO MOVE” problem. We need stronger magnets! Or more smooth surface!

-PURE GAME WORLD!!

Our original idea is the pure game world with only the stick handle. Later, based on the limited time for building this project, we had to give up this idea. 

E. CONCLUSIONS

 

a. Goal

Making it an INTERACTIVE game!

I think we did it. We can see that our players successfully feel the happiness of winning the game. However, if there were more randomness in the game, it would be perfect. Now, the players just followed the instructions and sometimes our hints to complete the game. We want to give them more surprise than just figures poping up, although I think the poping-up already surprised them a lot.

b. Improvement

If there were more time……

• I would first decorate the stick and make it look like a sword with a handle and add some instructions about how to use this stick to play.

Cassandra made the sword. However, we forgot about it. If we make it thicker and more stable, it can be a very good handle.

• I would make the game more RANDOM and FLEXIBLE. For now, every step of this game is set up. There is only one solution to the puzzle. If there are more random traps, this game can have more possibilities. For example, it can include a trap that reduces the time limit by 30 seconds or a potential bonus that extends the time limit.

c. Take-away

SUCCESSFUL PROJECT but HARM TO BODY

• SUCCESSFUL PROJECT

A successful pair-work project needs good communication and cooperation. I’m very glad that we had very good communication and divided our work according to our ability. It went very well and was even beyond my expectations.

• HARM TO BODY

We must consider the time we have to do the project. There was only more than one week for us to start and complete the project. Staying up late every day led to low energy in the midterms and less time for other courses.

F. Reference

• Crawford, Chris. “The Art of Interactive Design: A Euphonious and Illuminating Guide to Building Successful Software.” Amazon, No Starch Press, 2003, www.amazon.com/Art-Interactive-Design-Euphonious-Illuminating/dp/1886411840. 

• Visnjic, Filip. “Narratron – Shadow Play with a Storytelling AI.” CreativeApplications.Net, 11 July 2023, www.creativeapplications.net/objects/narratron-shadow-play-with-a-storytelling-ai/. 

Leave a Reply

Your email address will not be published. Required fields are marked *