- 浏览: 461129 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
上一篇博文介绍了俄罗斯方块游戏的图形选择与变换:
Swing俄罗斯方块游戏(一): 图形选择与变换 --> [url]http://mouselearnjava.iteye.com/blog/1914513 [/url]
.
本文将介绍实现俄罗斯方块需要处理的关键点,这些关键点有如下几点:
1. 键盘事件的处理
2. 满行及其消行操作
3. 游戏结束判断
4. 游戏进度存储和加载
5. 游戏玩家得分排行榜
... ...
下面就结合代码一个一个地介绍这些点的实现:
1. 键盘事件的处理
键盘事件的处理包括5个部分:
a)向左
public void moveLeft(int flag[][]) { if (!isAlive) { return; } for (int i = 0; i < grid.length; i++) { tempX[i] = grid[i].x - 1; tempY[i] = grid[i].y; } if (tempX[0] >= RussiaGameConstant.LEFT && flag[tempX[0]][tempY[0]] == 0 && tempX[1] >= RussiaGameConstant.LEFT && flag[tempX[1]][tempY[1]] == 0 && tempX[2] >= RussiaGameConstant.LEFT && flag[tempX[2]][tempY[2]] == 0 && tempX[3] >= RussiaGameConstant.LEFT && flag[tempX[3]][tempY[3]] == 0) { for (int i = 0; i < grid.length; i++) { grid[i].x = tempX[i]; } } }
b)向右与向左类似
c)向下与向下类似
d)空格键直接下降到底部
按下空格键一直向下的操作,其实就是在可以动的范围下,一直调用moveDown()方法e)向上键处理图形变换
每个图形,或有一种变换,或者有2种或者有四种变换,可以根据图形的特性进行处理。
比如,将“T字型”图型按照顺时针旋转,拥有四种变换,创建对象的时候已经确定了state是多少(state确定初始的位置是哪里),此后的变换只要对state加1并对4求余就可以知道怎么变换。
/** * @author Eric * @vesion 1.0 * @desc T字型方块 */ public class RussiaSquareThree extends RussiaSquare { private static final long serialVersionUID = -180232612076846292L; public RussiaSquareThree(){ state = (int)(Math.random() * 4); switch(state) { case 0: grid[0].x = 4; grid[0].y = 0; grid[1].x = grid[0].x - 1; grid[1].y = grid[0].y + 1; grid[2].x = grid[0].x; grid[2].y = grid[0].y + 1; grid[3].x = grid[0].x + 1; grid[3].y = grid[0].y + 1; break; case 1: grid[0].x = 4; grid[0].y = 0; grid[1].x = grid[0].x; grid[1].y = grid[0].y + 1; grid[2].x = grid[0].x + 1; grid[2].y = grid[0].y + 1; grid[3].x = grid[0].x; grid[3].y = grid[0].y + 2; break; case 2: grid[0].x = 4; grid[0].y = 0; grid[1].x = grid[0].x + 1; grid[1].y = grid[0].y; grid[2].x = grid[0].x + 2; grid[2].y = grid[0].y; grid[3].x = grid[0].x + 1; grid[3].y = grid[0].y + 1; break; case 3: grid[0].x = 4; grid[0].y = 0; grid[1].x = grid[0].x - 1; grid[1].y = grid[0].y + 1; grid[2].x = grid[0].x; grid[2].y = grid[0].y + 1; grid[3].x = grid[0].x; grid[3].y = grid[0].y + 2; break; default: break; } } public void changeState(int flag[][]) { switch(state) { case 0: tempX[0] = grid[0].x; tempY[0] = grid[0].y; tempX[1] = tempX[0]; tempY[1] = tempY[0] + 1; tempX[2] = tempX[0] + 1; tempY[2] = tempY[0] + 1; tempX[3] = tempX[0]; tempY[3] = tempY[0] + 2; isAllowChangeState(flag, 4); break; case 1: tempX[0] = grid[0].x - 1; tempY[0] = grid[0].y + 1; tempX[1] = tempX[0] + 1; tempY[1] = tempY[0]; tempX[2] = tempX[0] + 2; tempY[2] = tempY[0]; tempX[3] = tempX[0] + 1; tempY[3] = tempY[0] + 1; isAllowChangeState(flag, 4); break; case 2: tempX[0] = grid[0].x + 1; tempY[0] = grid[0].y - 1; tempX[1] = tempX[0] - 1; tempY[1] = tempY[0] + 1; tempX[2] = tempX[0]; tempY[2] = tempY[0] + 1; tempX[3] = tempX[0]; tempY[3] = tempY[0] + 2; isAllowChangeState(flag, 4); break; case 3: tempX[0] = grid[0].x; tempY[0] = grid[0].y; tempX[1] = tempX[0] - 1; tempY[1] = tempY[0] + 1; tempX[2] = tempX[0]; tempY[2] = tempY[0] + 1; tempX[3] = tempX[0] + 1; tempY[3] = tempY[0] + 1; isAllowChangeState(flag, 4); break; default: break; } } }
private class KeyHandler implements KeyListener { public void keyPressed(KeyEvent event) { if (!gameState.isRunState()) { return; } int keyCode = event.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: sr1.moveLeft(flag); break; case KeyEvent.VK_RIGHT: sr1.moveRight(flag); break; case KeyEvent.VK_UP: sr1.changeState(flag); break; case KeyEvent.VK_DOWN: sr1.moveDown(flag); break; case KeyEvent.VK_SPACE: while (sr1.isAlive) { sr1.moveDown(flag); } default: break; } repaint(); } public void keyReleased(KeyEvent event) { } public void keyTyped(KeyEvent event) { } }
2. 满行及其消行操作
用一个二维数组记录当前屏幕上的方块状态,0表示没有方块,1表示有方块。
满行的判断就归结到某一行1的个数是否等于该行列的总数,如果是就满足满行条件。
当有满行情况出现的时候,需要进行消除和计分操作。
消除行的一个做法就是将该行以上的行通通往下移,移动之后在将第一行的flag全部置为0.
public class RussiaGamePanel extends JPanel { private class TimerAction implements ActionListener, Serializable { private static final long serialVersionUID = -6117702515382009989L; public void actionPerformed(ActionEvent event) { if (!gameState.isRunState()) { return; } //满行的个数 int num = 0; sr1.moveDown(flag); if (!sr1.isAlive) { for (int i = 0; i < 4; i++) { flag[sr1.grid[i].x][sr1.grid[i].y] = 1; color[sr1.grid[i].x][sr1.grid[i].y] = sr1.color; } judgeGameOver(); for (int i = RussiaGameConstant.UP; i <= RussiaGameConstant.DOWN; i++) { int count = 0; for (int j = RussiaGameConstant.LEFT; j <= RussiaGameConstant.RIGHT; j++) { count += flag[j][i]; } /* * flag[i][j] =1 表示这个位置有小方块,如果一行的位置都有小方块,那么满行的个数num加1. * 并且消除行。 */ if (count == RussiaGameConstant.GRID_COLUMN_NUMBER) { num++; /** * 消除行操作。 */ for (int m = i; m > RussiaGameConstant.UP; m--) { for (int n = RussiaGameConstant.LEFT; n <= RussiaGameConstant.RIGHT; n++) { flag[n][m] = flag[n][m - 1]; color[n][m] = color[n][m - 1]; } } /* * 重新将第一行的flag[s][0]置为0 */ for (int s = RussiaGameConstant.LEFT; s <= RussiaGameConstant.RIGHT; s++) { flag[s][RussiaGameConstant.UP] = 0; } } } /* * 将下一个图形作为当前运动的图形,并随机产生下一个图形。 */ sr1 = sr2; sr2 = RussiaSquareFactory.generateNextRussiaSquareByRandom(); } // 计算分数 calculateScore(num); repaint(); } } /** * @param num * 方块满行的个数 */ private void calculateScore(int num) { switch(num) { case 1: score += 10; break; case 2: score += 20; break; case 3: score += 50; break; case 4: score += 100; break; default: break; } } }
3. 游戏结束判断
俄罗斯方块游戏结束的判断其实很简单,只要判断第一行的标记位是否有1即可。
private boolean isTopTouched() { for (int i = RussiaGameConstant.LEFT; i <= RussiaGameConstant.RIGHT; i++) { if (flag[i][RussiaGameConstant.UP] == 1) { return true; } } return false; }
4. 游戏进度存储和加载
5. 游戏玩家得分排行榜
关于4,5两点,本文不在这里展开,因为这些功能以前在写贪吃蛇游戏的博文中介绍了。
Swing贪吃蛇游戏(三):增加游戏进度存储和加载功能 >>>
http://mouselearnjava.iteye.com/blog/1914225
Swing贪吃蛇游戏(四):增加游戏得分排行榜功能 >>>
http://mouselearnjava.iteye.com/blog/1914316
拥有所有功能的详细代码请参考附件MyRussiaGame.7z
俄罗斯方块游戏的界面如下:
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 864面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6680本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2183本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1698尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2666本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2114正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3709本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1927问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3952题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3128题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8717EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3292题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6670面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9810Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1381个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2111从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7366for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4084本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2849本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
java swing开发俄罗斯方块游戏。java swing开发俄罗斯方块游戏。java swing开发俄罗斯方块游戏。java swing开发俄罗斯方块游戏。
Java swing 俄罗斯方块
Swing做的网络版俄罗斯方块游戏
java小游戏 (源码+视频+文档+ppt) swing俄罗斯方块项目java小游戏 (源码+视频+文档+ppt) swing俄罗斯方块项目java小游戏 (源码+视频+文档+ppt) swing俄罗斯方块项目java小游戏 (源码+视频+文档+ppt) swing俄罗斯方块...
俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip 俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip 俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip...
Java 课设小游戏 俄罗斯方块源码 eclipse完美运行,供大家学习和糊弄作业,需要一些积分谢谢
Java+Swing实现俄罗斯方块游戏。Java+Swing实现俄罗斯方块游戏。Java+Swing实现俄罗斯方块游戏。Java+Swing实现俄罗斯方块游戏。Java+Swing实现俄罗斯方块游戏。
JavaSwing 实现俄罗斯方块游戏。
com.tetris里的Tetris类是程序的主入口,运行该程序即启动项目,上下左右箭头控制俄罗斯方块,回车键重启游戏,暂停键快速下落 基于Java+Swing俄罗斯方块 基于Java+Swing俄罗斯方块 基于Java+Swing俄罗斯方块 基于...
java Swing制作的俄罗斯方块小游戏,主题切换、背景音乐等完成众多功能。 基本功能: 方块消行 方块控制 随机生成方块 预览下一方块 游戏状态判断 游戏暂停、结束提醒 退出程序提醒 等级...
用java Swing做的俄罗斯方块用java Swing做的俄罗斯方块用java Swing做的俄罗斯方块用java Swing做的俄罗斯方块
java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发...
资源名字:基于java+swing+Eclipse的俄罗斯方块游戏GUL设计与实现(源码+文档)_JAVA_swing_俄罗斯方块.zip 资源类型:项目全套源码+文档+辅导视频 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 适合...
俄罗斯方块是一款非常经典的游戏,风靡全球,,经久不衰,是学习面向对象的编程思想的理想实例。本毕业设计论文介绍用JAVA语言设计一个“俄罗斯方块”游戏的过程,整个游戏系统是一个应用程序(Java Application),...
Swing版俄罗斯方块游戏,包括如下功能 1. 键盘事件的处理 2. 满行及其消行操作 3. 游戏结束判断 4. 游戏进度存储和加载 5. 游戏玩家得分排行榜 ... ... 游戏里面包括十几种图形选择。
Swing做的俄罗斯方块游戏
制作一个简单的俄罗斯方块,拥有7种方块的变换。游戏可以随时暂停、停止。游戏还有成绩记录方式。 实现技术 使用Graphics、Graphics2D完成方块的绘制。 使用多线程的方式控制游戏的执行。 方块的碰撞的逻辑问题。
《疯狂Java实战演义》第5章 Swing俄罗斯方块,运行包