<!DOCTYPE html>
<html>
<head>
<title>tank</title>
<style type="text/css">
#map{
position: absolute;
width: 500px;
height: 500px;
top: 50px;
left: 50%;
margin-left: -250px;
border: 5px solid green;
border-collapse:collapse;
}
span{
position: relative;
display: inline-block;
width: 90px;
height: 25px;
margin-left: 20px;
font-size: 14px;
text-align: center;
background-color: #4CAF50;
color: white;
cursor:pointer;
border-radius: 5px;
}
#ifo{
position: absolute;
width: 500px;
height: 40px;
top: 25px;
left: 50%;
margin-left: -250px;
}
#score{
background-color: white;
font-weight: bolder;
color: #4CAF50;
}
</style>
</head>
<body>
<div id="ifo">
<span id="stop">STOP</span>
<span id="restart">RESTART</span>
<span id="speed">SPEED</span>
<span id="score"></span>
</div>
<div id="map"></div>
</body>
<script type="text/javascript">
//map=地图对象;snake=存着蛇身体小方块的数组;food=食物对象;dir=蛇前进方向;score=得分;speed=蛇前行时间间隔;running=游戏状态
var map = document.getElementById("map");
var snake = new Array();
var food;
var dir = "R";
var score = 0;
var scorez = document.getElementById("score");
scorez.innerHTML = "SCORE: "+score;
var speed = 500;
const WIDTH = 500;
const HEIGHT = 500;
var running = "RUN";
//随机位置生成食物
food = randomFood();
//生成蛇
for(var i = 0; i < 3; i++){
var s = create(i*10,0,"red");
//把生成的蛇存入蛇数组中
snake.push(s);
}
//调用蛇移动函数让蛇移动
autoMove();
//-------------定义的各种函数-----------------------------------------
//蛇自动前进函数
function autoMove(){
autoSnake = setInterval(function(){move(dir);},speed);
}
//蛇移动函数
function move(dir){
//如果游戏状态为OVER直接退出
if(running == "OVER"){gameOver();return;}
var l = snake.length;
var y_old = getPostionNumber(snake[l-1],"y");
var x_old = getPostionNumber(snake[l-1],"x");
var x=x_old,y=y_old;
//蛇头下一步的位置
if(dir=="U"){
y = y_old - 10;
}else if(dir=="D"){
y = y_old + 10;
}else if(dir=="L"){
x = x_old -10;
}else if(dir=="R"){
x = x_old + 10;
}
//循环检测蛇头的下一步位置是否在蛇身
for(var i = 0; i < snake.length; i++){
var xi = getPostionNumber(snake[i],"x");
var yi = getPostionNumber(snake[i],"y");
//蛇头碰蛇身或者蛇头位置出界,游戏结束
if((x == xi && y == yi)||(y > (HEIGHT-10) || y < 0 || x > (WIDTH-10) ||x < 0)){
running = "OVER";
gameOver();
return;
}
}
//移动蛇头
snake[l-1].style.top = y + "px";
snake[l-1].style.left = x + "px";
//移动蛇身(除了蛇头下一节)
for(var i = 0; i < l-2; i++){
snake[i].style.left = snake[i+1].style.left;
snake[i].style.top = snake[i+1].style.top;
}
//移动蛇头下一节
snake[l-2].style.left = x_old + "px";
snake[l-2].style.top = y_old + "px";
//蛇遇食物,增长且重新生成食物
if(x == getPostionNumber(food,"x") && y == getPostionNumber(food,"y")){
var new_block = create(x,y,"red");
//吃食物将增长的蛇尾添加到蛇数组中,同时删除食物对象并重新生成
snake.unshift(new_block);
map.removeChild(food);
score = score + (500-speed)/100*2+1;
scorez.innerHTML = "SCORE: "+score;
food = randomFood();
}
}
//随机产生食物函数
function randomFood(){
//c表示是否重新产生位置
var c = 0;
do{
var food_x = (Math.round(Math.random()*50)*10);
var food_y = (Math.round(Math.random()*50)*10);
for(var i = 0; i < snake.length; i++){
var x = getPostionNumber(snake[i],"x");
var y = getPostionNumber(snake[i],"y");
//当且仅当随机食物不再蛇身上方可退出
if(x != food_x && y != food_y && i==(snake.length-1)){
c==1;
}
}
}while(c==1);
food = create(food_x,food_y,"#FF00FF");
return food;
}
//创建函数;生成一个给定位置、颜色的10x10方块
function create(x,y,color){
var it = document.createElement("div");
it.style.position = "absolute";
it.style.left = x+"px";
it.style.top = y+"px";
it.style.width = "10px";
it.style.height = "10px";
it.style.borderCollapse = "collapse";
it.style.border = "1px solid "+color;
map.appendChild(it);
return it;
}
//获取给定方块坐标的数值函数
function getPostionNumber(obj,p){
var dir= p=="x"?"left":"top";
var posit = (p=="x")? obj.style.left : obj.style.top;
posit = posit.substring(0,posit.length-2);
return parseInt(posit);
}
//游戏结束函数
function gameOver(){
clearInterval(autoSnake);
alert("GAME OVER");
}
//-------------自定义函数结束--------------------------------------
//-------------键盘监听开始----------------------------------------
//方向键监听及处理
document.onkeydown = function(event){
var old_dir = dir;
// 37 Left(左箭头)38 Up(上箭头)39 Righ(右箭头) 40 Down(下箭头)
code = event.keyCode;
//只有原方向与新方向不相反才能移动,防止掉头
if(code == 37 && old_dir !="R"){
dir = "L";
}else if(code == 38 && old_dir != "D"){
dir = "U";
}else if(code == 39 && old_dir != "L"){
dir = "R";
}else if(code == 40 && old_dir != "U"){
dir = "D"
}else{
return;
}
move(dir);
}
//暂停键按钮监听及处理
var stop = document.getElementById("stop");
stop.onclick = function(){
if(running == "RUN"){
running = "STOP";
clearInterval(autoSnake);
}else{
running = "RUN";
autoMove();
}
stop.innerHTML = (running == "STOP")?"CONTINUE":"STOP";
}
//重新开始按钮监听及处理
var restart = document.getElementById("restart");
restart.onclick = function(){
location.reload();
}
//加速按钮监听及处理
var sp = document.getElementById("speed");
sp.onclick = function(){
if(speed > 100){
speed-=100;
clearInterval(autoMove());
autoSnake = autoMove();
}
}
//---------------键盘监听结束-------------------------------------
</script>
</html>
原生html贪吃蛇
猜你喜欢
转载自blog.csdn.net/tomorrow_shoe/article/details/104090879
今日推荐
周排行