Skip to content

Instantly share code, notes, and snippets.

@alexanderhenne
Created March 13, 2017 19:11
Show Gist options
  • Save alexanderhenne/f2e42c0a369bf2c2e862c91d2797c391 to your computer and use it in GitHub Desktop.
Save alexanderhenne/f2e42c0a369bf2c2e862c91d2797c391 to your computer and use it in GitHub Desktop.
Snake i Processing
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