//Snake Game in Processing 3.5.3 (www.processing.org) import processing.sound.*; import processing.serial.*; Serial joyStick; int joyStickCommand=RIGHT; boolean joyStickEnabled=false; int pixW = 50; ArrayList snake; float trem = 0; int keycode = RIGHT; boolean press = false; int prevcode = 0; int foodX; int foodY; float root = 2; int menu = 0; long sndtimer = 0; int ease = 2000; boolean start = false; boolean pause = false; TriOsc tri, tri2; SawOsc saw; boolean sound = true; PFont font; void foodCoordinates(int recursion) { foodX = int(random(width/pixW)); foodY = int(random(height/pixW)); for (bodypart part : snake) { if (part.m_x == foodX && part.m_y == foodY) { if (recursion != 0) foodCoordinates(recursion - 1); break; } } } void init() { snake.clear(); snake.add(new bodypart(0, int(height/2/pixW))); snake.add(new bodypart(1, int(height/2/pixW))); snake.add(new bodypart(2, int(height/2/pixW))); snake.add(new bodypart(3, int(height/2/pixW))); } void stopsnd() { tri.stop(); tri2.stop(); saw.stop(); } void reinit() { snake = new ArrayList(); init(); foodCoordinates(1000); root = 2; } void setup() { if (Serial.list().length > 1) joyStick = new Serial(this, Serial.list()[1], 38400); font = createFont("Courier New", 50); textFont(font); fullScreen(); noCursor(); background(0); textSize(300); fill(0, 255, 0); textAlign(CENTER, CENTER); text("SNAKE", width/2, height/6.5); textSize(50); text("1. EASY\n2. MEDIUM\n3. HARD\n4. HARDCORE\nJ - TOGGLE EXTERNAL JOYSTICK\nS - TOGGLE SOUND\nE - EXIT", width/2, 2*height/3); snake = new ArrayList(); init(); tri = new TriOsc(this); tri2 = new TriOsc(this); saw = new SawOsc(this); tri.freq(440); tri2.freq(880); saw.freq(50); foodX = int(random(width/pixW)); foodY = int(random(height/pixW)); sndtimer = 100; pause = false; stroke(0); } void draw() { if (start) { if (!joyStickEnabled) { if (keyCode > 36 && keyCode < 41) { if (abs(keyCode-prevcode) != 2) keycode = keyCode; if (keyPressed) { if (!press) if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } press = true; } else { press = false; } } } else { if (abs(joyStickCommand-prevcode) != 2) keycode = joyStickCommand; } if (keyPressed && (key == 'p' || key == 'P')) if (pause) { background(0); textSize(300); text("PAUSE", width/2, height/2); } if (!pause && trem > (trem = millis()%(ease/(root+2)))) { bodypart test = new bodypart(0, 0); prevcode = keycode; switch(keycode) { case UP: test = snake.get(snake.size()-1).up(); break; case DOWN: test = snake.get(snake.size()-1).down(); break; case LEFT: test = snake.get(snake.size()-1).left(); break; case RIGHT: test = snake.get(snake.size()-1).right(); break; default: break; } if (test.m_x < 0 || test.m_x >= width/pixW || test.m_y < 0 || test.m_y >= height/pixW) { menu = 1; start = false; test = new bodypart(0, 0); if (sound) { stopsnd(); saw.play(); sndtimer = millis() + 200; } } else { boolean crash = false; for (bodypart part : snake) { if (part.m_x == test.m_x && part.m_y == test.m_y) { crash = true; break; } } if (!crash) { snake.add(test); if (test.m_x == foodX && test.m_y == foodY) { foodCoordinates(1000); root = sqrt(snake.size()); if (sound) { stopsnd(); tri2.play(); sndtimer = millis() + 100; } } else { snake.remove(0); } } else { menu = 1; start = false; if (sound) { stopsnd(); saw.play(); sndtimer = millis() + 100; } } } } background(0); fill(255, 0, 0); rect(foodX*pixW, foodY*pixW, pixW, pixW); fill(0, 255, 0); for (bodypart part : snake) { part.update(); } } else { switch(menu) { case 0: if (!keyPressed) press=false; else switch(key) { case '1': ease = 2000; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } break; case '2': ease = 1000; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } break; case '3': ease = 600; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } break; case '4': ease = 300; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } break; case 'J': case 'j': if (keyPressed) { if (!press) { joyStickEnabled = !joyStickEnabled; stopsnd(); (joyStickEnabled ? tri2 : tri).play(); sndtimer = millis() + 100; } press = true; } else { press = false; } break; case 'S': case 's': if (keyPressed) { if (!press) { sound = !sound; stopsnd(); (sound ? tri2 : tri).play(); sndtimer = millis() + 100; } press = true; } break; case 'E': case 'e': exit(); default: break; } break; case 1: keycode = RIGHT; background(0); textSize(150); fill(255, 0, 0); text("GAME OVER", width/2, height/4); textSize(35); text("YOUR SCORE: " + (snake.size()-4) + "\n\n\n\n\n\n\n", width/2, height/1.5); fill(0, 255, 0); text("\n1. EASY\n2. MEDIUM\n3. HARD\n4. HARDCORE\nJ - TOGGLE EXTERNAL JOYSTICK\nS - TOGGLE SOUND\nE - EXIT", width/2, height/1.5); if (!keyPressed) press=false; else switch(key) { case '1': ease = 2000; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } reinit(); break; case '2': ease = 1000; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } reinit(); break; case '3': ease = 600; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } reinit(); break; case '4': ease = 300; start = true; if (sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } reinit(); break; case 'J': case 'j': if (keyPressed) { if (!press) { joyStickEnabled = !joyStickEnabled; stopsnd(); (joyStickEnabled ? tri2 : tri).play(); sndtimer = millis() + 100; } press = true; } else { press = false; } break; case 'S': case 's': if (keyPressed) { if (!press) { sound = !sound; stopsnd(); (sound ? tri2 : tri).play(); sndtimer = millis() + 100; } press = true; } break; case 'E': case 'e': exit(); default: break; } break; default: break; } } if (sndtimer < millis()) stopsnd(); } class bodypart { public int m_x, m_y; bodypart(int x, int y) { m_x = x; m_y = y; } void update() { rect(m_x*pixW, m_y*pixW, pixW, pixW); } bodypart up() { return new bodypart(m_x, m_y-1); } bodypart down() { return new bodypart(m_x, m_y+1); } bodypart left() { return new bodypart(m_x-1, m_y); } bodypart right() { return new bodypart(m_x+1, m_y); } } float vx, vy, but; boolean pausebuf = true; void serialEvent (Serial joyStick) { String inString = joyStick.readStringUntil('\n'); if (inString != null) { inString = trim(inString); int inputs[] = int(split(inString, ',')); if (inputs.length == 3) { vy = inputs[0]; vx = inputs[1]; but = inputs[2]; if (start) { if (but == 0) { if (pausebuf) pause = !pause; pausebuf = false; } else { pausebuf = true; } if (vy < 400) { if (joyStickCommand != DOWN && sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } joyStickCommand = DOWN; } if (vy > 1024-400) { if (joyStickCommand != UP && sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } joyStickCommand = UP; } if (vx < 400) { if (joyStickCommand != LEFT && sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } joyStickCommand = LEFT; } if (vx > 1024-400) { if (joyStickCommand != RIGHT && sound) { stopsnd(); tri.play(); sndtimer = millis() + 100; } joyStickCommand = RIGHT; } } } } }