• canvas 贪吃蛇实现完整代码


    <head>
    	<meta charset="UTF-8">
    	<title></title>
    </head>
    
    <body>
    	<canvas id="myCanVas" width="1000" height="600" style="box-shadow: 10px 10px 5px black;"></canvas>
    
    	<script src="CheckOurPeng.js" type="text/javascript" charset="utf-8"></script>
    	<script type="text/javascript">
    		var myCan = document.getElementById("myCanVas");
    		var can = myCan.getContext("2d");
    
    		var snakeLength = 5;
    		// 定时器对象
    		var time = null;
    		// 取随机数的方法
    		function rand(max, min) {
    			return Math.floor(Math.random() * (((max + 1) - min))) + min;
    		}
    		//碰撞检测
    		function checkPeng(obj1, obj2) {
    			//相撞时圆心距
    			var disX = obj1.w / 2 + (obj2.w / 2);
    			var disY = obj1.h / 2 + (obj2.h / 2);
    			//实际圆心距
    			var centerX = Math.abs(obj2.x + (obj2.w / 2) - (obj1.x + (obj1.w / 2)));
    			var centerY = Math.abs(obj2.y + (obj2.h / 2) - (obj1.y + (obj1.h / 2)));
    			// 判断
    			if(centerX < disX && centerY < disY) {
    				//相撞为true
    				return true;
    			} else {
    				return false;
    			}
    		}
    
    		//蛇的行为
    		function Snake() {
    			this.x = -40;
    			this.y = 40;
    			this.w = 40;
    			this.h = 40;
    			this.color = "gray";
    			this.speed = 40;
    			// 方向
    			this.left = false;
    			this.top = false;
    			// 默认往右
    			this.right = true;
    			this.bottom = false;
    			// 用于装蛇的每个矩形块的信息(包括头部的)
    			this.bodys = [];
    		}
    		//画蛇
    		Snake.prototype.drawSnake = function() {
    			for(var i = 0; i < this.bodys.length; i++) {
    				var myRect = this.bodys[i];//初始化
    				can.beginPath();
    				// 头部其实就是bodys数组里最后一个元素
    				if(i == this.bodys.length - 1) {
    					can.fillStyle = "yellow";
    				} else {
    					can.fillStyle = this.color;
    				}
    				can.fillRect(myRect.x, myRect.y, myRect.w, myRect.h);
    				can.closePath();
    			}
    
    		}
    
    		Snake.prototype.move = function() {
    			if(this.top) {
    				this.y -= this.speed;
    			} else if(this.right) {
    				this.x += this.speed;
    			} else if(this.bottom) {
    				this.y += this.speed;
    			} else if(this.left) {
    				this.x -= this.speed;
    			}
    
    			for(var i = 0; i < this.bodys.length; i++) {
    				var myRect = this.bodys[i];
    				if(myRect.x == this.x && myRect.y == this.y) {
    					clearInterval(time);
    					alert(1111111);
    
    				}
    			}
    
    			if(this.x < 0 || this.x > myCan.width || this.y < 0 || this.y > myCan.height) {
    				clearInterval(time);
    				alert(1111111);
    			}
    		}
    
    
    		Snake.prototype.savePosition = function() {
    			// 把新移动的这个矩形的位置以及大小信息装
    			// 到bodys数组里
    			var posi = {
    				x: this.x,
    				y: this.y,
    				w: this.w,
    				h: this.h
    			}
    			if(this.bodys.length == snakeLength) {
    				this.bodys.shift();
    			}
    			this.bodys.push(posi);
    		}
    
    		document.onkeydown = function(ev) {
    			switch(ev.keyCode) {
    				// left
    				case 37:
    					
    					
    					if(!sna.right) {
    						sna.left = true;
    						sna.right = false;
    						sna.top = false;
    						sna.bottom = false;
    					}
    					break;
    					// top
    				case 38:
    					if(!sna.bottom) {
    						sna.left = false;
    						sna.right = false;
    						sna.top = true;
    						sna.bottom = false;
    					}
    					break;
    					// right
    				case 39:
    					if(!sna.left) {
    						sna.left = false;
    						sna.right = true;
    						sna.top = false;
    						sna.bottom = false;
    					}
    					break;
    
    					// bottom
    				case 40:
    					if(!sna.top) {
    						sna.left = false;
    						sna.right = false;
    						sna.top = false;
    						sna.bottom = true;
    					}
    					break;
    				default:
    					break;
    			}
    
    		}
    
    		var sna = new Snake();
    
    
    		// 食物的类
    		function Food() {
    			this.x = 0;
    			this.y = 0;
    			this.w = 40;
    			this.h = 40;
    			this.color = "red";
    		}
    		Food.prototype.draw = function() {
    			can.beginPath();
    			can.fillStyle = this.color;
    			can.fillRect(this.x, this.y, this.w, this.h);
    			can.closePath();
    		}
    
    
    		Food.prototype.setPosition = function() {
    			
    			
    			this.x = rand(0, (myCan.width - this.w) / 40) * 40;
    			this.y = rand(0, (myCan.height - this.h) / 40) * 40;
    
    			for(var i = 0; i < sna.bodys.length; i++) {
    
    				var myRect = sna.bodys[i];
    				if(myRect.x == this.x && myRect.y == this.y) {
    					//	this.setPosition();
    					break;
    				}
    			}
    		}
    
    		var food = new Food();
    		food.setPosition();
    
    		time = setInterval(function() {
    			can.clearRect(0, 0, myCan.width, myCan.height);
    			sna.move();
    			sna.savePosition();
    			food.draw();
    			sna.drawSnake();
    
    
    			var a = checkPeng(sna, food);
    			if(a) {
    
    				food.setPosition();
    				snakeLength++;
    			}
    		}, 100);
    	</script>
    
    </body>
    
    ![](http://images2015.cnblogs.com/blog/996760/201609/996760-20160927113407953-1222052904.png)
  • 相关阅读:
    golangWEB框架gin学习之路由群组
    golangWEB框架gin学习之获取post参数
    golangWEB框架gin学习之获取get参数
    golang之bufio包的使用
    linux配置java环境变量
    jmeter接口测试实践
    Selenium2(java)框架设计 九
    Selenium2(java)页面对象模型(Page Object) 八
    Selenium2(java)TestNG的使用 七
    Selenium2(java)selenium常用API 六
  • 原文地址:https://www.cnblogs.com/zhangbaile/p/5911944.html
Copyright © 2020-2023  润新知