日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

php 实现贪吃蛇游戏,HTML5 贪吃蛇游戏实现思路及源代码_html5教程技巧

發(fā)布時(shí)間:2025/3/15 php 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 实现贪吃蛇游戏,HTML5 贪吃蛇游戏实现思路及源代码_html5教程技巧 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

游戲操作說(shuō)明

通過(guò)方向鍵控制貪吃蛇上下左右移動(dòng)。貪吃蛇吃到食物之后會(huì)變長(zhǎng)一個(gè)長(zhǎng)度。

游戲具體實(shí)現(xiàn)

游戲難點(diǎn)是怎么模擬貪吃蛇的移動(dòng)。如果只是一個(gè)方塊的話顯然很簡(jiǎn)單。但是當(dāng)蛇的長(zhǎng)度變長(zhǎng)之后要怎么樣控制

每個(gè)方塊的移動(dòng)呢?如果觀察蛇的移動(dòng),可以發(fā)現(xiàn),從蛇的頭部到尾部,每個(gè)方塊在下一時(shí)刻的位置就是它的前一個(gè)方塊在當(dāng)前時(shí)刻

的位置。因此我們需要做的只是控制貪吃蛇的頭部的運(yùn)動(dòng)。其他部分的位置都可以依次類(lèi)推。

另外一個(gè)值得注意的問(wèn)題是

貪吃蛇吃下食物之后,新增加的方塊應(yīng)該放在哪個(gè)位置。

答案就是在下一時(shí)刻,新增加的方塊應(yīng)該出現(xiàn)在當(dāng)前時(shí)刻的尾部位置。

因此,在吃下食物之后應(yīng)該在更新蛇的每個(gè)位置之前,增加一個(gè)方塊,并且將其位置設(shè)定在當(dāng)前時(shí)刻的尾部位置。

然后在當(dāng)前時(shí)刻更新出了新增方塊之外的所有方塊的位置

index.html

snake.js

代碼如下:var canvas;

var ctx;

var timer;

//measures

var x_cnt = 15;

var y_cnt = 15;

var unit = 48;

var box_x = 0;

var box_y = 0;

var box_width = 15 * unit;

var box_height = 15 * unit;

var bound_left = box_x;

var bound_right = box_x + box_width;

var bound_up = box_y;

var bound_down = box_y + box_height;

//images

var image_sprite;

//objects

var snake;

var food;

var food_x;

var food_y;

//functions

function Role(sx, sy, sw, sh, direction, status, speed, image, flag)

{

this.x = sx;

this.y = sy;

this.w = sw;

this.h = sh;

this.direction = direction;

this.status = status;

this.speed = speed;

this.image = image;

this.flag = flag;

}

function transfer(keyCode)

{

switch (keyCode)

{

case 37:

return 1;

case 38:

return 3;

case 39:

return 2;

case 40:

return 0;

}

}

function addFood()

{

//food_x=box_x+Math.floor(Math.random()*(box_width-unit));

//food_y=box_y+Math.floor(Math.random()*(box_height-unit));

food_x = unit * Math.floor(Math.random() * x_cnt);

food_y = unit * Math.floor(Math.random() * y_cnt);

food = new Role(food_x, food_y, unit, unit, 0, 0, 0, image_sprite, true);

}

function play(event)

{

var keyCode;

if (event == null)

{

keyCode = window.event.keyCode;

window.event.preventDefault();

}

else

{

keyCode = event.keyCode;

event.preventDefault();

}

var cur_direction = transfer(keyCode);

snake[0].direction = cur_direction;

}

function update()

{

//add a new part to the snake before move the snake

if (snake[0].x == food.x && snake[0].y == food.y)

{

var length = snake.length;

var tail_x = snake[length - 1].x;

var tail_y = snake[length - 1].y;

var tail = new Role(tail_x, tail_y, unit, unit, snake[length - 1].direction, 0, 0, image_sprite, true);

snake.push(tail);

addFood();

}

//modify attributes

//move the head

switch (snake[0].direction)

{

case 0: //down

snake[0].y += unit;

if (snake[0].y > bound_down - unit)

snake[0].y = bound_down - unit;

break;

case 1: //left

snake[0].x -= unit;

if (snake[0].x < bound_left)

snake[0].x = bound_left;

break;

case 2: //right

snake[0].x += unit;

if (snake[0].x > bound_right - unit)

snake[0].x = bound_right - unit;

break;

case 3: //up

snake[0].y -= unit;

if (snake[0].y < bound_up)

snake[0].y = bound_up;

break;

}

//move other part of the snake

for (var i = snake.length - 1; i >= 0; i--)

{

if (i > 0)

//snake[i].direction=snake[i-1].direction;

{

snake[i].x = snake[i - 1].x;

snake[i].y = snake[i - 1].y;

}

}

}

function drawScene()

{

ctx.clearRect(box_x, box_y, box_width, box_height);

ctx.strokeStyle = "rgb(0,0,0";

ctx.strokeRect(box_x, box_y, box_width, box_height);

//detection collisions

//draw images

for (var i = 0; i < snake.length; i++)

{

ctx.drawImage(image_sprite, snake[i].x, snake[i].y);

}

ctx.drawImage(image_sprite, food.x, food.y);

}

function init()

{

canvas = document.getElementById("scene");

ctx = canvas.getContext('2d');

//images

image_sprite = new Image();

image_sprite.src = "images/sprite.png";

image_sprite.onLoad = function ()

{}

//ojects

snake = new Array();

var head = new Role(0 * unit, 0 * unit, unit, unit, 5, 0, 1, image_sprite, true);

snake.push(head);

window.addEventListener('keydown', play, false);

addFood();

setInterval(update, 300); //note

setInterval(drawScene, 30);

}

本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請(qǐng)注明出處,感謝您的尊重!

總結(jié)

以上是生活随笔為你收集整理的php 实现贪吃蛇游戏,HTML5 贪吃蛇游戏实现思路及源代码_html5教程技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。