首页 > 编程语言 >俄罗斯方块游戏的算法实现

俄罗斯方块游戏的算法实现

时间:2024-07-18 14:44:45浏览次数:13  
标签:__ const 游戏 pos 算法 role roleMap data 方块

已经实现的功能有:

地图功能

方块 向左向右向下移动

方块旋转90、180、270、360

向下移动到底了

未实现的:

向下移动到底,判断是否消除行 随机添加新的方块 游戏结束  
function BinaryBlockGame(width=10,height=10){
    this.role=null
    this.roleMap=null
    this.data=new Array(height)
    for(let i=0;i<height;i++){
        this.data[i]=new Array(width).fill('_')
    }
}
BinaryBlockGame.prototype.sin=function(R){
   
    return Math.round(Math.sin((R)) * 1000000) / 1000000;
}
BinaryBlockGame.prototype.cos=function(R){
  
    return Math.round(Math.cos((R)) * 1000000) / 1000000;
}
//是否能添加方块
BinaryBlockGame.prototype.isCanAdd=function(role){
    const data=this.data
    let isOk=true
    for(let i=0;i<role.length;i++){
        if(data[role[i][1]][role[i][0]]!=="_"){
            isOk=false
            break
        }
    }
    return isOk
}
BinaryBlockGame.prototype.addRole=function(role){
    console.log('start:添加方块\n')
   const isOk=this.isCanAdd(role)
   if(!isOk){
    console.log('fail:不能添加方块,游戏结束')
    return
   }
    const data=this.data
    const temp={}
    role.forEach(function(pos){
        const key=pos.join(',')
        data[pos[1]][pos[0]]="#"
        temp[key]=1
    })
    this.roleMap=temp
    this.role=role

    console.log('ok:添加方块\n',this.toString())
}
//R是弧度
BinaryBlockGame.prototype.isCanRotate=function(R){
    const data=this.data
    const roleMap=this.roleMap
    const role=this.role
    let isOk=true
    const cx=role[0][0]
    const cy=role[0][1]
    for(let i=1;i<role.length;i++){
        const tx=role[i][0]-cx;
        const ty=role[i][1]-cy;

        const nx=tx*this.cos(R)-ty*this.sin(R)+cx
        const ny=tx*this.sin(R)+ty*this.cos(R)+cy
        const key=[nx,ny].join(',')
        if(!(roleMap[key]||data[ny][nx]==='_')){
            isOk=false
            break
        }
    }
    return isOk
}
BinaryBlockGame.prototype.rotate=function(A){
   
    if(!this.role){console.log('不存在可移动的方块')}
    const R=Math.PI*A/180
    const isOk=this.isCanRotate(R)
    console.log('rotate->',A,isOk)
    if(isOk){
        const roleMap=this.roleMap
        const role=this.role
        const data=this.data
        role.forEach(function(pos){
            const key=pos.join(',')
            data[pos[1]][pos[0]]="_"
            roleMap[key]--
        })
        const cx=role[0][0]
        const cy=role[0][1]
        this.role.forEach((pos)=>{
            const tx=pos[0]-cx;
            const ty=pos[1]-cy;

            const nx=tx*this.cos(R)-ty*this.sin(R)+cx
            const ny=tx*this.sin(R)+ty*this.cos(R)+cy
            pos[0]=nx
            pos[1]=ny
            const nkey=pos.join(',')
            data[pos[1]][pos[0]]="#"
            if(!roleMap[nkey]){
                roleMap[nkey]=1
            }else{
                roleMap[nkey]++
            }
        })
        console.log(this.toString())
    }
   
}
BinaryBlockGame.prototype.isCanMove=function(x,y){
    const data=this.data
    const roleMap=this.roleMap
    const role=this.role
    let isOk=true
    for(let i=0;i<role.length;i++){
        const nx=role[i][0]+x
        const ny=role[i][1]+y
        const key=[nx,ny].join(',')
        if(!(roleMap[key]||data[ny]&&data[ny][nx]==='_')){
            isOk=false
            break
        }
    }
    return isOk
}
BinaryBlockGame.prototype.move=function(x,y){
   
    if(!this.role){console.log('不存在可移动的方块')}
    const isOk=this.isCanMove(x,y)
    console.log('move->',x,y,isOk)
    if(isOk){
        const roleMap=this.roleMap
        const data=this.data
        this.role.forEach(function(pos){
            const key=pos.join(',')
            data[pos[1]][pos[0]]="_"
            roleMap[key]--
        })
        this.role.forEach(function(pos){
            pos[0]=pos[0]+x
            pos[1]=pos[1]+y
            const nkey=pos.join(',')
            data[pos[1]][pos[0]]="#"
            if(!roleMap[nkey]){
                roleMap[nkey]=1
            }else{
                roleMap[nkey]++
            }
        })
        console.log(this.toString())
    }else if(y===1){
        console.log('向下移动到底,判断是否消除行,以及添加新的方块')

    }
}


BinaryBlockGame.prototype.toString=function(){
    let str=''
    const data=this.data
    for(let i=0;i<data.length;i++){
        str=str+data[i].join(',')+'\n'
    }
    return str
    
}

const game=new BinaryBlockGame()
//添加方块
game.addRole([[1,2],[1,1],[2,1],[0,1]])
//向左移动
game.move(-1,0)

//向右移动
game.move(1,0)

//向左移动
game.move(-1,0)

//向下移动
game.move(0,1)
//向下移动
game.move(0,1)
//向下移动
game.move(0,1)
//向下移动
game.move(0,1)
//旋转90度
game.rotate(90)
//向下移动
game.move(0,1)
//向下移动
game.move(0,1)
//向下移动
game.move(0,1)

 

C:\Program Files\nodejs\node.exe .\BinaryBlock.js
start:添加方块
ok:添加方块
_,_,_,_,_,_,_,_,_,_
#,#,#,_,_,_,_,_,_,_
_,#,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> -1 0 false
move-> 1 0 true
_,_,_,_,_,_,_,_,_,_
_,#,#,#,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> -1 0 true
_,_,_,_,_,_,_,_,_,_
#,#,#,_,_,_,_,_,_,_
_,#,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> 0 1 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
#,#,#,_,_,_,_,_,_,_
_,#,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> 0 1 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
#,#,#,_,_,_,_,_,_,_
_,#,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> 0 1 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
#,#,#,_,_,_,_,_,_,_
_,#,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> 0 1 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
#,#,#,_,_,_,_,_,_,_
_,#,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
rotate-> 90 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
_,#,#,_,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> 0 1 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
_,#,#,_,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
move-> 0 1 true
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,_,_,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
_,#,#,_,_,_,_,_,_,_
_,_,#,_,_,_,_,_,_,_
move-> 0 1 false
向下移动到底

标签:__,const,游戏,pos,算法,role,roleMap,data,方块
From: https://www.cnblogs.com/caoke/p/18309462

相关文章

  • 几何算法学习 随笔
    和老友聊天有感,随笔记一下。17年业余时间开发结构力学求解器(不完全版),逐步沉淀了几何库的第一版,当时也没想那么多,就是想将大学时候抱着读的结构力学和感兴趣的计算力学实现一下。沉淀的几何库也很简单,基本上是基本的数据结构、矩阵运算和简单的工具函数;在北外、国图、北工大留......
  • 掌握游戏录屏技巧:三种高效方法全解析
    在数字时代,游戏录屏已经成为众多游戏爱好者热衷的一项活动。无论是为了记录自己的精彩操作,还是为了分享给朋友或粉丝,游戏录屏都为我们提供了一个全新的视角去欣赏和回味游戏带来的乐趣。想要制作出精彩的游戏视频,一款优秀的游戏录屏软件是不可或缺的。通过录屏软件,我们可以......
  • 负载均衡算法
    一、算法扩展----哈希算法1.基本概念哈希算法也叫摘要算法,是一种用于加密的算法,其工作原理是对任意一组输入总能得到一个长度固定的计算结果,即将任意数据映射到具体数值。2.特点对于相同输入,hash后结果一定相同 ;对于不同输入,hash后结果大概率不同。3、哈希碰撞(冲突)即两......
  • 【Qt】探索Qt框架:开发经典贪吃蛇游戏的全过程与实践
    文章目录引言项目链接:1.Qt框架的使用简介2.贪吃蛇游戏设计2.1游戏规则和玩法介绍2.2游戏界面设计概述3.核心代码解析3.1主界面(GameHall)3.1.1布局和功能介绍3.1.2代码实现分析3.2游戏选择界面(GameSelect)3.2.1功能介绍3.2.2代码实现分析3.3游戏房间(GameRoom......
  • 算法力扣刷题记录 五十一【654.最大二叉树】
    前言二叉树篇,继续。记录五十一【654.最大二叉树】一、题目阅读给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的......
  • 算法力扣刷题记录 五十【106.从中序与后序遍历序列构造二叉树】和【105.从前序与中序
    前言记录三十八的四、二叉树构建通过层序遍历的数组实现。层序遍历中,某个节点下标是i,那么左孩子的下标2i+1,右孩子的下标2i+2。这是统一的规律。那么通过中序序列和后序序列如何构造二叉树?通过中序序列和前序序列如何构造二叉树?通过前序序列和后序序列如何构造二叉树?一......
  • 广告联盟APP小游戏开发养机
    广告联盟APP小游戏开发中的“养机”主要是指优化广告展示环境,提升广告效果,同时保障用户体验的过程。以下是一些关于广告联盟APP小游戏开发养机的具体建议:明确目标群体:了解游戏玩家的年龄、兴趣爱好以及使用习惯等信息,以便在游戏中植入符合他们需求的广告内容1。选择恰当的广告......
  • Monsters Pack 04(游戏卡通可爱怪兽怪物战士模型)
    以下模型有3种进化形态:捕手战士鱼卫战士骑士战士小鬼战士猴东战士无鼻战士坑娃战士刺头战士树斯特战士楔形战士这些模型是为您的主要角色设计的敌人。进化的每个阶段都会使他变得更加强大,因此您可以用它来增强对手的实力,并作为敌人的boss。它适用于不同类型的游戏......
  • 大模型算法方向实习会经常提问哪些问题? ?
    现互联网研发一枚,曾拿过多个算法/研发岗SPoffer,简要介绍一下大模型算法岗面试内容和如何准备面试。大模型算法岗的面试内容,实际上可以拆解成两部分,一是算法岗通用的面试内容,二是大模型专有相关部分。算法岗通用面试内容这部分内容很重要,因为通用的面试内容可以适用于不同......
  • 提升PHP并行处理效率:深入解析数组排序算法及优化策略
    本文由ChatMoney团队出品在PHP开发中,数组排序是一个常见的操作。随着互联网技术的不断发展,对数据处理速度和效率的要求越来越高,如何在保证排序质量的同时提高处理速度成为了一个值得探讨的问题。本文将分析PHP数组排序算法对并行处理的影响,并提供一些优化建议。一、PHP......