可以用手挪下载俄罗斯方块游戏的那个游戏叫什么。

用链表或者数组实现俄罗斯方块(控制台界面)的时候,移动指令会有较高延迟才会执行,而且与sleep的参数无关,求教大神(最好能说一下具体原因) - 开源中国社区
当前访客身份:游客 [
当前位置:
用链表或者数组实现俄罗斯方块(控制台界面)的时候,移动指令会有较高延迟才会执行,而且与sleep的参数无关,求教大神(最好能说一下具体原因)
---------------问题补充---------------
:错了,是贪吃蛇
共有3个答案
<span class="a_vote_num" id="a_vote_num_
应该不是链表或数组的问题,是你代码的其它问题,不管我原来用java swing还是libgdx做俄罗斯方块,都很流畅,我用的二维数组。
--- 共有 5 条评论 ---
代码就只有改变方向那部分不一样
(2周前)&nbsp&
其实不是我,我朋友死脑筋,就想用链表
(2周前)&nbsp&
: 你的链表是什么情况下使用?为什么要用链表?原来大学学C的时候根本不懂什么链表,照样把俄罗斯方块做出来了。我觉得用二维数组挺好的,既能表示堆砌的方块,又能表示变形的方块,而且变形的方块还能以矩阵旋转的方式动态变换为任意方向的方块。
(2周前)&nbsp&
: 你能确定延迟是发生在操作链表上?
(2周前)&nbsp&
我看了别人的代码,都是用链表,只有改变移动方向的方式不一样,我是在头的下一个位置创建一个新的头,然后删除尾,网上搜的是继承上一个位置的方式,请问这样为什么会有延迟呢,延迟大概是六个循环
(2周前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
上面这个用二维数组表示一个形状清晰明了,旋转矩阵也简单,干嘛要用链表?
--- 共有 4 条评论 ---
回复 : 应该是逻辑的问题
(2周前)&nbsp&
: 嗯,抱歉,贪吃蛇我没做过,不好发表言论了。
(2周前)&nbsp&
不过好像打错了,是贪吃蛇
(2周前)&nbsp&
回复 : 我也想说他啊
(2周前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
每个形状都是一个 4 * 4 的二维矩阵,0表示空,1或者其它数字表示其它颜色的小方块,非0的地方需要绘制方块图片。
--- 共有 1 条评论 ---
打错了,是贪吃蛇
(2周前)&nbsp&
更多开发者职位上
有什么技术问题吗?
那年花正艳的其它问题俄罗斯方块中是如何实现方块移动的?_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:503,741贴子:
俄罗斯方块中是如何实现方块移动的?收藏
想写个俄罗斯方块试试手,来这里求思路了。是如何实现方块移动的呢?比如这个方块:0000如何把它移动到下一行呢?难道是Cls后重新打印整个屏幕?
告别死工资:送150美金,可提取
没人来帮帮忙吗?
[google code] - simple-tetris-clone[tetris wikia] - SRS
在屏幕上显示运动都是 在这个坐标点显示 然后消失 在下一刻重绘 由于人的视觉停留 看起来好像是在运动而已.
可以把当前位置清空,然后在下一个位置再打出来 中间可以延时
不需要清空整个屏幕。。只要改需要改的地方。。。eg:011110
000000000010
011110000000
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或&>&&>&&>&正文
移动游戏20年回顾 贪吃蛇、俄罗斯方块乃鼻祖
11:24:39 来源:互联网 作者:未知 编辑:genesis 浏览:loading
  谈到移动游戏(mobile game),人们常常将这个词儿与苹果iOS、谷歌Android智能手机联系起来,但事实上,移动游戏的历史可追溯至上世纪90年代,当时《俄罗斯方块》和《贪食蛇》等游戏初登移动平台,并大放异彩。近日,国外某网页设计组织制作了一幅标题为《移动游戏进化史》的图片,回顾了移动游戏发展历程,并点出各个不同年代的代表作。
  年,上古神兽级游戏《俄罗斯方块》和《贪食蛇》登陆手机。
  2000年,《贪食蛇2》发布,增加了游戏内的障碍物和迷宫数量;2011年,《LifeStyler》发布。
友情提示:支持键盘左右键“← →”翻页
相关内容:
没有任何记录
综合热点资讯
单机游戏下载
| 不倒翁蜀黍
| 战术大米
游民星空联运游戏假期没事,写了个90行的俄罗斯方块,Java实现,史上最小巧 - 移动老王 - ITeye技术网站
博客分类:
Bug已经Fix~~
注释已经补充
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Terris extends JFrame implements Runnable, KeyListener {
private short isPlaying=0/*是否游戏,声明*/,xOffSet = 3/*当前方块的横坐标*/, yOffSet = 0/*当前方块的纵坐标*/, blockType = (short) Math.round(Math.random() * 6)/*随即初始方块类型*/, blockRotation = 0/*初始方块旋转角度*/, blockColor = (short) Math.round(Math.random() * 5)/*随即初始方块颜色*/;
private short matrix[][] = new short[21][10];/*整个画布21*10的矩阵*/
private short block[][][][] = {{{{ 0, 1, 0, 0 },{ 0, 1, 0, 0 },{ 0, 1, 0, 0 },{ 0, 1, 0, 0 }},/* l */{{ 0, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 },{ 0, 0, 0, 0 } } },/*-*/{{ { 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 1, 0 },{ 0, 0, 0, 0 } },/* z */{ { 0, 0, 0, 0 }, { 0, 0, 1, 0 }, { 0, 1, 1, 0 },{ 0, 1, 0, 0 } } },/* z| */{{ { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 },{ 0, 0, 0, 0 } },/* xz */{ { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 0, 1, 0 },{ 0, 0, 0, 0 } } },/* xz| */{ { { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 1, 0 }, { 0, 0, 0, 0 } } },/** []*/{{ { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 },{ 0, 0, 0, 0 } },{ { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 1, 0 },{ 0, 0, 0, 0 } },{ { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 },{ 0, 0, 0, 0 } },{ { 1, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 0, 0 },{ 0, 0, 0, 0 } } },/* f */{{ { 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 } },{ { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 },{ 0, 0, 0, 0 } },{ { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 1, 0, 0, 0 },{ 0, 0, 0, 0 } } },/* xf */ {{ { 0, 1, 0, 0 }, { 1, 1, 1, 0 }, { 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, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 1, 0, 0 },{ 0, 0, 0, 0 } },{ { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 },{ 0, 0, 0, 0 } } } };/* t *//*保存所有方块的4维矩阵,分别是:方块类型、方块旋转、方块x坐标、方块y坐标*/
private Image[] images = {new ImageIcon("D:/Java/eclipse/workspace/Terris/src/img/Red.gif").getImage(),new ImageIcon("D:/Java/eclipse/workspace/Terris/src/img/Blue.gif").getImage(),new ImageIcon(("D:/Java/eclipse/workspace/Terris/src/img/Pink.gif")).getImage(),new ImageIcon(("D:/Java/eclipse/workspace/Terris/src/img/BBlue.gif")).getImage(),new ImageIcon(("D:/Java/eclipse/workspace/Terris/src/img/Orange.gif")).getImage(),new ImageIcon(("D:/Java/eclipse/workspace/Terris/src/img/Green.gif")).getImage(),new ImageIcon("D:/Java/eclipse/workspace/Terris/src/img/Red.gif").getImage()};/*各种颜色方块图片*/
public Terris() {
setSize(160, 335);/*窗口大小*/
setVisible(true);/*可视*/
createBufferStrategy(2);/*对当前窗口创建双缓冲*/
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*设置关闭按钮事件*/
addKeyListener(this);/*添加按键响应*/
public void paint(Graphics g) {
Graphics tg = this.getBufferStrategy().getDrawGraphics();/*获取后台缓冲画布*/
tg.fillRect(5, 30, 150, 340);/*涂黑背景*/
for (int i = 0; i & 21; i++)
for (int j = 0; j & 10; j++) {
if (matrix[i][j] != 0)
tg.drawImage(images[matrix[i][j]], j * 15 + 5, i * 15 + 15,null);/*根据后台背景的矩阵绘制已经固定的各方块*/
if (i & 4 && j & 4&& block[blockType][blockRotation][i][j] != 0)
tg.drawImage(images[blockColor + 1],((j + xOffSet) * 15) + 5,((i + yOffSet) * 15) + 15, null);/*绘制当前能控制的方块*/
this.getBufferStrategy().show();/*切换后台画布到前台显示*/
public static void main(String[] args) {
new Thread(new Terris()).start();//初始化界面并创建启动游戏线程
public void run() {
while (isPlaying==0)/*当游戏正在进行 不断下落*/
if (check(0, 0, 0, 1))/*最后一个参数1 是下落 表示下落一格 其他参数见下面的注释*/
yOffSet += 1;/*如果能下落 y坐标+1*/
else {/*如不能下落 说明到底了*/
if (yOffSet == 0) {/*如果当前是第一个方块 游戏结束*/
isPlaying = 1;
/*不再循环*/
freezeAndNew();/*将当前控制的方块合并到背景矩阵中 并初始化新的方块*/
repaint();/*重绘画布*/
Thread.sleep(600);/*线程sleep 可以修改作为难度*/
} catch (InterruptedException e) {/*无用*/
private boolean check(int left, int right, int up, int down) {/*判断方块是否可以左右移动、下落、旋转 都合并到一个方法中了 四个参数分别代表要判断左移、右移、旋转、下落 如果对应方向有动作 则传入1 没有动作传入0 在判断时直接计算参数值即可 而不考虑传入的具体值是1还是0*/
for (int i = 0; i & 4; i++)
for (int j = 0; j & 4; j++)
if (((xOffSet + j - left + right & 0 || xOffSet + j - left+ right &= 10) && block[blockType][((blockRotation + up) &= block[blockType].length ? 0: (blockRotation + up))][i][j] != 0)|| ((yOffSet + i + down &= 21) && block[blockType][((blockRotation + up) &= block[blockType].length ? 0: (blockRotation + up))][i][j] != 0)|| (block[blockType][((blockRotation + up) &= block[blockType].length ? 0: (blockRotation + up))][i][j] != 0 && matrix[yOffSet+ i + down][xOffSet + j - left + right] != 0))
private synchronized void
freezeAndNew() {/*方块到底 固定到背景矩阵 并初始化新方块*/
boolean[] clear = new boolean[]{false,false,false,false};/*是否可以消行的数组 每个方块4*4 只需判断方块所在的4行即可*/
for (int i = 0; i & 4; i++){
for (int j = 0; j & 4; j++)
if (block[blockType][blockRotation][i][j] != 0)/*循环将方块的1赋值到背景的矩阵中 方块4*4中的0 没有方块的地方不复制*/
matrix[i + yOffSet][j + xOffSet] = (short) (blockColor + 1);/*根据当前方块颜色复制到背景 可修改为灰色*/
clear[i]=i + yOffSet&=matrix.length?false:(matrix[i + yOffSet][0]!=0&&matrix[i + yOffSet][1]!=0&&matrix[i + yOffSet][2]!=0&&matrix[i + yOffSet][3]!=0&&matrix[i + yOffSet][4]!=0&&matrix[i + yOffSet][5]!=0&&matrix[i + yOffSet][6]!=0&&matrix[i + yOffSet][7]!=0&&matrix[i + yOffSet][8]!=0&&matrix[i + yOffSet][9]!=0);/*一次判断一行0~9个方块是否有值 有值 复制到消行数组为true*/
for(int i=0;i&clear.i++)
if(clear[i])/*如果消行*/
for(int j=yOffSet+i;j&0;j--)
System.arraycopy(matrix[j-1],0,matrix[j],0,10);/*循环从当前行依次把上面一行复制下来 下落效果*/
yOffSet = blockRotation = 0;/*消行结束 下面几行是初始化新方块 xy方块类型 旋转 颜色*/
xOffSet = 3;
blockType = (short) Math.round(Math.random() * 6);
blockRotation = (short) Math.round((Math.random() * (block[blockType].length - 1)));
blockColor = (short) Math.round(Math.random() * 5);
public void keyPressed(KeyEvent e) {// 38-上 40-下 37-左 39-右
if ((e.getKeyCode() == 65 || e.getKeyCode() == 37) && check(1, 0, 0, 0)&&isPlaying==0) {// left/*左移 传入判断方块是否能移动的方法 第一个参数传1 其他传0*/
xOffSet--;/*能左移 x减1*/
} else if ((e.getKeyCode() == 68 || e.getKeyCode() == 39)&& check(0, 1, 0, 0)&&isPlaying==0) {// right/*类似上面 右移第二个参数传1 其他0*/
xOffSet++;/*能右移 x加1*/
} else if ((e.getKeyCode() == 87 || e.getKeyCode() == 38)&& check(0, 0, 1, 0)&&isPlaying==0) {// up
blockRotation = (short) ((blockRotation + 1) &= block[blockType].length ? 0: (blockRotation + 1));/*能旋转 根据当前方块类型进行旋转 如果到最后一个角度 回到0 继续旋转*/
} else if ((e.getKeyCode() == 83 || e.getKeyCode() == 40)&& check(0, 0, 0, 1)&&isPlaying==0) {// down
yOffSet += 1;/*能下落 y加1*/
} else if((e.getKeyCode() == 83 || e.getKeyCode() == 40)&& isPlaying==0)
freezeAndNew();/*不能下落 固定 并消行 新方块*/
repaint();/*移动事件触发重绘*/
public void keyReleased(KeyEvent arg0) {/*无用*/
public void keyTyped(KeyEvent arg0) {/*无用*/
//作者:/blog/595321
转载请注明出处
论坛回复 /
(27 / 19545)
哈哈 见笑了 目的不是写俄罗斯 是看只用100行代码能写出什么东西 挑战一下 图片是15*15 这个可是最高境界了,100行代码想写多少东西,我觉得你可以用python试试,兴许一个DBS都可以写出来。哈哈,不过见识了,写的很漂亮,哈哈
vividemon 写道研究了一下午……,给楼主提个简化的地方第65,66行可以稍微简化一下
for(int j=yOffSet+i;j&0;j--)
System.arraycopy(matrix[j-1],0,matrix[j],0,10); 变成
System.arraycopy(matrix, 0, matrix, 1, yOffSet+i);
还有我上面说的bug 还是没找到原因,时有时无的。我用的Linux下的jdk ,不会跟平台有关吧…… 呵呵 多谢提醒啊.. arraycopy还能这么用啊 还有地方可以简化 估计还能缩个5行左右 这个bug我也没研究明白原因 可能是双缓冲的地方 研究下 这个问题解决了就没有bug了应该 代码加上注释的话会更好些, 注释是习惯,读者可一目了然啊!
研究了一下午……,给楼主提个简化的地方第65,66行可以稍微简化一下
for(int j=yOffSet+i;j&0;j--)
System.arraycopy(matrix[j-1],0,matrix[j],0,10); 变成
System.arraycopy(matrix, 0, matrix, 1, yOffSet+i);
还有我上面说的bug 还是没找到原因,时有时无的。我用的Linux下的jdk ,不会跟平台有关吧…… 呵呵 多谢提醒啊.. arraycopy还能这么用啊 还有地方可以简化 估计还能缩个5行左右 这个bug我也没研究明白原因 可能是双缓冲的地方 研究下 这个问题解决了就没有bug了应该
n年前学编程1个月的时候就写了俄罗斯方块。没bug。楼主不错,快赶上我学编程1个月的功力了,哈哈。。。哈哈 见笑了 目的不是写俄罗斯 是看只用100行代码能写出什么东西 挑战一下 图片是15*15
& 上一页 1
wangshu3000
浏览: 84930 次
来自: 大连
datawarehouse 写道ngix 淘宝是基于这个开发了 ...
ngix 淘宝是基于这个开发了一个自己的webserver吧。 ...
我运行报错,,楼主能解答一下G,对swing不熟。
raphi ...
楼主写出例子了么?物理碰撞部分可能跟你说的差不多渲染部分可以搜 ...}

我要回帖

更多关于 手机游戏俄罗斯方块 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信