电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

javascript實現貪吃蛇經典游戲

瀏覽:3日期:2023-06-22 11:13:27

js面向對象編程之貪吃蛇,供大家參考,具體內容如下

首先:面向對象編程,我們要找到項目中具體的對象,此處為(食物(food),蛇(snake),游戲本身(game))也可不把游戲本身作為對象,邏輯體現出來即可。

接著分析每個對象的具體的屬性及方法:1)food 對象:屬性有:位置,大小,顏色;方法有:渲染在頁面,隨機不同位置生成;2)snake對象:屬性有:位置,大小,總節數(計分方便),顏色;方法有:渲染在頁面,移動(移動過程中判斷其它)。3)game對象:游戲邏輯的編寫;

ok 開敲:

1)簡單的靜態頁面編寫(地圖)

(1)html

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <link rel='stylesheet' href='http://www.hdgsjgj.cn/bcjs/css/index.css' > <script src='http://www.hdgsjgj.cn/bcjs/js/food.js'></script> <script src='http://www.hdgsjgj.cn/bcjs/js/snake.js'></script> <script src='http://www.hdgsjgj.cn/bcjs/js/game.js'></script> <script src='http://www.hdgsjgj.cn/bcjs/js/main.js'></script> <title>貪吃蛇</title></head><body> <div class='map'></div></body></html>

(2)css(如果用邊框來作為限制的邊界,那么box-sizing屬性是必不可少的(以免食物和蛇頭坐標之間存在誤差))

* { margin: 0; padding: 0;}.map { position: relative; height: 600px; width: 800px; border: 1px solid #333; margin: 0 auto; /* 盒子模型去除邊框 */ box-sizing: border-box;}

2)food對象編寫(細節處含注釋)

//cwen加載頁面所有元素window.addEventListener(’load’, function() { //cwen自調用函數,開啟一個新的作用域,避免命名沖突 (function() { //cwen定義全局變量 //實物數組 var elements = []; //cwen實物 function Food(options) { options = options || {}; this.x = options.x || 0; this.y = options.y || 0; this.width = options.width || 20; this.height = options.height || 20; this.color = options.color || ’yellow’; } //cwen隨機數函數 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } //cwen渲染 Food.prototype.render = function(map) { //刪除之前的食物 remove(); //todo動態創建div實物 var div = document.createElement(’div’); map.appendChild(div); //把div添加給數組 elements.push(div); //todo隨機設置x,y的值(實物的位置)-----在map中生成隨機位置 // ! 值 = Math.floor(Math.random() * 可能值得總數 + 第一個可能的值) this.x = getRandom(0, map.offsetWidth / this.width - 1) * this.width; this.y = getRandom(0, map.offsetHeight / this.height - 1) * this.height; div.style.position = ’absolute’; div.style.left = this.x + ’px’; div.style.top = this.y + ’px’; div.style.width = this.width + ’px’; div.style.height = this.height + ’px’; div.style.backgroundColor = this.color; } function remove() { //為了刪除干凈,從索引最大的開始循環刪除 for (var i = elements.length - 1; i >= 0; i--) { //刪除遍歷到的div elements[i].parentNode.removeChild(elements[i]); //刪除數組中的元素1)第幾個開始,2)要刪除個數 elements.splice(i, 1); } } //把Food開放出去 window.Food = Food; })() //cwen測試 // var map = document.querySelector(’.map’); // var options = { x: 20, y: 20, width: 30, height: 30, color: ’green’ }; // //todo不傳值默認為自定義food // var food = new Food(); // food.render(map);})

3)snake對象編寫()

window.addEventListener(’load’, function() { (function() { //記錄蛇的每一節 var elements = []; //cwen立即執行函數,開啟新的作用于,避免命名沖突 function Snake(options) { options = options || {}; //對象(蛇)每節的大小 this.width = options.width || 20; this.height = options.height || 20; //cwen蛇的總節數(計分) this.mark = options.mark || 0; //對象的移動方向 this.direction = options.direction || ’right’; //對象的身體(蛇節) this.kont = [{ x: 3, y: 2, color: ’red’ }, { x: 2, y: 2, color: ’black’ }, { x: 1, y: 2, color: ’black’ }]; } //cwen渲染對象 Snake.prototype.render = function(map) { //移除之前的蛇 remove(); //循環輸出對象的身體(蛇節) for (var i = 0, len = this.kont.length; i < len; i++) { var obj = this.kont[i]; var div = document.createElement(’div’); map.appendChild(div); //將蛇節添加入數組 elements.push(div); //添加樣式 div.style.position = ’absolute’; div.style.width = this.width + ’px’; div.style.height = this.height + ’px’; div.style.left = obj.x * this.width + ’px’; div.style.top = obj.y * this.height + ’px’; div.style.backgroundColor = obj.color; } } //cwen控制蛇移動的方法 //todo傳參food,map 在game中調用move方法也要傳入相應參數 Snake.prototype.move = function(food, map) { //控制蛇節的移動(當前蛇節到下一個蛇節的位置) for (var i = this.kont.length - 1; i > 0; i--) { this.kont[i].x = this.kont[i - 1].x; this.kont[i].y = this.kont[i - 1].y; } //判斷并控制蛇頭移動,判斷蛇頭移動方向 var head = this.kont[0]; switch (this.direction) { case ’right’: head.x += 1; break; case ’left’: head.x -= 1; break; case ’top’: head.y -= 1; break; case ’bottom’: head.y += 1; break; } //蛇頭碰到食物時處理 // cwen判斷蛇頭是否和食物坐標重合 var headX = head.x * this.width; var headY = head.y * this.height; if (headX == food.x && headY == food.y) { //1,增加蛇節(找到最后一根蛇節,然后添加給創建的蛇數組) var last = this.kont[this.kont.length - 1]; this.kont.push({ x: last.x, y: last.y, color: last.color }); //cwen求出蛇節的總個數(計分) var mark = this.mark++; //2,重新渲染食物 food.render(map); } } //刪除之前的蛇 function remove() { for (var i = elements.length - 1; i >= 0; i--) { elements[i].parentNode.removeChild(elements[i]); elements.splice(i, 1); } } //把Snake構造函數暴露出去 window.Snake = Snake; })() //測試 // var map = document.querySelector(’.map’); // var snake = new Snake(); // snake.render(map);})

4)game對象編寫,其中一個為無敵版(含細節注釋)

window.addEventListener(’load’, function() { (function() { //改變計時器內this指向 var that; function Game(map) { // var options = { x: 20, y: 20, width: 30, height: 30, color: ’green’ }; this.food = new Food(); this.snake = new Snake(); this.map = map; that = this; } //cwen渲染 Game.prototype.start = function() { // 1.把食物和蛇渲染到頁面 this.food.render(this.map); this.snake.render(this.map); // 2.游戲邏輯編寫 //讓蛇動起來 //判斷地圖邊界 // runSnake(); //todo判斷玩法(兩種模式,原理一樣) goInput(); //通過鍵盤控制蛇頭方向 //! keydown(); //蛇頭碰到食物時處理 //在snake.js中判斷 } function goInput() { var it = prompt(’try:n 經典玩法請按1n 無敵玩法請輸入(博主最帥)n’) if (it == 1) { runSnake(); keydown(); } else if (it == ’博主最帥’) { runSnake1(); keydown1(); } else { alert(’you input could not be found!!!’); goInput(); } } //讓蛇動起來 function runSnake() { var timeId = setInterval(function() { // var a = mark; that.snake.move(that.food, that.map); that.snake.render(that.map); //判斷地圖邊界 var maxX = (that.map.offsetWidth) / that.snake.width; var maxY = (that.map.offsetHeight) / that.snake.height; var headX = that.snake.kont[0].x; var headY = that.snake.kont[0].y; if (headX < 0 || headX >= maxX) { alert(’Game Over ’ + ’得分為 ’ + that.snake.mark); clearInterval(timeId); } else if (headY < 0 || headY >= maxY) { alert(’Game Over ’ + ’成績為 ’ + that.snake.mark); clearInterval(timeId); } }, 150) } //無敵版本蛇運動 function runSnake1() { var timeId1 = setInterval(function() { that.snake.move(that.food, that.map); that.snake.render(that.map); //判斷地圖邊界 var maxX = (that.map.offsetWidth - that.snake.width) / that.snake.width; var maxY = (that.map.offsetHeight - that.snake.height) / that.snake.height; var headX = that.snake.kont[0].x; var headY = that.snake.kont[0].y; if (headX < 0) { that.snake.kont[0].x = (that.map.offsetWidth - that.snake.width) / that.snake.width; } else if (headX > maxX) { that.snake.kont[0].x = 0; } else if (headY < 0) { that.snake.kont[0].y = (that.map.offsetHeight - that.snake.height) / that.snake.height; } else if (headY > maxY) { that.snake.kont[0].y = 0; } }, 50) } //通過鍵盤控制蛇頭方向 function keydown() { document.addEventListener(’keydown’, function(e) { //通過事件對象判斷按了哪個鍵 37left,38top,39right,40bottom // console.log(e.keyCode); //其在走的同時按下反方向無用 if (e.keyCode == 37 && that.snake.direction != ’right’) { that.snake.direction = ’left’; } else if (e.keyCode == 38 && that.snake.direction != ’bottom’) { that.snake.direction = ’top’; } else if (e.keyCode == 39 && that.snake.direction != ’left’) { that.snake.direction = ’right’; } else if (e.keyCode == 40 && that.snake.direction != ’top’) { that.snake.direction = ’bottom’; } }); } function keydown1() { document.addEventListener(’keydown’, function(e) { //通過事件對象判斷按了哪個鍵 37left,38top,39right,40bottom // console.log(e.keyCode); //無敵版本四面八方任你行 if (e.keyCode == 37) { that.snake.direction = ’left’; } else if (e.keyCode == 38) { that.snake.direction = ’top’; } else if (e.keyCode == 39) { that.snake.direction = ’right’; } else if (e.keyCode == 40) { that.snake.direction = ’bottom’; } }); } //把Game開放 window.Game = Game; })()})

5)main開啟游戲

window.addEventListener(’load’, function() { (function(window, undefind) { //測試 var map = document.querySelector(’.map’); var game = new Game(map); game.start(); })(window, undefined)})

last but not least*建議把所有js文件寫在同一個js文件中,可以大大提高加載速度。注意在每個立即執行函數前加上‘ ;’,以免出錯。

小編還為大家準備了精彩的專題:javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 超声波反应釜【百科】-以马内利仪器 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 真空泵厂家_真空泵机组_水环泵_旋片泵_罗茨泵_耐腐蚀防爆_中德制泵 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 电动葫芦|手拉葫芦|环链电动葫芦|微型电动葫芦-北京市凌鹰起重机械有限公司 | 北京西风东韵品牌与包装设计公司,创造视觉销售力! | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | POM塑料_PBT材料「进口」聚甲醛POM杜邦原料、加纤PBT塑料报价格找利隆塑料 | 上海道勤塑化有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 飞行者联盟-飞机模拟机_无人机_低空经济_航空技术交流平台 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 免联考国际MBA_在职MBA报考条件/科目/排名-MBA信息网 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | [官网]叛逆孩子管教_戒网瘾学校_全封闭问题青少年素质教育_新起点青少年特训学校 | elisa试剂盒-PCR试剂盒「上海谷研实业有限公司」 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 酒瓶_酒杯_玻璃瓶生产厂家_徐州明政玻璃制品有限公司 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 海日牌清洗剂-打造带电清洗剂、工业清洗剂等清洗剂国内一线品牌 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 悬浮拼装地板_幼儿园_篮球场_悬浮拼接地板-山东悬浮拼装地板厂家 | 应急灯_消防应急灯_应急照明灯_应急灯厂家-大成智慧官网 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 环氧树脂地坪漆_济宁市新天地漆业有限公司| 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 汽车整车综合环境舱_军标砂尘_盐雾试验室试验箱-无锡苏南试验设备有限公司 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 |