前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【 图形游戏 Tetris 】原生 JavaScript 做小游戏

【 图形游戏 Tetris 】原生 JavaScript 做小游戏

作者头像
QUXINGDONG.COM
发布于 2018-04-17 03:56:51
发布于 2018-04-17 03:56:51
1.2K00
代码可运行
举报
文章被收录于专栏:前端笔记前端笔记
运行总次数:0
代码可运行

俄罗斯方块 (俄罗斯开发经典游戏)

游戏简介

《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。 该游戏曾经被多家公司代理过。经过多轮诉讼后,该游戏的代理权最终被任天堂获得。任天堂对于俄罗斯方块来说意义重大,因为将它与GB搭配在一起后,获得了巨大的成功。《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

名字起源

顾名思义,俄罗斯方块自然是俄罗斯人发明的。这人叫阿列克谢·帕基特诺夫(Алексей Пажитнов 英文:Alexey Pazhitnov)。俄罗斯方块原名是俄语Тетрис(英语是Tetris),这个名字来源于希腊语tetra,意思是“四”,而游戏的作者最喜欢网球(tennis)。于是,他把两个词tetra和tennis合而为一,命名为Tetris,这也就是俄罗斯方块名字的由来。

游戏规则

由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。

代码实现

HTML代码 :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8" />
		<title>俄罗斯方块 — 经典版V10</title>
		<link rel="stylesheet" href="css/tetris.css" />
	</head>

	<body>
		<div class="playground">
			<p>SCORE:<span id="score">0</span></p>
			<p>LINES:<span id="lines">0</span></p>
			<p>LEVEL:<span>1</span></p>
		</div>
		<script src="shape.js"></script>
		<script src="tetris.js"></script>
	</body>

</html>
CSS 代码 :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.playground {
	width: 525px;
	height: 550px;
	margin: 20px auto 0 auto;
	position: relative;
	background-image: url(../img/tetris.png);
}

.pause {
	width: 525px;
	height: 550px;
	position: absolute;
	top: 0;
	left: 0;
	background-image: url(../img/pause.png);
	z-index: 100;
	display: none;
}

.playground img {
	position: absolute;
	z-index: 10;
	width: 26px
}

.playground p {
	font-size: 30px;
	font-family: 'SimHei';
	font-weight: bold;
	color: #667799;
	position: absolute;
	left: 305px;
	top: 120px;
}

.playground p+p {
	top: 176px;
}

.playground p+p+p {
	top: 232px;
}
JS 代码 :
图形Js代码 :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//定义Cell类型描述格子
function Cell(r,c,src){this.r=r; this.c=c; this.src=src;}
//定义父类型Shape描述图形
function Shape(
  r0,c0,r1,c1,r2,c2,r3,c3,src,states,orgi){
  this.cells=[
    new Cell(r0,c0,src),
    new Cell(r1,c1,src),
    new Cell(r2,c2,src),
    new Cell(r3,c3,src),
  ];
  this.states=states;//旋转状态数组
  this.orgCell=this.cells[orgi];//根据下标获得参照格
  this.statei=0;//所有图形的初始状态为0状态
}
//在父类型Shape的原型对象中添加共有方法
Shape.prototype={
  moveDown(){//this->当前图形
    //遍历当前图形的cells数组中每个cell
    for(var i=0;i<this.cells.length;i++)
      this.cells[i].r++;//将当前cell的r+1
  },
  moveLeft(){
    //遍历当前图形的cells数组中每个cell
    for(var i=0;i<this.cells.length;i++)
      this.cells[i].c--;  //将当前cell的c-1
  },
  moveRight(){
    //遍历当前图形的cells数组中每个cell
    for(var i=0;i<this.cells.length;i++)
      this.cells[i].c++;  //将当前cell的c+1
  },
  rotateR(){
    this.statei++;//将statei+1
    //如果statei等于states的个数,将statei改回0
    this.statei==this.states.length&&(this.statei=0);
    this.rotate();
  },
  rotate(){
    //获得states中statei位置的状态对象
    var state=this.states[this.statei];
    //遍历当前图形的cells中每个格
    for(var i=0;i<this.cells.length;i++){
      var cell=this.cells[i];//将当前格临时保存在cell中
      if(cell!=this.orgCell){//如果当前格不是orgCell
        //将cell的r和c,以orgCell的r和c为参照,进行修正
        cell.r=this.orgCell.r+state["r"+i];
        cell.c=this.orgCell.c+state["c"+i];
      }
    }
  },
  rotateL(){
    this.statei--;//将statei-1
    //如果statei等于-1,将statei改回states的length-1
    this.statei==-1
      &&(this.statei=this.states.length-1);
    this.rotate();
  }
}
//定义状态类型State
function State(r0,c0,r1,c1,r2,c2,r3,c3){
  this.r0=r0; this.c0=c0;
  this.r1=r1; this.c1=c1;
  this.r2=r2; this.c2=c2;
  this.r3=r3; this.c3=c3;
}
function T(){//定义子类型T
  Shape.call(this,
    0,3,0,4,0,5,1,4,
    "img/T.png",
    [//四个状态
      new State(0,-1, 0,0,  0,+1,  +1,0),
      new State(-1,0, 0,0,  +1,0,  0,-1),
      new State(0,+1, 0,0,  0,-1,  -1,0),
      new State(+1,0, 0,0,  -1,0,  0,+1)
    ],
    1
  );
}
//设置T的原型继承Shape的原型
Object.setPrototypeOf(T.prototype,Shape.prototype);
//定义子类型I,继承Shape的原型
function I(){
  Shape.call(this,
    0,3,0,4,0,5,0,6,
    "img/I.png",
    [
      new State(0,-1, 0,0,  0,+1,  0,+2),
      new State(-1,0, 0,0,  +1,0,  +2,0),
    ],
    1
  )
}
Object.setPrototypeOf(I.prototype,Shape.prototype);
//定义子类型O,继承Shape的原型
function O(){
  Shape.call(this,
    0,4,0,5,1,4,1,5,
    "img/O.png",
    [
      new State(0,-1,  0,0,  +1,-1,  +1,0)  
    ],
    1
  )
}
Object.setPrototypeOf(O.prototype,Shape.prototype);
行为Js代码 :
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var game={
  OFFSET:15,CSIZE:26,//游戏主界面的内边距和格子大小
  shape:null,//保存主角图形
  pg:null,//保存游戏容器
  interval:200,//保存下落的时间间隔
  timer:null,//保存定时器序号
  CN:10,RN:20,//保存总列数和行数
  wall:null,//保存方块墙
  nextShape:null,//保存备胎图形
  score:0,lines:0,//保存分数和行数
  SCORES:[0,10,30,60,100],
        //0 1  2  3  4
  state:0,//保存游戏状态
  GAMEOVER:0,//游戏结束
  RUNNING:1,//运行中
  PAUSE:2,//暂停
  start(){//游戏启动
    this.state=this.RUNNING;//设置游戏状态为运行中
    this.score=this.lines=0;//分数和行数清零
    this.wall=[];//创建空数组保存在wall中
    //创建一个CN*RN的二维数组
    for(var r=0;r<this.RN;r++){
      this.wall[r]=new Array(this.CN);
    }
    //查找class为playground的div保存在pg属性中
    this.pg=document.querySelector(".playground");
    //新建一个T图形,保存在shape属性中
    this.shape=this.randomShape();
    this.nextShape=this.randomShape();
    this.paint();//重绘一切
    //启动周期性定时器,每隔interval,调用一次moveDown
    this.timer=setInterval(
      this.moveDown.bind(this),this.interval);
    //为document绑定键盘按下事件
    document.onkeydown=function(e){
      switch(e.keyCode){//判断按键号
        case 37: //是37,就左移
          this.state==this.RUNNING
            &&this.moveLeft(); break;
        case 39: //是39,就右移
          this.state==this.RUNNING
            &&this.moveRight(); break;
        case 32: //是32,就一落到底
          this.state==this.RUNNING
            &&this.hardDrop(); break;
        case 40: //是40,就下移
          this.state==this.RUNNING
            &&this.moveDown(); break;
        case 38: //是38,就顺时针旋转
          this.state==this.RUNNING
            &&this.rotateR(); break;
        case 90: //是90,就逆时针旋转
          this.state==this.RUNNING
            &&this.rotateL(); break;
        case 80: //是80,就暂停
          this.state==this.RUNNING
            &&this.pause(); break;
        case 67: //是67,就从暂停状态恢复
          this.state==this.PAUSE
            &&this.myContinue(); break;
        case 81: //是81,就游戏结束
          this.state!=this.GAMEOVER
            &&this.quit(); break;
        case 83: //是83,就重新启动游戏
          this.state==this.GAMEOVER
            &&this.start(); break;
      }
    }.bind(this);
  },
  pause(){
    clearInterval(this.timer);
    this.state=this.PAUSE;
    this.paint();
  },
  myContinue(){
    this.state=this.RUNNING;
    this.timer=setInterval(
      this.moveDown.bind(this),this.interval);
    this.paint();
  },
  quit(){
    this.state=this.GAMEOVER;
    clearInterval(this.timer);
    this.paint();
  },
  randomShape(){//随机生成图形
    //在0~2之间生成随机整数r
    switch(Math.floor(Math.random()*3)){//判断r 
      case 0: return new O();//是0就返回一个新的O
      case 1: return new I();//是1就返回一个新的I
      case 2: return new T();//是2就返回一个新的T
    }
  },
  canRotate(){//旋转后判断是否越界或撞墙
    //遍历shape的cells中每个cell
    for(var i=0;i<this.shape.cells.length;i++){
      //将当前cell临时保存在cell中
      var cell=this.shape.cells[i];
      //如果cell的r<0或>=RN或cell的c<0或>=CN或在wall中相同位置有格
      if(cell.r<0||cell.r>=this.RN
          ||cell.c<0||cell.c>=this.CN
          ||this.wall[cell.r][cell.c]!==undefined)
        return false;//返回false
    }//(遍历结束)
    return true;//返回true
  },
  rotateR(){//顺时针旋转
    this.shape.rotateR();
    if(!this.canRotate())//如果不能旋转
      this.shape.rotateL();
  },
  rotateL(){
    this.shape.rotateL();
    if(!this.canRotate())//如果不能转
      this.shape.rotateR();
  },
  hardDrop(){
    //反复: 只要可以下落,就
    while(this.canDown())
      this.moveDown();//游戏的moveDown
  },
  canLeft(){//判断能否左移
    //遍历shape的cells中每个cell
    for(var i=0;i<this.shape.cells.length;i++){
      //将当前cell另存为
      var cell=this.shape.cells[i];
      //如果cell的c等于0或wall中cell左侧不是undefined
      if(cell.c==0
        ||this.wall[cell.r][cell.c-1]!==undefined)
        return false;//返回false
    }//(遍历结束)
    return true;//返回true
  },
  moveLeft(){//左移
    if(this.canLeft()){//如果可以左移
      //调用shape的moveLeft方法
      this.shape.moveLeft();
      this.paint();//重绘一切
    }
  },
  canRight(){//判断能否右移
    //遍历shape的cells中每个cell
    for(var i=0;i<this.shape.cells.length;i++){
      var cell=this.shape.cells[i];//cell另存为
      //如果cell的c等于CN-1或wall中右侧有格
      if(cell.c==this.CN-1
         ||this.wall[cell.r][cell.c+1]!==undefined)
        return false;//返回false
    }//(遍历结束)
    return true;//返回true
  },
  moveRight(){//右移
    if(this.canRight())//如果可以右移
      this.shape.moveRight();//调用shape的moveRight
      this.paint();//重绘一切
  },
  canDown(){//判断能否下落
    //遍历shape的cells中每个cell
    for(var i=0;i<this.shape.cells.length;i++){
      var cell=this.shape.cells[i];
      //如果cell的r等于RN-1,就返回false
      if(cell.r==this.RN-1) return false;
      //否则,如果wall中cell的下方位置不为undefined,就返回false
      else if(this.wall[cell.r+1][cell.c]!==undefined) 
        return false;
    }//(遍历结束)
    return true;//就返回true
  },
  landIntoWall(){//主角图形落入墙中
    //遍历shape的cells中每个cell
    for(var i=0;i<this.shape.cells.length;i++){
      //将当前cell另存在变量cell中
      var cell=this.shape.cells[i];
      //将cell保存到wall中相同r行c列的位置
      this.wall[cell.r][cell.c]=cell;
    }
  },
  moveDown(){//让主角图形下落一步
    if(this.canDown())//如果可以下落
      this.shape.moveDown();//只改内存,不改页面
    else{//否则
      this.landIntoWall();//旧图形落入墙中
      var ln=this.deleteRows();//删除行
      this.lines+=ln;//将ln累加到总行数上
      this.score+=this.SCORES[ln];
      if(!this.isGameOver()){//如果游戏没有结束
        //将备胎转正,再生成新的备胎
        this.shape=this.nextShape;
        this.nextShape=this.randomShape();
      }else{//否则
        this.quit();//调用quit
      }
    }
    this.paint();//重绘一切
  },
  isGameOver(){
    //遍历备胎图形的cells中每个cell
    for(var i=0;i<this.nextShape.cells.length;i++){
      //将cell另存为cell
      var cell=this.nextShape.cells[i];
      //如果在wall中cell相同位置有格
      if(this.wall[cell.r][cell.c]!==undefined)
        return true;//返回true
    }//(遍历结束)
    return false;//返回false
  },
  deleteRows(){//删除所有满格行
    //自底向上遍历wall中每一行
    for(var r=this.RN-1,ln=0;r>=0&&ln<4;r--){
      //如果当前行是空行,就退出循环
      if(this.wall[r].join("")=="") break;
      //如果当前行是满格,就删除当前行
      if(this.isFullRow(r)){
        this.deleteRow(r);
        r++;//r留在原地继续判断新的r行
        ln++;
      }
    }
    return ln;
  },
  deleteRow(r){//删除第r行
    //从r行开始,反向遍历wall中每一行
    for(;r>=0;r--){
      //将wall中r-1行赋值给r行
      this.wall[r]=this.wall[r-1];
      //将wall中r-1行赋值为CN个空元素的数组
      this.wall[r-1]=new Array(this.CN);
      //遍历wall中r行每个格
      for(var c=0;c<this.CN;c++){
        //如果当前格不是undefined
        if(this.wall[r][c]!==undefined)
          this.wall[r][c].r++;//就将当前格的r+1
      }//(遍历结束)
      //如果wall中r-2行是空行
      if(this.wall[r-2].join("")=="")
        break;//就退出循环
    }
  },
  isFullRow(r){//判断第r行是否满格
    //如果在当前行的字符串中没有找到开头的逗号或结尾的逗号或连续的两个逗号,说明是满格
    return String(this.wall[r]).search(/^,|,,|,$/)==-1
  },
  paintScore(){
    //找到id为score的span,设置其内容为score属性
    document.getElementById("score").innerHTML
      =this.score;
    //找到id为lines的span,设置其内容为lines属性
    document.getElementById("lines").innerHTML
      =this.lines;
  },
  paint(){//重绘一切
    //先清除所有img
    var reg=/<img [^>]+>/g;
    this.pg.innerHTML=
      this.pg.innerHTML.replace(reg,"");
    this.paintShape();//再重绘
    this.paintWall();
    this.paintNext();
    this.paintScore();
    this.paintState();
  },
  paintState(){//根据游戏状态绘制图片
    if(this.state==this.GAMEOVER){
      var img=new Image();
      img.src="img/game-over.png";
      img.style.width="100%";
      this.pg.appendChild(img);
    }else if(this.state==this.PAUSE){
      var img=new Image();
      img.src="img/pause.png";
      img.style.width="100%";
      this.pg.appendChild(img);
    }
  },
  paintNext(){//重绘备胎图形
    //创建文档片段frag
    var frag=document.createDocumentFragment();
    //遍历nextShape中cells数组中每个cell
    for(var i=0;i<this.nextShape.cells.length;i++){
      //将当前cell保存在变量cell中
      var cell=this.nextShape.cells[i];
      var img=this.paintCell(cell,frag);//绘制格
      //设置img的left为当前left+10*CSIZE
      img.style.left=
     parseFloat(img.style.left)+10*this.CSIZE+"px";
      //设置img的top为当前top+CSZIE
      img.style.top=
        parseFloat(img.style.top)+this.CSIZE+"px";
    }//(遍历结束)
    this.pg.appendChild(frag);//将frag追加到pg中  
  },
  paintWall(){//绘制墙
    //创建frag
    var frag=document.createDocumentFragment();
    //自底向上遍历wall中行
    for(var r=this.RN-1;r>=0;r--){
      //如果当前行是空行就退出循环
      if(this.wall[r].join("")=="") break;
      else//否则,就遍历当前行中每一列
        for(var c=0;c<this.CN;c++)
          //如果wall中当前格不是undefined
          if(this.wall[r][c]!==undefined)
            //绘制wall中当前格
            this.paintCell(this.wall[r][c],frag)
    }//(遍历结束)
    this.pg.appendChild(frag);//将frag追加到pg中
  },
  paintCell(cell,frag){
    var img=new Image();//新建一个img
    //设置img的left为OFFSET+CSIZE*cell的c+px
    img.style.left=
      this.OFFSET+this.CSIZE*cell.c+"px";
    //设置img的top为OFFSET+CSIZE*cell的r+px
    img.style.top=
      this.OFFSET+this.CSIZE*cell.r+"px";
    img.src=cell.src;//设置img的src为cell的src
    frag.appendChild(img);//将img追加到frag中
    return img;
  },
  paintShape(){//绘制主角图形
    //创建文档片段frag
    var frag=document.createDocumentFragment();
    //遍历shape中cells数组中每个cell
    for(var i=0;i<this.shape.cells.length;i++){
      //将当前cell保存在变量cell中
      var cell=this.shape.cells[i];
      this.paintCell(cell,frag)//绘制格
    }//(遍历结束)
    this.pg.appendChild(frag);//将frag追加到pg中
  }
}
game.start()

—— 谢谢观看 [ 文章最后编辑于:2017/01/20 ]

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年1月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【 数字游戏 2048 】原生 JavaScript 做小游戏
原生 JavaScript 2048 源码 : <!doctype html> <html> <head> <title>2048</title> <meta charset="utf-8"> <style type="text/css"> body{ margin: 0; padding: 0; } #gridPanel { width: 480px; height: 480px; margin: 0 auto; position: relative; background:
QUXINGDONG.COM
2018/04/17
1.2K0
【 数字游戏 2048 】原生 JavaScript 做小游戏
Java实现俄罗斯方块小游戏。(附完整源代码)
俄罗斯方块是俄罗斯人发明的。这人叫阿列克谢·帕基特诺夫(Алексей Пажитнов 英文:Alexey Pazhitnov)。俄罗斯方块原名是俄语Тетрис(英语是Tetris),这个名字来源于希腊语tetra,意思是“四”,而游戏的作者最喜欢网球(tennis)。于是,他把两个词tetra和tennis合而为一,命名为Tetris,这也就是俄罗斯方块名字的由来。
百思不得小赵
2022/12/01
5.8K1
Java实现俄罗斯方块小游戏。(附完整源代码)
python制作俄罗斯方块
俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。 该游戏曾经被多家公司代理过。经过多轮诉讼后,该游戏的代理权最终被任天堂获得。 [1] 任天堂对于俄罗斯方块来说意义重大,因为将它与GB搭配在一起后,获得了巨大的成功。 [1] 《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
GeekLiHua
2025/01/21
530
python制作俄罗斯方块
Swing俄罗斯游戏编写详解
俄罗斯方块游戏是一个上手简单,老少皆宜的游戏,它的基本规则是移动、旋转和摆放游戏自动产生的各种方块,使之排列成完整的一行或多行并且消除得分。
孟君
2019/09/03
2.1K0
Swing俄罗斯游戏编写详解
60行代码:Javascript 写的俄罗斯方块游戏
原文: http://blog.ithomer.net/2014/05/60-lines-of-code-the-small-javascript-written-in-russia-block-game/
阳光岛主
2019/02/18
7680
Swift 实现俄罗斯方块详细思路解析(附完整项目)
一:写在开发前     俄罗斯方块,是一款我们小时候都玩过的小游戏,我自己也是看着书上的思路,学着用 Swift 来写这个小游戏,在写这个游戏的过程中,除了一些位置的计算,数据模型和理解 Swift 语言之外,最好知道UIKIt框架中的 Quartz2D 这个知识点。是我在简书上面找的,是关于 Quartz2D 这个知识点的,看它我觉得也就够学习。经过这两天的整理,充分觉得在写这些之前,一定要理清楚思路,你可能会花很多时间在它上面,你要知道了,怎么写就变的反而简单了。 二:具体开发思路及主要代码     我
Mr.RisingSun
2018/01/09
1.4K0
Swift 实现俄罗斯方块详细思路解析(附完整项目)
Tetris Game / 俄罗斯方块 JavaScript/TypeScript源码
Tetris Game / 俄罗斯方块 浏览器兼容 ie8+, chrome, firefox ... 小时候穷,买不起游戏机,现在用js写一个来弥补一下童年 →_→ 源码地址:https:/
IMWeb前端团队
2017/12/29
7560
Tetris Game / 俄罗斯方块 JavaScript/TypeScript源码
俄罗斯方块
俄罗斯方块游戏制作教程,一个我考虑了很久要不要发的项目,因为这个项目代码相对来说有点长,大概500行,最为致命的就是逻辑关系很复杂,想要用语言来表达很困难,最后就是文章太长了,5000字的正文啊,写的我手抽筋~
DeROy
2020/05/11
1.6K0
14天学习训练营导师课程|Pygame学习笔记-俄罗斯方块项目代码解析2
用户使用← → ↓箭头键来移动方块,移动方式有3种:左移一格、右移一格、下移一格, 对应的俄罗斯方块坐标变换公式如下: 左移一格:cx1=cx0-1, cy1=cy0 右移一格:cx1=cx0+1, cy1=cy0 下移一格:cx1=cx0, cy1=cy0+1
破晓之翼
2022/12/03
3200
14天学习训练营导师课程|Pygame学习笔记-俄罗斯方块项目代码解析2
使用 Python 和 Pygame 制作游戏:第六章到第八章
贪吃虫是 Nibbles 的克隆。玩家开始控制一个不断在屏幕上移动的短蠕虫。玩家无法停止或减慢蠕虫,但他们可以控制它转向的方向。红苹果随机出现在屏幕上,玩家必须移动蠕虫以使其吃掉苹果。每次蠕虫吃掉一个苹果,蠕虫就会增长一个段,并且新的苹果会随机出现在屏幕上。如果蠕虫撞到自己或屏幕边缘,游戏就结束了。
ApacheCN_飞龙
2024/01/15
6050
使用 Python 和 Pygame 制作游戏:第六章到第八章
俄罗斯方块(C语言实现)
俄罗斯方块相信大家都知道,这里就不再介绍什么游戏背景了,我这里对本代码实现的俄罗斯方块作一些说明:
全栈程序员站长
2022/08/30
1.9K1
俄罗斯方块(C语言实现)
俄罗斯方块c语言源代码_俄罗斯方块C语言
思路: 1.初始化界面,用一个矩阵来保存界面的每一个位置,包括颜色跟数值,数值用来区分是墙还是方块还是空格,便于运行时的判断。
全栈程序员站长
2022/11/17
3.4K0
俄罗斯方块c语言源代码_俄罗斯方块C语言
基于FPGA的“俄罗斯方块”设计(附设计文档)
今天给各位大侠带来基于FPGA的“俄罗斯方块”设计,设计思路以及代码参考文档,各位大侠可以在“FPGA技术江湖”知识星球内获取,如何加入知识星球可以查看如下文章欢迎加入FPGA专业技术交流群、知识星球!(交流群QQ、微信双向选择)。
FPGA技术江湖
2020/12/30
2.2K0
基于 HTML5 的 WebGL 3D 版俄罗斯方块
前言 摘要:2D 的俄罗斯方块已经被人玩烂了,突发奇想就做了个 3D 的游戏机,用来玩俄罗斯方块。。。实现的基本想法是先在 2D 上实现俄罗斯方块小游戏,然后使用 3D 建模功能创建一个 3D 街机模
HT_hightopo
2018/06/04
7310
Python:游戏:300行代码实现俄罗斯方块
俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块。但是想到旋转,停靠,消除等操作,感觉好像很难啊,等真正写完了发现,一共也就 300 行代码,并没有什么难的。
丹枫无迹
2019/01/22
5.9K0
Puyo-Puyo设计文档
Puyo-Puyo设计文档 需求原文: Purpose: ---------- The goal of this exercise is to develop a JAVA or C/C++ version of Puyo-Puyo, a variation of the Tetris game. Rules of Game: --------------- * Spheres come down from the top of the game board in pairs. A player can
逍遥剑客
2018/05/21
6630
C++实现俄罗斯方块(附代码)
  还记得俄罗斯方块吗?相信这是小时候我们每个人都喜欢玩的一个小游戏。顾名思义,俄罗斯方块自然是俄罗斯人发明的。这人叫阿列克谢·帕基特诺夫。他设置这个游戏的规则是:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。
墨明棋妙27
2022/08/24
9.9K4
C++实现俄罗斯方块(附代码)
基于Java的俄罗斯方块游戏的设计与实现
俄罗斯方块项目,基本功能包括:游戏主界面显示模块、方块及数据显示模块、方块移动控制模块、游戏界面颜色控制模块、游戏进度、等级控制模块等。本项目结构如下: (1)游戏主界面显示模块: 显示游戏和帮助两个菜单; 游戏使用功能键盘,得分 等级;
程序员小藕
2020/07/28
2.7K0
基于Java的俄罗斯方块游戏的设计与实现
Tetris
跟着室友搞事情系列,在室友的启发下也准备自己写点什么东西,既然室友写了个华容道,那我就写一个俄罗斯方块吧。
ttony0
2022/12/26
7230
Tetris
【参赛经验分享】腾讯内部赛道-鹅罗斯方块赛事笔记
我在过去,写过不少游戏AI,所以当看到公司有这样一个比赛很是高兴。不巧比赛的两周刚好项目组特别忙,但我仍希望能在有限的时间来做得更好。
Agent
2021/08/20
1K1
【参赛经验分享】腾讯内部赛道-鹅罗斯方块赛事笔记
推荐阅读
相关推荐
【 数字游戏 2048 】原生 JavaScript 做小游戏
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验