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

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

js canvas實現俄羅斯方塊

瀏覽:123日期:2024-04-17 13:42:07

本文實例為大家分享了canvas實現俄羅斯方塊的具體代碼,供大家參考,具體內容如下

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title></head><body style='margin: 0;'> <canvas style='border: 1px solid #000;'></canvas> <div style=’color: red;font-size: 30px;’>當前分數:0</div></body><script> let cav = document.getElementById(’tetris’) let text = document.getElementById(’text’) let ctx = cav.getContext(’2d’) let k = 40 //倍數 let speed = 1000 let grade = 0 let restartFlag = false let timer = null let curGraphPositionList = [] let curtype = undefined let transformNum = 0 let blockGraph = Array(10) let beforeUpdateGraph = [] for(let i = 0;i<blockGraph.length;i++){ blockGraph[i] = Array(20) } cav.width = 10*k cav.height = 20*k ctx.fillStyle='yellow' ctx.strokeStyle='black' function ramdomRectType(){ return Math.floor((Math.random()*7)+1) } function randomXposition(){ return Math.floor(Math.random()*10) } function drawRect(position,width){ ctx.beginPath() ctx.rect(position[0],position[1],width,width) ctx.fill(); ctx.stroke() } function drawGraph(positionList){ if(positionList.length===0){ return } for(let item of positionList){ let x= item[0]*k let y= item[1]*k let position = [x,y] drawRect(position,k) } } function isOut(position,xOry){//x:0,y:1 if(xOry===0){ if(position<0||position>9){ return true }else{ return false } }else{ if(position<0||position>19){ return true }else{ return false } } } function randomRectShape(){ let rposition = randomXposition() let type = ramdomRectType() curtype = type transformNum = 0 let positionList = [] let one = [] let two = [] let three = [] let four = [] switch(type){ case 1: if(isOut(rposition+2,0)){ return randomRectShape() }else{ one = [rposition+2,0] two = [rposition,1] three = [rposition+1,1] four = [rposition+2,1] } break; case 2: if(isOut(rposition+2,0)){ return randomRectShape() }else{ one = [rposition,0] two = [rposition,1] three = [rposition+1,1] four = [rposition+2,1] } break; case 3: if(isOut(rposition+2,0)){ return randomRectShape() }else{ one = [rposition+1,0] two = [rposition+2,0] three = [rposition,1] four = [rposition+1,1] } break; case 4: if(isOut(rposition+2,0)){ return randomRectShape() }else{ one = [rposition,0] two = [rposition+1,0] three = [rposition+1,1] four = [rposition+2,1] } break; case 5: if(isOut(rposition+2,0)){ return randomRectShape() }else{ one = [rposition+1,0] two = [rposition,1] three = [rposition+1,1] four = [rposition+2,1] } break; case 6: if(isOut(rposition+1,0)){ return randomRectShape() }else{ one = [rposition,0] two = [rposition+1,0] three = [rposition,1] four = [rposition+1,1] } break; case 7: if(isOut(rposition+3,0)){ return randomRectShape() }else{ one = [rposition,0] two = [rposition+1,0] three = [rposition+2,0] four = [rposition+3,0] } break; } positionList.push(one,two,three,four) return positionList } function clearRect(position,width){ ctx.clearRect(position[0]*k-1,position[1]*k-1,width+2,width+2) } function clearGraph(curGraphPositionList){ if(curGraphPositionList.length===0){ return } for(let item of curGraphPositionList){ clearRect(item,k) } } function clearGraphList(){ let graphList = [] for(let i = 0;i< blockGraph.length;i++){ for(let j =0;j< blockGraph[i].length;j++){ if(blockGraph[i][j]===1){ graphList.push([i,j]) } } } clearGraph(graphList) } function isTouchOtherBlock(position){ return blockGraph[position[0]][position[1]] === 1 } function updateBlockGraph(graphPositionList){ for(let i =0;i<graphPositionList.length;i++){ let x = parseInt(graphPositionList[i][0]) let y = parseInt(graphPositionList[i][1]) blockGraph[x][y] = 1 } let transformArray = [] for(let i=0;i<20;i++){ let arr = blockGraph.map((item)=>{ return item[i] }) transformArray.push(arr) } let flagList = [] for(let i in transformArray){ let flag = 1 for(let j in transformArray[i]){ if(transformArray[i][j]!==1){ flag = 0 break } } flagList.push(flag) } let score = flagList.filter((item)=>{ return item === 1 }) if(score.length>0){ grade = grade + score.length text.innerHTML = ’當前分數:’+grade for(let i in transformArray){ if(flagList[i]===1){ for(let j in transformArray[i]){ transformArray[i][j]=undefined } } } let hasBlockList = [] for(let i in transformArray){ let flagOfHasBlock = 0 for(let j in transformArray[i]){ if(transformArray[i][j]!==undefined){ flagOfHasBlock = 1 break } } hasBlockList.push(flagOfHasBlock) } for(let i = transformArray.length -1 ;i>=0;i--){ if(hasBlockList[i]===1){ let count = 0 for(let j = i ;j<19;j++){ if(hasBlockList[j+1]===0){ count++ }else{ break } } if(count===0){ continue } for(let j in transformArray[i]){ if(transformArray[i][j]===1){ transformArray[i][j] = undefined transformArray[i+count][j] = 1 } } hasBlockList[i]=0 hasBlockList[i+count]=1 } } let newBlockGraph = [] for(let i=0;i<10;i++){ let arr = transformArray.map((item)=>{ return item[i] }) newBlockGraph.push(arr) } clearGraphList() blockGraph = newBlockGraph } } function movePosition(curGraphPositionList,direct){ switch(direct){ case ’left’: let minL = Math.min(...curGraphPositionList.map((item)=>{ return item[0] })) if(minL-1<0){ return curGraphPositionList }else{ let changeFlag = true let next = curGraphPositionList.map((item)=>{ return [item[0]-1,item[1]] }) for(let item of next){ if(isTouchOtherBlock(item)){ changeFlag = false } } if(changeFlag){ return next }else{ return curGraphPositionList } } break; case ’right’: let maxR = Math.max(...curGraphPositionList.map((item)=>{ return item[0] })) if(maxR+1>9){ return curGraphPositionList }else{ let changeFlag = true let next = curGraphPositionList.map((item)=>{ return [item[0]+1,item[1]] }) for(let item of next){ if(isTouchOtherBlock(item)){ changeFlag = false } } if(changeFlag){ return next }else{ return curGraphPositionList } } break; case ’down’: let maxD = Math.max(...curGraphPositionList.map((item)=>{ return item[1] })) if(maxD>18){ updateBlockGraph(curGraphPositionList) restartFlag = true return curGraphPositionList }else{ let changeFlag = true let next = curGraphPositionList.map((item)=>{ return [item[0],item[1]+1] }) for(let item of next){ if(isTouchOtherBlock(item)){ changeFlag = false } } if(changeFlag){ return next }else{ updateBlockGraph(curGraphPositionList) restartFlag = true return curGraphPositionList } } break; } } function checkOver(positionList){ for(let i in positionList){ let x = positionList[i][0] let y = positionList[i][1] if(blockGraph[x][y]===1){ over() alert(’游戲結束’) return true } } return false } function drawGraphList(){ let graphList = [] for(let i = 0;i< blockGraph.length;i++){ for(let j =0;j< blockGraph[i].length;j++){ if(blockGraph[i][j]===1){ graphList.push([i,j]) } } } drawGraph(graphList) } function isComplexData (data) { if(data===null||data===undefined){ return false } let flag = data.constructor===Array||data.constructor===Object return flag } function deepCopy (data) { if(!isComplexData (data)){ return data } let result = null if(data.constructor===Array){ result = [] }else{ result = {} } for(let i in data){ result[i] = deepCopy (data[i]) } return result } function move(direct){ clearGraph(curGraphPositionList) curGraphPositionList = movePosition(curGraphPositionList,direct) if(restartFlag){ drawGraphList(blockGraph) }else{ drawGraph(curGraphPositionList) } } function transform (curtype) { let checkArr = deepCopy(curGraphPositionList) if(transformNum>=3){ transformNum = 0 }else{ transformNum++ } switch(curtype){ case 1: caseOne(checkArr) break; case 2: caseTwo(checkArr) break; case 3: caseThree(checkArr) break; case 4: caseFour(checkArr) break; case 5: caseFive(checkArr) break; case 6: caseSix(checkArr) break; case 7: caseSeven(checkArr) break; } //start check outside let outflag = false let xArr = checkArr.map((item)=>{ return item[0] }) let yArr = checkArr.map((item)=>{ return item[1] }) for(let item of xArr){ if(isOut(item,0)){ outflag = true } } for(let item of yArr){ if(isOut(item,1)){ outflag = true } } if(outflag){ if(transformNum<=0){ transformNum = 3 }else{ transformNum-- } return } //end check if(!checkTranfromTouchBlock(checkArr)){ if(transformNum<=0){ transformNum = 3 }else{ transformNum-- } return }else{ clearGraph(curGraphPositionList) curGraphPositionList = checkArr drawGraph(curGraphPositionList) } } function checkTranfromTouchBlock(checkArr){ let changeFlag = true for(let item of checkArr){ if(isTouchOtherBlock(item)){ changeFlag = false } } return changeFlag } function caseOne(checkarr){ switch(transformNum){ case 0: checkarr[0][0]=checkarr[0][0]+2 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]+1 break; case 1: checkarr[0][1]=checkarr[0][1]+2 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]+1 break; case 2: checkarr[0][0]=checkarr[0][0]-2 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]-1 break; case 3: checkarr[0][1]=checkarr[0][1]-2 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]-1 break; } } function caseTwo(checkarr){ switch(transformNum){ case 0: checkarr[0][1]=checkarr[0][1]-2 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]+1 break; case 1: checkarr[0][0]=checkarr[0][0]+2 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]+1 break; case 2: checkarr[0][1]=checkarr[0][1]+2 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]-1 break; case 3: checkarr[0][0]=checkarr[0][0]-2 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]-1 break; } } function caseThree(checkarr){ if(transformNum%2!==0){ checkarr[0][0]=checkarr[0][0]+1 checkarr[0][1]=checkarr[0][1]+1 checkarr[1][1]=checkarr[1][1]+2 checkarr[2][0]=checkarr[2][0]+1 checkarr[2][1]=checkarr[2][1]-1 }else{ checkarr[0][0]=checkarr[0][0]-1 checkarr[0][1]=checkarr[0][1]-1 checkarr[1][1]=checkarr[1][1]-2 checkarr[2][0]=checkarr[2][0]-1 checkarr[2][1]=checkarr[2][1]+1 } } function caseFour(checkarr){ if(transformNum%2!==0){ checkarr[0][0]=checkarr[0][0]+2 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]+1 }else{ checkarr[0][0]=checkarr[0][0]-2 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]-1 } } function caseFive(checkarr){ switch(transformNum){ case 0: checkarr[0][0]=checkarr[0][0]+1 checkarr[0][1]=checkarr[0][1]-1 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]+1 break; case 1: checkarr[0][0]=checkarr[0][0]+1 checkarr[0][1]=checkarr[0][1]+1 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]+1 break; case 2: checkarr[0][0]=checkarr[0][0]-1 checkarr[0][1]=checkarr[0][1]+1 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]-1 break; case 3: checkarr[0][0]=checkarr[0][0]-1 checkarr[0][1]=checkarr[0][1]-1 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]-1 break; } } function caseSix(checkarr){ return } function caseSeven(checkarr){ if(transformNum%2!==0){ checkarr[0][0]=checkarr[0][0]+2 checkarr[0][1]=checkarr[0][1]-2 checkarr[1][0]=checkarr[1][0]+1 checkarr[1][1]=checkarr[1][1]-1 checkarr[3][0]=checkarr[3][0]-1 checkarr[3][1]=checkarr[3][1]+1 }else{ checkarr[0][0]=checkarr[0][0]-2 checkarr[0][1]=checkarr[0][1]+2 checkarr[1][0]=checkarr[1][0]-1 checkarr[1][1]=checkarr[1][1]+1 checkarr[3][0]=checkarr[3][0]+1 checkarr[3][1]=checkarr[3][1]-1 } } function setTimer(speed) { clearInterval(timer) timer = setInterval(()=>{ move(’down’) if(restartFlag){ newBlock() } },speed) } function newBlock(){ restartFlag = false curGraphPositionList = randomRectShape() drawGraph(curGraphPositionList) let overflag = checkOver(curGraphPositionList) if(overflag){ return } setTimer(speed) } function start() { newBlock() } function over() { clearInterval(timer) } start() let pauseFlag = false document.addEventListener(’keydown’,(event)=>{ if(event.keyCode===37){ move(’left’) }else if(event.keyCode===39){ move(’right’) }else if(event.keyCode===40){ speed=30 setTimer(speed) }else if(event.keyCode===32){ pauseFlag = !pauseFlag if(pauseFlag){ over() }else{ setTimer(speed) } }else if(event.keyCode===38){ // clearGraph(curGraphPositionList) transform (curtype) } }) document.addEventListener(’keyup’,(event)=>{ if(event.keyCode===40){ speed=1000 setTimer(speed) } })</script></html>

更多有趣的經典小游戲實現專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

javascript經典小游戲匯總

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

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 线材成型机,线材折弯机,线材成型机厂家,贝朗自动化设备有限公司1 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 汕头市盛大文化传播有限公司,www.11400.cc | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 陕西华春网络科技股份有限公司 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 天津货架厂_穿梭车货架_重型仓储货架_阁楼货架定制-天津钢力仓储货架生产厂家_天津钢力智能仓储装备 | 纯水设备_苏州皙全超纯水设备水处理设备生产厂家 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 米顿罗计量泵(科普)——韬铭机械| 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 防潮防水通风密闭门源头实力厂家 - 北京酷思帝克门窗 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 福建成考网-福建成人高考网| 解放卡车|出口|济南重汽|报价大全|山东三维商贸有限公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 金库门,金库房,金库门厂家,金库门价格-河北特旺柜业有限公司 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 比亚迪叉车-比亚迪电动叉车堆垛车托盘车仓储叉车价格多少钱报价 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 精密模具-双色注塑模具加工-深圳铭洋宇通 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 |