So was ich bisher habe:
[src=html5]
<!DOCTYPE html>
<html>
<head>
<title>Snake</title>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="core.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<div class="header">Snake - by Sharpy35</div>
<canvas id="canvas" width="450" height="450"></canvas>
<span id="gamestatus">Gestartet</span>
Punkte: <span class="points">0</span>
</body>
</html>
[/src]
[src=javascript]
$(document).ready(function(){
var droppedSnakePartX = 0;
var droppedSnakePartY = 0;
var lastDirection = "right";
var canvas;
var snake;
var context;
var interval;
var points = 0;
$(window).keydown(function(e) {
switch (e.keyCode)
{
case 27: //escape
pause_game();
break;
case 32: // Space
resume_game();
break;
case 37: //Left
move_snake("left");
break;
case 38: //Up
move_snake("up");
break;
case 39: // right
move_snake("right");
break;
case 40: //down
move_snake("down");
break;
default:
// do nothing
break;
}
});
/**
* Pausiert das Spiel mit Escape
*/
function pause_game()
{
$("#gamestatus").html("Pause");
clearInterval(interval);
}
/**
* Lässt das Spiel mit Leertaste Weiterlaufen
*/
function resume_game()
{
$("#gamestatus").html("Geht weiter");
interval = window.setInterval(function(){
move_snake();
}, 100);
}
/**
* represents a snakepart
*
* @param x
* @param y
* @param width
* @param height
* @param fill
* @constructor
*/
function SnakePart(x, y, width, height, fill)
{
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.fill = fill;
this.prevX = 0;
this.prevY = 0;
}
/**
* Setzt die neuen Koordinateneines Elements und bewegt die Schlange
*
* @param direction
*/
function move_snake(direction)
{
if (direction == undefined) {
direction = lastDirection;
}
for (var i = 0; i < snake.length; i++) {
snake
.prevX = snake.x;
snake.prevY = snake.y;
if (i == 0) {
switch(direction)
{
case "right":
snake.x = snake.x + 10;
lastDirection = "right";
break;
case "left":
snake.x = snake.x - 10;
lastDirection = "left";
break;
case "up":
snake.y = snake.y - 10;
lastDirection = "up";
break;
case "down":
snake.y = snake.y + 10;
lastDirection = "down";
break;
default:
//do nothing
break;
}
// dropped snake part was guzzled
if (snake.x == droppedSnakePartX && snake.y == droppedSnakePartY) {
var lastSnakePart = snake.length - 1;
snake.push(new SnakePart(snake[lastSnakePart].x, snake[lastSnakePart].y, 10, 10));
addPoints(10);
$('.points').html(points);
var numberCounter = $(".counter-number");
score = parseInt(numberCounter.html()) + 1;
numberCounter.html(score);
dropRandomSnakeparts();
}
} else {
snake.x = snake[i - 1].prevX;
snake.y = snake[i - 1].prevY;
}
draw_snake();
}
detectCollision();
}
/**
* Ermittelt ob die Schlange auf die Wand oder sich selbst trifft
*/
function detectCollision()
{
if (snake[0].x == canvas.width || snake[0].y == canvas.height
|| snake[0].x < 0 || snake[0].y < 0)
{
restart();
}
for (var i = 1; i < snake.length; i++) {
if(snake[0].x == snake.x && snake[0].y == snake.y) {
restart();
break;
}
}
}
/**
* Startet das Spiel neu
*/
function restart()
{
alert("Das Spiel ist vorbei.");
location.reload();
}
/**
* Malt ein Element einer Schlange.
*/
function draw_snake()
{
context.clearRect(0,0,canvas.width, canvas.height);
for (var i = 0; i < snake.length; i++) {
context.fillStyle = snake.fill;
context.fill();
context.fillRect(snake.x, snake.y, snake.width, snake.height);
}
// Da das gedroppte SnakePart Element bei jedem neuzeichnen sichtbar sein soll muss es hier nochmal gerendert werden.
context.fillStyle = "red";
context.fill();
context.fillRect(droppedSnakePartX, droppedSnakePartY, 10, 10);
}
/**
* Wirft zufällige SnakeParts ab die von der Schlange gefressen werden können.
*/
function dropRandomSnakeparts()
{
var w = canvas.width;
var h = canvas.height;
droppedSnakePartX = randomNumber(0,w);
droppedSnakePartY = randomNumber(0,h);
var restX = droppedSnakePartX % 10;
var restY = droppedSnakePartY % 10;
droppedSnakePartX -= restX;
droppedSnakePartY -= restY;
while(checkIfSnakePartIsDroppedOnSnake(droppedSnakePartX, droppedSnakePartY)) {
dropRandomSnakeparts();
}
context.fillStyle = "red";
context.fill();
context.fillRect(droppedSnakePartX, droppedSnakePartY, 10, 10);
}
/**
* Fügt neue Punkte hinzu wenn ein Element gefressen wurde.
*/
function addPoints(pointsToAdd)
{
points += parseInt(pointsToAdd);
}
/**
* Prüft ob ein Snakepart auf der Schlange abgelegt wurde.
*
* @param droppedSnakePartX
* @param droppedSnakePartY
* @returns {boolean}
*/
function checkIfSnakePartIsDroppedOnSnake(droppedSnakePartX, droppedSnakePartY)
{
for (var i = 0; i < snake.length; i++) {
if(droppedSnakePartX == snake.x && droppedSnakePartY == snake.y) {
return true;
}
}
return false;
}
/**
*
* Generiert eine Zufallszahl
*
* @param min
* @param max
* @returns {number}
*/
function randomNumber(min, max)
{
return Math.round( Math.random() * (max - min) + min);
}
/**
* Startet das Spiel
*/
function init()
{
canvas = $("#canvas")[0];
context = canvas.getContext("2d");
snake = [];
snake.push(new SnakePart(0,0, 10, 10, "blue"));
draw_snake();
dropRandomSnakeparts();
}
init();
interval = window.setInterval(function(){
move_snake();
}, 100);
})
[/src]
Fertige Spiel wird dann veröffentlicht 