Created
March 13, 2017 19:11
-
-
Save alexanderhenne/f2e42c0a369bf2c2e862c91d2797c391 to your computer and use it in GitHub Desktop.
Snake i Processing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void setup() { | |
// 600 = 15 * 40 | |
size(600, 600); | |
APPLE_SPRITE = loadImage("http://i.imgur.com/aN2AQDy.png"); | |
} | |
PImage APPLE_SPRITE; | |
int SNAKE_PART_SIZE = 15; | |
int SNAKE_PART_PADDING = 1; | |
boolean hasStarted; | |
boolean firstRun = true; | |
// -1 = rör sig ej | |
// 0 = vänster | |
// 1 = upp | |
// 2 = höger | |
// 3 = ner | |
int snakeDirection = -1; | |
ArrayList<PVector> snakeParts = new ArrayList<PVector>(); | |
PVector applePosition; | |
void draw() { | |
background(#212121); | |
noStroke(); | |
if (!hasStarted) { | |
fill(255); | |
textSize(32); | |
textAlign(CENTER, CENTER); | |
if (firstRun) { | |
text("Snake", width / 2, height / 4); | |
textSize(24); | |
text("Tryck på 'S' för att börja och använd", width / 2, height / 2); | |
text("sedan piltangenterna för att styra ormen", width / 2, height / 2 + 40); | |
} else { | |
text("Ormen dog!", width / 2, height / 4); | |
textSize(24); | |
text("Tryck på 'S' för att börja om", width / 2, height / 2); | |
} | |
} else { | |
image(APPLE_SPRITE, | |
applePosition.x - SNAKE_PART_SIZE / 2, | |
applePosition.y - SNAKE_PART_SIZE / 2); | |
fill(255); | |
textSize(24); | |
textAlign(LEFT, CENTER); | |
text("Poäng: " + (snakeParts.size() - 1), 10, 20); | |
fill(#43a047); | |
rectMode(CENTER); | |
PVector snakeHead = snakeParts.get(snakeParts.size() - 1); | |
float x = snakeHead.x; | |
float y = snakeHead.y; | |
rect(x, y, | |
SNAKE_PART_SIZE - SNAKE_PART_PADDING, | |
SNAKE_PART_SIZE - SNAKE_PART_PADDING); | |
for (int i = 0; i < snakeParts.size() - 1; i++) { | |
PVector snakePart = snakeParts.get(i); | |
rect(snakePart.x, snakePart.y, | |
SNAKE_PART_SIZE - SNAKE_PART_PADDING, | |
SNAKE_PART_SIZE - SNAKE_PART_PADDING); | |
} | |
if (isInWindowBounds(x, y)) { | |
if (snakeDirection != -1) { | |
switch (snakeDirection) { | |
case 0: | |
x -= SNAKE_PART_SIZE; | |
break; | |
case 1: | |
y -= SNAKE_PART_SIZE; | |
break; | |
case 2: | |
x += SNAKE_PART_SIZE; | |
break; | |
case 3: | |
y += SNAKE_PART_SIZE; | |
break; | |
} | |
if (!isPointPartOfSnake(x, y)) { | |
snakeParts.add(new PVector(x, y)); | |
if (x == applePosition.x | |
&& y == applePosition.y) { | |
placeApple(); | |
} else { | |
snakeParts.remove(0); | |
} | |
} else { | |
// Ormen dog av att åka in i sig själv | |
hasStarted = false; | |
} | |
} | |
} else { | |
// Ormen dog av att åka in i väggen | |
hasStarted = false; | |
} | |
// Vänta 60 millisekunder | |
delay(60); | |
} | |
} | |
void keyPressed() { | |
// Återställer spelet till början | |
if (key == 's' || key == 'S') { | |
snakeParts.clear(); | |
snakeParts.add(new PVector((int) (width / SNAKE_PART_SIZE / 2) * SNAKE_PART_SIZE, | |
(int) (height / SNAKE_PART_SIZE / 2) * SNAKE_PART_SIZE)); | |
snakeDirection = -1; | |
placeApple(); | |
hasStarted = true; | |
firstRun = false; | |
} else { | |
boolean bodyExists = snakeParts.size() > 1; | |
// Ändrar åt vilket håll ormen förflyttar sig | |
switch (keyCode) { | |
case LEFT: | |
// Undvik att spelaren råkar äta sig själv när | |
// den försöker ändra till motsatt riktning | |
if (!(snakeDirection == 2 && bodyExists)) { | |
snakeDirection = 0; | |
} | |
break; | |
case UP: | |
if (!(snakeDirection == 3 && bodyExists)) { | |
snakeDirection = 1; | |
} | |
break; | |
case RIGHT: | |
if (!(snakeDirection == 0 && bodyExists)) { | |
snakeDirection = 2; | |
} | |
break; | |
case DOWN: | |
if (!(snakeDirection == 1 && bodyExists)) { | |
snakeDirection = 3; | |
} | |
break; | |
} | |
} | |
} | |
boolean isPointPartOfSnake(float x, float y) { | |
for (PVector snakePart : snakeParts) { | |
if (snakePart.x == x | |
&& snakePart.y == y) { | |
return true; | |
} | |
} | |
return false; | |
} | |
boolean isInWindowBounds(float x, float y) { | |
if (x < 0 || x > width | |
|| y < 0 || y > height) { | |
return false; | |
} | |
return true; | |
} | |
void placeApple() { | |
applePosition = new PVector(round(random(1, width / SNAKE_PART_SIZE - 1)) * SNAKE_PART_SIZE, | |
round(random(1, height / SNAKE_PART_SIZE - 1)) * SNAKE_PART_SIZE); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment