<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="tcs.css">
</head>
<body>
<div class="startPage" id="startPage">
<div class="startBtn" id = "startBtn"></div>
</div>
<div class="wrapper">
<div class="left-side">
<img src="img/start.png" alt="" class="startPaush" id="startPaush">
</div>
<div class="main">
<div class="header">
<div class="score">
分数:
<span id="score"></span>
</div>
</div>
<div class="content" id="content"></div>
</div>
</div>
<div class="loser" id="loser">
<div class="con">
<div class="close" id="close"></div>
<span class="loserScore" id="loserScore"></span>
</div>
</div>
<script src="tcs.js"></script>
</body>
</html>
*{
margin:0;
padding:0;
list-style:none;
}
.startPage{
width:100%;
z-index:999;
height:800px;
position:absolute;
top:0;
left:0;
}
.startBtn{
position:absolute;
height:170px;
width:200px;
background-image: url('img/startGame.png');
background-size:100% 100%;
cursor: pointer;
left:0;
top:0;
right:0;
bottom:0;
margin:auto;
}
.wrapper{
height:800px;
width:100%;
position:relative;
background-image:url('img/bg.jpg');
background-size: 100% 100%;
}
.left-side{
position: absolute;
width:24%;
height:800px;
}
.left-side img{
margin-left:50px;
margin-top:50px;
display:none;
}
.main{
position:absolute;
left:25%;
display: inline-block;
width:50%;
height:90%;
}
.header{
width:100%;
height:80px;
text-align:center;
}
.score{
line-height:40px;
color:#ddd;
font-size:20px;
font-weight:bolder;
}
.score span{
display:inline-block;
height:80px;
width:30px;
line-height:80px;
}
.content{
position:absolute;
width:79.5%;
height:36.5%;
left:10%;
/* top:244px; */
top:34%;
/* border:1px solid black; */
}
.loser{
display:none;
position:absolute;
width:100%;
height:100%;
top:0;
left:0;
}
.con{
background-image: url('img/startP.jpg');
background-size:100% 100%;
height:300px;
width:400px;
position:absolute;
margin:auto;
left:0;
top:0;
right:0;
bottom:0;
border-radius:20px;
}
.close{
position:absolute;
top:0;
right:0;
height:40px;
width:40px;
background-image: url('img/closeBtn.png');
background-size:100% 100%;
cursor: pointer;
}
.loserScore{
display:block;
height:30px;
width:60px;
position:absolute;
top:42%;
left:40%;
color:#222;
font-size:30px;
font-weight:bolder;
}
.food{
background-image: url('img/lyt.jpg');
background-size:100% 100%;
}
.head{
background-image: url('img/cfx.png');
background-size:100% 100%;
}
.body{
background-image: url('img/cyx.jpg');
background-size:100% 100%;
}
var snakeMove;
var startGameBool = true;
var startPauseBool = true;
var speed = 200;
var scoreBox = document.getElementById('score');
var content = document.getElementById('content');
var lose = document.getElementById('loser');
var loserScore = document.getElementById('loserScore');
var startPaush = document.getElementById('startPaush');
var closeBtn = document.getElementById('close');
var startBtn = document.getElementById('startBtn');
var startPage = document.getElementById('startPage');
init();
function init() {
//地图属性
this.mapW = parseInt(window.getComputedStyle(content).width);
this.mapH = parseInt(window.getComputedStyle(content).height);
this.mapDiv = content;
//食物属性
this.foodW = 20;
this.foodH = 20;
this.foodX = 0;
this.foodY = 0;
this.foodColor = '#00F';
//蛇属性
this.snake;
this.snakeW = 20;
this.snakeH = 20;
this.snakeBody = [[3, 0, 'head'], [2, 0, 'body'], [1, 0, 'body']];
//游戏属性
this.direct = 'right';
this.left = false;
this.right = false;
this.up = true;
this.down = true;
//分数
this.score = 0;
scoreBox.innerHTML = this.score;
bindEvent();
}
function startGame() {
startPage.style.display = 'none';
startPaush.style.display = 'block';
food();
snake();
}
function food() {
var food = document.createElement('div');
food.style.width = this.foodW + 'px';
food.style.height = this.foodH + 'px';
food.style.borderRadius = '50%';
this.foodX = Math.floor(Math.random() * (this.mapW / this.foodW));
this.foodY = Math.floor(Math.random() * (this.mapH / this.foodH));
food.style.left = this.foodX * this.foodW + 'px';
food.style.top = this.foodY * this.foodH + 'px';
food.style.position = 'absolute';
this.mapDiv.appendChild(food).setAttribute('class', 'food');
}
function snake() {
for (var i = 0; i < this.snakeBody.length; i++) {
var snake = document.createElement('div');
snake.style.width = this.snakeW + 'px';
snake.style.height = this.snakeH + 'px';
snake.style.borderRadius = '50%';
snake.style.position = 'absolute';
snake.style.left = this.snakeBody[i][0] * 20 + 'px';
snake.style.top = this.snakeBody[i][1] * 20 + 'px';
snake.classList.add(this.snakeBody[i][2]);
this.mapDiv.appendChild(snake).classList.add('snake');
switch (this.direct) {
case 'right':
break;
case 'up':
snake.style.transform = 'rotate(270deg)'
break;
case 'left':
snake.style.transform = 'rotate(180deg)'
break;
case 'down':
snake.style.transform ='rotate(90deg)';
break;
default:
break;
}
}
}
function move() {
//蛇身位置
for (var i = this.snakeBody.length - 1; i > 0; i--) {
this.snakeBody[i][0] = this.snakeBody[i - 1][0];
this.snakeBody[i][1] = this.snakeBody[i - 1][1];
}
//蛇头位置
switch (this.direct) {
case 'right':
this.snakeBody[0][0] += 1;
break;
case 'up':
this.snakeBody[0][1] -= 1;
break;
case 'left':
this.snakeBody[0][0] -= 1;
break;
case 'down':
this.snakeBody[0][1] += 1;
break;
default:
break;
}
//删除之前蛇的节点 再渲染
removeClass('snake');
snake();
// 如果蛇头和食物x y同时相等 代表吃到食物
if (this.snakeBody[0][0] == this.foodX && this.snakeBody[0][1] == this.foodY) {
var snakeTailX = this.snakeBody[this.snakeBody.length - 1][0];
var snakeTailY = this.snakeBody[this.snakeBody.length - 1][1];
switch (this.direct) {
case 'right':
this.snakeBody.push([snakeTailX + 1, snakeTailY, 'body']);
break;
case 'up':
this.snakeBody.push([snakeTailX, snakeTailY - 1, 'body']);
break;
case 'left':
this.snakeBody.push([snakeTailX - 1, snakeTailY, 'body']);
break;
case 'down':
this.snakeBody.push([snakeTailX, snakeTailY + 1, 'body']);
break;
default:
break;
}
this.score += 1;
scoreBox.innerHTML = this.score;
removeClass('food');
food();
}
// 判断撞到边界
if (this.snakeBody[0][1] < 0 || this.snakeBody[0][1] >= this.mapH / this.snakeH) {
this.reloadGame();
}
if (this.snakeBody[0][0] < 0 || this.snakeBody[0][0] >= this.mapW / this.snakeW) {
this.reloadGame();
}
var snakeHeaderX = this.snakeBody[0][0];
var snakeHeaderY = this.snakeBody[0][1];
for (var i = 1; i < this.snakeBody.length; i++) {
var snakeBodyX = this.snakeBody[i][0];
var snakeBodyY = this.snakeBody[i][1];
if (snakeHeaderX == snakeBodyX && snakeHeaderY == snakeBodyY) {
this.reloadGame();
}
}
}
function setDerict(code) {
switch (code) {
case 37:
if (this.left) {
this.direct = 'left';
this.left = false;
this.right = false;
this.up = true;
this.down = true;
}
break;
case 38:
if (this.up) {
this.direct = 'up';
this.left = true;
this.right = true;
this.up = false;
this.down = false;
}
break;
case 39:
if (this.right) {
this.direct = 'right';
this.left = false;
this.right = false;
this.up = true;
this.down = true;
}
break;
case 40:
if (this.down) {
this.direct = 'down';
this.left = true;
this.right = true;
this.up = false;
this.down = false;
}
break;
default:
break;
}
}
function reloadGame() {
removeClass('snake');
removeClass('food');
clearInterval(snakeMove);
startPaush.setAttribute('src', './img/start.png');
this.snakeBody = [[3, 2, 'head'], [2, 2, 'body'], [1, 2, 'body']];
this.direct = 'right';
this.left = false;
this.right = false;
this.up = true;
this.down = true;
startPauseBool = true;
startGameBool = true;
lose.style.display = 'block';
loserScore.innerHTML = this.score;
this.score = 0;
scoreBox.innerHTML = this.score;
}
function removeClass(calssName) {
var ele = document.getElementsByClassName(calssName);
while (ele.length > 0) {
ele[0].parentNode.removeChild(ele[0]);
}
}
function bindEvent() {
startBtn.onclick = function(){
startAndPauseGame();
}
startPaush.onclick = function () {
startAndPauseGame();
}
closeBtn.onclick = function () {
lose.style.display = 'none';
}
}
//开始和暂停游戏 逻辑封装
function startAndPauseGame() {
if (startPauseBool) {
if (startGameBool) {
startGame();
startGameBool = false;
}
startPaush.setAttribute('src', './img/pause.png');
snakeMove = setInterval(function () {
move();
}, speed);
document.onkeydown = function (e) {
var code = e.keyCode;
setDerict(code);
};
startPauseBool = false;
} else {
//暂停
startPaush.setAttribute('src', './img/start.png');
clearInterval(snakeMove);
document.onkeydown = function (e) {
e.returnValue = false;
return false;
};
startPauseBool = true;
}
}