HTML5俄罗斯方块网页游戏代码

article/2025/9/25 2:08:07

HTML5俄罗斯方块网页游戏代码 非常好用 代码如下

注意

把所有文件放在一个文件夹里!

把所有css文件夹里,命名'css'

把所有js文件夹里,命名'js'

先看'index.html'

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>俄罗斯方块</title><link rel="stylesheet" type="text/css" href="css/style.css"></head>
<body><div class="game"  id="game"></div><div class="gameOver" id="gameOver"><p>游戏结束啦</p></div><div class="info"><div class="next"  id="next"></div><div class="time"><p>已用时: <span id="time">0</span>s</p><p>已得分: <span id="recode">0</span>分</p></div></div><div class="tips"><p>游戏注释:</p><p>用键盘控制方块的下落和变形</p><p>↑:变形</p><p>←:左移</p><p>↓:下移(有自定义的下落速度)</p><p>→:右移</p><p>空格:速降(会直接到达最下层)</p></div>
</body>
<script type="text/javascript" src="js/square.js"></script>
<script type="text/javascript" src="js/squareFactory.js"></script>
<script type="text/javascript" src="js/game.js"></script>
<script type="text/javascript" src="js/local.js"></script>
<script type="text/javascript" src="js/script.js"></script>
</html>

JS:

  game.js

//游戏核心代码
var Game = function(){//dom元素var gameDiv,nextDiv,scoreDiv;//游戏矩阵var gameData = [[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0]];//当前方块   下一个方块var cur,next;//渲染divvar nextDivs = [];var gameDivs = [];//初始化divvar initDiv = function(initData, initDivArray,elem){for(var i = 0; i < initData.length;  i++){var gameDiv = [];for(var j = 0; j <initData[0].length; j++){var newNode = document.createElement("div");newNode.className = "none";newNode.style.top = (i*20) + "px";newNode.style.left = (j*20) +"px";elem.appendChild(newNode);gameDiv.push(newNode);}initDivArray.push(gameDiv);}}//刷新divvar refresh = function(initData,initDivArray){for(var i = 0; i<initData.length; i++){for(var j = 0; j<initData[0].length; j++){switch(initData[i][j]){case 0:initDivArray[i][j].className = 'none'break;case 1:initDivArray[i][j].className = 'done';break;case 2:initDivArray[i][j].className = 'current';break;default:break;}}}}//检测点是否合法var check = function(pos,x,y){if(pos.x + x < 0){//上边界return false;}else if(pos.x + x >= gameData.length){//下边界return false;}else if(pos.y + y < 0){//左边界return false;}else if(pos.y + y >=gameData[0].length){//右边界return false;}else if(gameData[pos.x + x][pos.y + y] ==1){//位置上已经有完成的方块return false;}else{return true;}}//检测数据是否合理var isValid = function(pos,data){for(var i = 0; i < data.length; i++){for(var j = 0; j <data[0].length; j++){if(data[i][j] != 0){if(!check(pos,i,j)){return false;}}}}return true;}//清除数据var clearData = function(){for(var i = 0; i < cur.data.length; i++){for(var j = 0; j< cur.data[0].length; j++){if(check(cur.origin,i,j)){gameData[cur.origin.x + i][cur.origin.y + j] = 0;}}}}//设置数据,修改方块下落位置var setData = function (){for(var i = 0; i < cur.data.length; i++){for(var j = 0; j< cur.data[0].length; j++){if(check(cur.origin,i,j)){gameData[cur.origin.x + i][cur.origin.y + j] = cur.data[i][j];}}}}//旋转var rotate = function(){if(cur.canRotate(isValid)){clearData();cur.rotate();setData();refresh(gameData,gameDivs);}}//下移var down = function(){//初始化原点位置if(cur.canDown(isValid)){clearData();cur.down();setData();refresh(gameData,gameDivs);return true;}else{return false;}}//右移动var right = function(){if(cur.canRight(isValid)){clearData();cur.right();setData();refresh(gameData,gameDivs);}}//左移动var left = function(){if(cur.canLeft(isValid)){clearData();cur.left();setData();refresh(gameData,gameDivs);}}//方块移动到底部的时候,固定var fixed = function(){for(var i = 0; i <cur.data.length; i++){for(var j=0;j<cur.data[0].length; j++){if(check(cur.origin,i,j)){if(gameData[cur.origin.x + i][cur.origin.y + j] == 2){gameData[cur.origin.x + i][cur.origin.y + j] = 1}}}}refresh(gameData,gameDivs);}//使用下一个方块var performNext = function(){cur = next;setData();next = SquareFactory.prototype.make();refresh(gameData,gameDivs);refresh(next.data,nextDivs)}//消行方法var checkClear = function(){//从底部开始判断,从下往上,遇到一整排符合条件的,删除for(var i =gameData.length -1;i>=0;i--){var clear = true;for(var j =0;j<gameData[0].length; j++){if(gameData[i][j]!==1){clear = false;break;}}if(clear){for(var m=i; m>0;m--){for(var n =0;n<gameData[0].length;n++){gameData[m][n] = gameData[m-1][n]}}for(var n=0;n<gameData[0].length;n++){gameData[0][n] = 0;}setRecord();i++;}}}//判断游戏是否结束var checkGameOver = function(){var gameOver = false;for(var i = 0;i<gameData[0].length;i++){if(gameData[1][i] == 1){gameOver = true;}}return gameOver;		}//初始化var init = function(doms){gameDiv = doms.gameDiv;nextDiv = doms.nextDiv;scoreDiv=doms.recodeDiv;//实例化方块数据cur = SquareFactory.prototype.make();next = SquareFactory.prototype.make();//初始化游戏区的所有方块布局initDiv(gameData,gameDivs,gameDiv);//用div填充游戏区initDiv(next.data,nextDivs,nextDiv);//用div填充待出现方块区//在game游戏区更新掉落方块的位置。所以就是需要把当前方块的位置赋值到game游戏区的对应位置。setData();//刷新游戏区方块布局refresh(gameData,gameDivs);refresh(next.data,nextDivs);}//设置分数var record = 0;var setRecord = function(){record++;scoreDiv.innerHTML = record;}//导出APIthis.init = init;this.down = down;this.right = right;this.left = left;this.rotate = rotate;this.fall= function(){while(down()){down();}return false;}this.fixed = fixed;this.performNext = performNext;this.checkClear = checkClear;this.checkGameOver = checkGameOver;
}

    local.js

// 本地游戏区
var Local = function(){//游戏对象var game;//定时器var timer = null;//时间间隔var INITERVAL = 600;//计时效果timeCount = 0;//时间var time = 0;//绑定键盘事件var bindKeyEvent = function(){document.onkeydown = function(e){switch(e.keyCode){case 32://space;game.fall();break;case 37://left;game.left();break;case 38://top 切换形态game.rotate();break;case 39://right;game.right();break;case 40://down;game.down();break;default :break;}}}//移动var move = function(){if(!game.down()){game.fixed();//判断是否固定游戏块game.checkClear();//判断是否清行if(game.checkGameOver()){//判断游戏是否结束stop();}else{game.performNext();}}}//计时函数var timeunc = null;var timeFunc = function(doms){timeunc = setInterval(function(){time++;doms.timeDiv.innerHTML = time;},1000) ;}//设置时间//开始var start = function(){var doms = {gameDiv :document.getElementById("game"),nextDiv :document.getElementById("next"),recodeDiv :document.getElementById("recode"),timeDiv :document.getElementById("time")}game = new Game();game.init(doms);bindKeyEvent();//计时系统timeFunc(doms);//定时器效果,方块自由下落效果timer = setInterval (move ,INITERVAL) }//结束var stop = function(){if(timer){clearInterval(timer);timer = null;}if(timeunc){clearInterval(timeunc);timeunc = null;}document.onkeydown = null;document.getElementById("gameOver").style.display = "block";}//导出APIthis.start = start;
}

  remote.js    不要漏掉这个

// 对战玩家游戏区

  script.js       不要漏掉这个

var local = new Local();
local.start();

  square.js

// 方块处理 左移,右移,旋转,下落。
var Square = function(){//方块数据this.data = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];//原点this.origin = {x : 0,y : 3};//旋转数组this.totates =function(data){var sArray=[	[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];for(var i = 0;i < data.length; i++){var newIndex =3-i;for(var j =0; j <data[0].length; j++){sArray[j][newIndex] = data[i][j]}}return sArray;}
}
Square.prototype.canRotate = function(isValid){
/*	this.data = this.totates(this.data);*/return isValid(this.origin,this.totates(this.data));
}
Square.prototype.rotate = function(isValid){this.data = this.totates(this.data);
}
Square.prototype.canDown = function(isValid){var test = {};test.x = this.origin.x + 1;test.y = this.origin.y;return isValid(test,this.data);
}
Square.prototype.down = function(){this.origin.x = this.origin.x+1;
}
Square.prototype.canRight = function(isValid){var test = {};test.x = this.origin.x ;test.y = this.origin.y +1;return isValid(test,this.data);
}
Square.prototype.right = function(){this.origin.y = this.origin.y + 1;
}
Square.prototype.canLeft = function(isValid){var test = {};test.x = this.origin.x ;test.y = this.origin.y - 1;return isValid(test,this.data);
}
Square.prototype.left = function(){this.origin.y = this.origin.y - 1;
}

  squareFactory.js

//负责生成方块,代码生成工厂
//七种不同类型的方块/*** 口* 口* 口* 口*/var Square1 = function(){Square.call(this)//方块数据this.data = [[0,2,0,0],[0,2,0,0],[0,2,0,0],[0,2,0,0]];}Square1.prototype = Square.prototype;/*var square1 = [[0,2,0,0],[0,2,0,0],[0,2,0,0],[0,2,0,0]];*//*** 	口 * 口口口*//*var square2 = [[0,2,0,0],[2,2,2,0],[0,0,0,0],[0,0,0,0]];*/var Square2 = function(){Square.call(this)//方块数据this.data = [[0,2,0,0],[2,2,2,0],[0,0,0,0],[0,0,0,0]];}Square2.prototype = Square.prototype;/*** 口口* 口口*//*var square3 = [[0,0,0,0],[0,2,2,0],[0,2,2,0],[0,0,0,0]];*/var Square3 = function(){Square.call(this)//方块数据this.data = [[0,0,0,0],[0,2,2,0],[0,2,2,0],[0,0,0,0]];}Square3.prototype = Square.prototype;/***    口* 口口口*//*var square4 = [[0,0,2,0],[2,2,2,0],[0,0,0,0],[0,0,0,0]];*/var Square4 = function(){Square.call(this)//方块数据this.data = [[0,0,2,0],[2,2,2,0],[0,0,0,0],[0,0,0,0]];}Square4.prototype = Square.prototype;/*** 口口* 口* 口*//*var square5 = [[2,2,0,0],[2,0,0,0],[2,0,0,0],[0,0,0,0]];*/var Square5 = function(){Square.call(this)//方块数据this.data = [[2,2,0,0],[2,0,0,0],[2,0,0,0],[0,0,0,0]];}Square5.prototype = Square.prototype;/*** 口口*  口口*//*var square6 = [[0,2,2,0],[0,0,2,2],[0,0,0,0],[0,0,0,0]];*/var Square6 = function(){Square.call(this)//方块数据this.data = [[0,2,2,0],[0,0,2,2],[0,0,0,0],[0,0,0,0]];}Square6.prototype = Square.prototype;/***  口口* 口口*//*var square7 = [[0,0,2,2],[0,2,2,0],[0,0,0,0],[0,0,0,0]];*/var Square7 = function(){Square.call(this)//方块数据this.data = [[0,0,2,2],[0,2,2,0],[0,0,0,0],[0,0,0,0]];}Square7.prototype = Square.prototype;var SquareFactory = function(){}SquareFactory.prototype.make = function(){var index = Math.ceil(Math.random()*7);var s;switch(index){case 1:s = new Square1();break;case 2:s = new Square2();break;case 3:s = new Square3();break;case 4:s = new Square4();break;case 5:s = new Square5();break;case 6:s = new Square6();break;case 7:s = new Square7();break;default :break;}return s;}

css部分 就一个

  style.css

*{padding: 0px;margin: 0px;
}
body{padding: 10px;
}
.game{position: relative;width: 200px;height: 400px;background-color: #f2faff;border-width: 0 1px 1px ;border-style: solid;border-color: green;display: inline-block;
}
.gameOver{width: 200px;height: 400px;background:rgba(0,0,0,.5);position: absolute;top: 10px;left: 10px;text-align: center;display: none;
}
.gameOver>p{color: #fff;margin-top: 180px;
}
.next{width: 80px;height: 80px;position: relative;border: 1px solid green;vertical-align: top;background-color: #f2faff;display: inline-block;
}
.info{/*border:1px solid red;*/padding-left: 50px;display: inline-block;/*width: 80px;*/vertical-align: top;
}
.time{margin-top: 20px;	
}
/*定义div样式*/
.none,.current,.done{height: 20px;width: 20px;position: absolute;box-sizing: border-box;
}
.none{background: #f2faff;
}
.current{background-color: pink;border:1px solid red;
}
.done{background-color: gray;border:1px solid #000;
}
.tips{border: 1px solid green;background: yellowgreen;/*color: #fff;*/display: inline-block;vertical-align: top;margin-left: 45px;padding: 10px;border-radius: 6px;
}

好了就到这里了

希望大家自己理解吧


http://chatgpt.dhexx.cn/article/dGKoU3Og.shtml

相关文章

俄罗斯方块C++语言代码

大家都知道俄罗斯方块&#xff0c;就是控制不同的方块旋转&#xff0c;通过摆满一行方块消除得分&#xff0c;今天就让我们用C制作一个俄罗斯方块小游戏。 首先定义方块&#xff1a; int block00[4][4] { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } }; int block01[…

c++俄罗斯方块 完整源代码

文章目录 1. 功能描述2. 源代码3. 运行截图4. 结尾 1. 功能描述 2. 源代码 #include<iostream> #include<string> #include<cstdlib> #include<windows.h> #include<ctime> #include<conio.h> #include<cstdio> using namespace st…

俄罗斯方块游戏代码

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽…

C语言实现俄罗斯方块

目录 一、游戏效果展示 二、完整代码&#xff0c;可以直接拷贝运行 三、所需开发环境 四、具体项目实现 ①游戏欢迎界面 welcome( ) ②游戏背景 initGameScreen( ) ③方块表示 int block[ ][ ][ ] ④新方块表示nextBlock( ) ⑤设计游戏循环main( ) ⑥搭建用户操作框…

❤️VS Code❤️,cmd终端窗口运行,解决中文乱码问题

目录 问题归纳VS Code默认终端配置window窗口弹出相关解释 解决中文乱码问题运行俄罗斯方块程序 问题归纳 在软件Visual Studio中一切都是配置好的&#xff0c;默认终端运行采用弹出cmd窗口形式。而在VS Code中除了一些默认的配置设置外&#xff0c;所有环境配置、界面显示等操…

俄罗斯方块(C语言实现)

文章目录 游戏说明游戏效果展示游戏代码游戏代码详解游戏框架构建隐藏光标光标跳转初始化界面初始化方块信息颜色设置画出方块空格覆盖合法性判断判断得分与结束游戏主体逻辑函数从文件读取最高分更新最高分到文件主函数 游戏说明 俄罗斯方块相信大家都知道&#xff0c;这里就…

IDEA 设置类注释模板

效果展示 步骤&#xff1a;File-->settings-->Editor-->File and Code Templates-->Files 选择Class文件&#xff08;当然你要设置接口的还也可以选择Interface文件&#xff09;

设置idea类注释模板

1.File-->Settings...&#xff0c;或者直接按快捷键CtrlAltS. 2. Editor-->File and Code Templates-->Includes-->File Header,根据右下角Description的提示&#xff0c;添加自己需要的注释。 3.在右侧空白处设置自己的模板&#xff0c;若提示cant parse class.可…

IDEA 创建类注释模板设置

1.idea类注释 打开&#xff1a;file->setting->Editor->Filr and Code Templates->Includes->File Header 类注释模板&#xff1a; /** * title: ${NAME}* projectName ${PROJECT_NAME}* description: TODO* author ${USER}* date ${DATE}${TIME}*/ 2.方法注释…

java idea 配置注释模板

java idea 配置注释模板 最近项目组在加强代码规范管理。代码优雅从代码注释开始。奥力给&#xff01;&#xff01;&#xff01; 类注释的 File >> Settings >> Editor >> File and code Templates >> Files >> class 上图中的模板内容如下&…

idea类注释模板,方法注释模板。

idea设置--实时模板 新建组 类模板 /*** description $description$* author YJJ* date $date$ $time$* version 1.0*/ 方法模板 ** * description $description$ $params$ $return$* author YJJ* date $date$ $time$*/ params脚本&#xff1a; groovyScript("def r…

IDEA代码注释模板

存在问题: 每次写代码&#xff0c;新建类都没有注释&#xff0c;这对一个拥有代码强迫症患者来说&#xff0c;是多么不爽的一件事&#xff0c;不利于开发和后期问题排查 举个例子&#xff1a; 上次写代码的时候&#xff0c;这一段只有我和上帝知道&#xff0c;而现在&#xff0…

idea添加注释模板

自动添加描述 class // 创建时间有的也没有 仅仅就是class的描述信息&#xff0c;看个人公司情况吧&#xff0c;描述信息最好创建时间有一个空行&#xff0c;我忘记了/** * 描述信息 * * create: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE} */method // 一会要写入模板的内…

【idea生成类注释模板快捷键设置】

idea类注释模板快捷键 设置在方法上生成注释的快捷键1&#xff0c;ctrlaltS打开idea设置设置模板中的参数取值来源使用效果展示 设置在方法上生成注释的快捷键 1&#xff0c;ctrlaltS打开idea设置 设置模板中的参数取值来源 使用效果展示

IntelliJ IDEA类和方法注释模板配置

1、设置文件注释 设置Java类的注释模板&#xff0c;创建Java类自动生成该注释模板。 先看文件注释效果&#xff1a; 1.1、选择 IntelliJ IDEA —> 选择 Preferences... 打开IDEA属性设置面板 1.2、选择 File Code Templates—>选择 Includes 选项卡—>选择 File He…

IDEA配置方法类注释模板

IDEA配置方法类注释模板 IDEA20.1配置方法注释注释的种类注释使用规范 摘自阿里开发手册 IDEA方法模板注释一、打开idea 点击菜单File->Setting-Editor->Live Template二、选择Live Template 添加快键键缩写注释模板代码三、配置Edit variables四、配置入参和返回字段的d…

IDEA类和方法注释模板配置

1、类的注释模板配置 File-->Settings-->Editor-->File and Code Templates-->File --->Class: 模板代码下所示&#xff1a; /*** ClassName: ${NAME}* Author : ${USER}* Date :${DATE} ${TIME}* Description: TODO* Version :1.0*/ 上述${NAME}为类名&…

IDEA方法注释模板设置

IDEA类和方法注释模板设置 1、File–>Settings–>Editor–>Live Templates &#xff08;1&#xff09;新建组&#xff1a;命名为userDefine &#xff08;2&#xff09;新建模板&#xff1a;选中你刚才创建的组&#xff0c;然后右上角新建模板&#xff0c;命名为* &…

IDEA注释模板配置

最初&#xff0c;从Eclipse转到IDEA&#xff0c;总是不习惯IDEA的注释方式&#xff0c;所以在网上找来找去加上自己的测试&#xff0c;终于形成一套相对详细的配置流程。之前每次用到都靠收藏里的别人文章应付&#xff0c;但是在配置新的开发环境或者有新的小组成员加入时总要用…

IDEA类文档注释模板设置

IDEA类文档注释模板设置&#xff1a; 在【File and Code Templates】页面设置类&#xff08;Class&#xff09;的文档注释 . 注意&#xff1a;public class ${NAME} {}一定不能删 /***ClassName ${NAME}*Description TODO*Author ${USER}*Date ${DATE} ${TIME}*Version 1.0*…