俄罗斯小方块游戏html,通过h5的canvas手写一个俄罗斯方块小游戏
开始自己手写一个好玩的俄罗斯方块吧,上变形,左右移动,下加速,空格瞬移等功能,无聊的时候学习下canvas,f12 修改分数,体验金手指的快乐吧
1、定义界面,和按钮
上
下
左
右
2、js部分
1、先定义每个图形的形状和变化的形状,这里是使用多维数组的方式去保存它图形每个方块的位置(当然这里也可以用循环的方式)
var data=[[[[1,0,0,0],[1,0,0,0],[1,1,0,0],[0,0,0,0]],[[1,1,1,0],[1,0,0,0],[0,0,0,0],[0,0,0,0]],[[1,1,0,0],[0,1,0,0],[0,1,0,0],[0,0,0,0]],[[0,0,1,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]]],
[[[1,0,0,0],[1,1,0,0],[1,0,0,0],[0,0,0,0]],[[1,1,1,0],[0,1,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,1,0],[0,1,1,0],[0,0,1,0],[0,0,0,0]],[[0,0,0,0],[0,1,0,0],[1,1,1,0],[0,0,0,0]]],
[[[0,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,0,0]],[[0,1,1,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],[[0,1,0,0],[0,1,1,0],[0,0,1,0],[0,0,0,0]],[[0,0,0,0],[0,1,1,0],[1,1,0,0],[0,0,0,0]]],
[[[0,1,1,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,1,1,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,1,1,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,1,1,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]]],
[[[0,0,1,0],[0,1,1,0],[0,1,0,0],[0,0,0,0]],[[1,1,0,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]],[[0,0,1,0],[0,1,1,0],[0,1,0,0],[0,0,0,0]],[[1,1,0,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]]],
[[[0,1,0,0],[0,1,0,0],[0,1,0,0],[0,1,0,0]],[[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]],[[0,1,0,0],[0,1,0,0],[0,1,0,0],[0,1,0,0]],[[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]]],
[[[1,1,0,0],[1,0,0,0],[1,0,0,0],[0,0,0,0]],[[1,1,1,0],[0,0,1,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,1,0],[0,0,1,0],[0,1,1,0]],[[0,0,0,0],[0,0,0,0],[1,0,0,0],[1,1,1,0]]]
];
2、定义图形的位置和每帧下落的速度
var newX=120;//记录这个图形的左右位置
var count=0; //记录下落的速度
var shape=0; //记录形状
var finallys=new Array(); //记录落下后停止的位置
var re=6; //获取随机数方块
var fat=1; //每帧的速度
var xyg=0; //下一个方块
var dfen=0;//分数
//定义游戏界面
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
//下个方格的画布
var c2=document.getElementById("Canvas");
var ctx2=c2.getContext("2d");
3、定义组成图形的方法
//组成图形的方法
function constitute(){
var Arr=new Array(); // 存储当前下来的方块位置
var y=0; //记录每个小方块组成图形的小方块y下标--相加
for (var i=0;i
var x=0; //记录每个小方块组成图形的小方块x下标
for (var j=0;j
x+=20;
if(data[re][shape][i][j]==1&&Arr.length<4){ //每个图形都是四个小方块组成
ctx.strokeStyle = "#000";
ctx.strokeRect(x+newX,y+count,20,20);
ctx.fillStyle="#000000"; //定义颜色
ctx.fillRect(x+newX,y+count,19,19); //绘图
var a={
xs:x+newX,
ys:y+count
};
Arr.push(a); //记录图形位置
if(Arr.length==4){ //图形形成后调用掉落完成后重新调用
anew(Arr);
return Arr;
}
}
}
y+=20;
};
}
3、判断掉落是否到底或者碰撞到上一个底部的方块
//掉落完成后重新调用
function anew (arr){
var da=bottom(arr); //调用判断是否到底
if(da==1){ //如果返回1 则已经是到底部,
finallys.push(arr); // 保存在底部的方块,方便碰撞判断
count=0; //恢复成原来的上下位置
newX=120; //恢复原来的左右位置
re=xyg; //当前的方块变成上一个的下一个
xyg=Math.floor(Math.random()*7); //重新随机获取当前的下一个
ctx2.clearRect(0, 0, c.width,c.height); //清除画布
xygs();//重新绘制预知框的
}
}
//判断是否碰到下面的障碍物
function bottom(arr){ //判断是否掉落底部//返回1表示可以保存起来
for (var i =0;i
if(arr[i].ys>=c.height-20){//首先判断是否到界面的底部
/*console.log(arr);*/
return 1;
}
for (var t=0;t
for (var j=0;j
if(finallys[t][j].ys==arr[i].ys+20&&finallys[t][j].xs==arr[i].xs){
/*console.log(arr);*/
return 1;
}
}
}
}
return 0;
}
4、下落到底部后的方块要保存起来,定义重新渲染的方法
//用来组成下标已经堆积的格子
function ground(finallys){
deletes();//判断是否到达顶部了, 顶部了就直接清除重新开始
for (var i=0;i
for (var j=0;j
ctx.strokeStyle = "#000";
ctx.strokeRect(finallys[i][j].xs,finallys[i][j].ys,20,20);
ctx.fillStyle="#000000"; //定义颜色
ctx.fillRect(finallys[i][j].xs,finallys[i][j].ys,19,19); //画图
if(finallys[i][j].ys<=20){
this.finallys=new Array();
count=0;
constitute(); //调用组成画布的方法
/*ctx.clearRect(0, 0, c.width,c.height); //清除画布*/
return;
}
}
}
}
5、当横向一行满了后就可以清楚并得到对应的分数
//判断是否组满一行达到清除的位置
function deletes(){
var c=600;//当前横向的宽度
var add=new Array;//记录宽度的每个方块
for (var i=0;i
c=c-20;
add.push(c);
}
for (var a=0;a
var cou=0;
for (var t=0;t
for (var j=0;j
if(add[a]==finallys[t][j].ys){
cou++;
}
}
}
if(cou>=20){ //如果横向满了调用清除的方法
qc(add[a]);//
cou=0;
}
}
}
//一行满了后清除和上面的向下增加移动
function qc(add){
for (var t=0;t
for (var j=0;j
if(add==finallys[t][j].ys){
finallys[t].splice(j,1);
dfen=dfen+10;
j--;
}
}
}
for (var t=0;t
for (var j=0;j
if(finallys[t][j].ys
finallys[t][j].ys=finallys[t][j].ys+20;
}
}
}
}
6、碰撞检测
//判断不能掉出围起来的范围
function crash(count,e){ //count 下落的位置, e 表示当前是什么按钮操作
var newCount=0; //判断是否有下降的数据有就下降
if(count!=0){
newCount=count;
}
var y=0; //记录组成形状的位置--相加
var r=0;
var make=-1;
for (var i=0;i
var x=0;
for (var j=0;j
x+=20;
if(data[re][shape][i][j]==1){
//防止变形的时候溢出
if(e==38&&x+newX<0||x+newX>c.width-20){
if(x+newX<0){
newX=newX+20;
r=1;
}else{
newX=newX-20;
r=2;
}
}
if(e==38){
if(y+count>c.height-20){
if(shape!=0){
shape=shape-1;
}else{
shape=3;
}
}
}
防止突出右边
if(e==39&&c.width-20
make=1;
}
//防止突出左边
if(e==37&&x+newX-20<0){
make=1;
}
if(y+newCount>c.height-20){
count=count-20;
}
var ys=(y+count)%20; //下落的时候可能会一直按着 速度快会直接插到下面,所以这里要求余,当到这个方块的位置的时候取整判断
var es=20-ys;
var newCount=y+count+es;
for (var t=0;t
for (var j1=0;j1
if(finallys[t][j1].ys==newCount&&finallys[t][j1].xs==x+newX+20&&e==39){
newX=newX-20;
}
if(finallys[t][j1].ys==newCount&&finallys[t][j1].xs==x+newX-20&&e==37){
newX=newX+20;
}
if(finallys[t][j1].ys+20==newCount&&finallys[t][j1].xs==x+newX&&e==38){
if(shape!=0){
shape=shape-1;
}else{
shape=3;
}
if(r==1){
newX=newX-20;
}
if(r==2){
newX=newX+20;
}
}
}
}
}
}
y+=20;
};
if(e==39&&make==-1){
newX=newX+20;
}
if(e==37&&make==-1){
newX=newX-20;
}
}
7、按钮操作
$(document).keydown(function(e){ //电脑键盘的
if(e.keyCode==39){ //右
crash(count,e.keyCode);//判断是否可以加到右边
}else if(e.keyCode==37){ //左
//判断是否可以加到左边
crash(count,e.keyCode);
}else if(e.keyCode==40){ //下
var i=count%10;
count=count-i;
fat=10;
}else if(e.keyCode==38){ //上
shape++;
if(shape>3){
shape=0;
}
crash(count,e.keyCode); //防止变形溢出
}else if(e.keyCode==32){
var i=count%20;
count=count-i;
for (var t=0;t<400;t++) {
count=count+10;
var arr=constitute();
var e=bottom(arr);
if(e==1){
break;
}
}
}
});
手机端的按钮
function under(){
var i=count%10;
count=count-i;
fat=10;
setTimeout(function(){
fat=1;
},100)
}
document.οnkeyup=function(){
fat=1;
}
function tops(){
shape++;
if(shape>3){
shape=0;
}
crash(count,38); //防止变形溢出
}
function lefts(){
//判断是否可以加到左边
crash(count,37);
}
function rights(){
crash(count,39);//判断是否可以加到右边
}
8、定义绘制预知框的方法,如上面绘制的方法一样,只是对应的canvas不同
//预知框里面的绘制
function xygs(){
var y=0; //记录组成形状的位置--相加
for (var i=0;i
var x=0;
for (var j=0;j
x+=20;
if(data[xyg][shape][i][j]==1){
ctx2.strokeStyle = "#000";
ctx2.strokeRect(x+30,y+50,20,20);
ctx2.fillStyle="#000000"; //定义颜色
ctx2.fillRect(x+30,y+50,19,19); //画图
}
}
y+=20;
};
}
9、开始运行的方法
function dy(){
ctx.clearRect(0, 0, c.width,c.height); //清除画布
constitute(); //调用组成画布的方法
count=count+fat; // 下落的速度
ground(finallys); //调用已经在底部的方块的方法
ctx.font="20px 微软雅黑";
ctx.fillText("得分:"+dfen+"",20,30);
requestAnimationFrame(dy); //调用循环运行
}
requestAnimationFrame(dy); //开始运行每一帧
if(finallys.length==0){ //获取第一个预知框
xyg=Math.floor(Math.random()*7);//随机获取
xygs();//调用预知框的渲染
}
constitute()//开始绘制
俄罗斯小方块游戏html,通过h5的canvas手写一个俄罗斯方块小游戏相关推荐
- ES6 手写一个“辨色”小游戏
1. 前言 依稀记得几年前朋友圈流行的辨色小游戏,找出颜色不同的矩形.前些天突发奇想,打算自己手写一个类似的游戏,话不多说,先上 Demo . --项目源码 本实例基于 ES6 实现,并兼容 ie9及 ...
- 在线签名、canvas手写在线签名——小程序端实现在线签名,手写电子签名canvas
在线签名.canvas手写在线签名--小程序端实现在线签名,手写电子签名canvas 近期公司准备接一个政府的小项目,里头有一个在线签名的需求,老板让我研究一下.于是就...开始思考: 在线手写签名, ...
- python俄罗斯方块小游戏实验报告,童年的记忆——如何用python写一个俄罗斯方块小游戏!...
谈到记忆里的小游戏,俄罗斯方块是大家一定会想到的一款游戏,自己写出来的应该玩起来更有感觉,然后就写了一个俄罗斯方块的游戏 给大家分享一下这个游戏的源码 先用python创建一个py文件 定义这次程序所 ...
- python编的俄罗斯方块游戏下载_用python写一个俄罗斯方块小游戏
相信大家都玩过俄罗斯方块吧,应该是小时候的回忆吧,但是想不想了解一下这个程序是怎么写出来的呢,自己写出来的应该玩起来更有感觉吧! 感觉还是蛮好玩吧! 接下来,我就分享一下这个游戏的源码过程啊! 先用p ...
- 2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,
2022-08-02:小红拿到了一个大立方体,该大立方体由111的小方块拼成,初始每个小方块都是白色. 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,你需 ...
- python写一个游戏多少代码-使用Python写一个贪吃蛇游戏实例代码
我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...
- python游戏脚本实例-使用Python写一个贪吃蛇游戏实例代码
我在程序中加入了分数显示,三种特殊食物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,而不是在Snake类中. 特殊食物: 1.绿色:普通,吃了增加体型 2.红色:吃了减少体型 3.金色:吃了回到 ...
- 用 Python 写一个俄罗斯方块游戏
使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 在这篇教程中,我们会用 Python 的 PyGame 库写一个简单的俄罗斯方块游戏.里面的算法很简单,但对新手可能有一点挑战性 ...
- 用shell脚本写一个猜数游戏
用shell脚本写一个猜数游戏 最近用shell写的一个猜数游戏,包括4个不同难度,脚本如下: #作者:p_小王echo '欢迎来到猜数游戏!' while true doread -p '开始/退出 ...
最新文章
- h264中profile和level的含义
- 如何向妻子解释面向对象设计(OOD)
- 数据库索引的实现原理?
- 再降64%,3.5M超轻量中英文OCR模型开源,身量缩减效果提升v4.1
- Zookeeper选举算法( FastLeader选主)
- 下一个嵌入式大神,难道不是你吗?
- java swing事件机制_java SWing事件调用的两种机制
- CSS3选择非第一个子元素
- CozyRSS开发记录8-解析一份RSS
- 你应该知道的 iTerm2 使用方法--MAC终端工具
- 原创内容的17PK飞鸽传书
- python中有数组吗_python里面有数组吗
- php7 void,2.10.PHP7.1 女神级教程-女神的私人信息 -【PHP 函数】
- 医疗大数据技术与应用
- Python数据科学学习进阶
- 如何从iPhoto检索丢失的照片?
- android教务系统框架,基于android的面向学生的移动教务管理系统设计与实现
- 辉哥基于android S 分析过度动画以及窗口动画
- 鸿蒙系统屏幕解锁问题,鸿蒙系统解锁卡退黑屏
- C语言中创建自己函数库文件流程
热门文章
- 2020年什么名字最受欢迎?前面“奕辰”你别走
- 赚票子、调身子、养孩子,陌陌的中年人生活有序展开
- springboot 替换tomcat_Spring Boot实战 之 解剖HelloWorld原型应用
- java邻接表无向图的创建_邻接表无向图(三) 之Java详解
- java 多线程 任务队列_Java并发编程线程池任务队列
- python获取文件编码格式除了chardet还有别的方式吗_使用python的chardet库获得文件编码并修改编码...
- php获得指定位置中间的数据库,PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结...
- 如何在html中添加选择列表,html – 如何在选择列表中添加图像
- python学习必备知识点: 装饰器
- python嵌套列表知多少