- 浏览: 465957 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 900面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6728本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2212本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1739尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2166正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3748本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3173题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8749EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3327题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6700面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9846Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1417个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7396for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4137本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2899本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
以下是一些关于使用Java Swing开发俄罗斯方块游戏的关键知识点: 1. **Java Swing基础**:首先,开发者需要对Swing的基本组件有深入理解,如JFrame(窗口),JPanel(面板),以及JButton,JLabel等。Swing通过继承...
【标题】"基于Java-swing的俄罗斯方块游戏:源码+答辩文档+PPT"是一个展示Java编程技能和游戏开发能力的项目。这个项目利用Java的Swing库来实现经典的俄罗斯方块游戏,提供了完整的源代码供学习者研究和使用。Swing...
在Swing俄罗斯方块中,主要涉及以下关键知识点: 1. **JFrame**: JFrame是Swing中的顶级容器,通常作为应用程序的主窗口。在这个游戏中,所有的游戏元素都将被添加到JFrame上。 2. **JPanel**: JPanel是一个可以...
在Java.Swing中实现俄罗斯方块游戏,开发者可能使用了以下关键知识点: 1. **JFrame**:作为应用程序的主要窗口,显示游戏界面。 2. **JPanel**:用于创建自定义的画布,绘制游戏板和方块。 3. **KeyListener** 或 ...
Java Swing是Java GUI(图形用户界面)库,用于...以上是基于Java Swing开发俄罗斯方块游戏的关键技术点。通过学习和理解这些概念,你可以深入了解Swing如何用于创建复杂的交互式应用程序,并提升你的Java编程技能。
总结,这个Java开发的俄罗斯方块游戏项目,不仅涵盖了Swing GUI的基本用法,还涉及到了游戏开发中的基本逻辑、渲染技巧和事件处理等关键知识点,是Java初学者提升技能的好材料。通过深入学习和实践,开发者可以对...
在“俄罗斯方块”的实现中,开发者需要处理的关键知识点包括: 1. **图形绘制**:使用Java的Graphics类进行方块的绘制,包括不同形状的方块以及它们的旋转。这涉及到坐标系统、颜色填充以及线性变换等基础知识。 2...
在Java+Swing中实现这一游戏,主要涉及以下几个关键点: 1. **游戏逻辑**:这是实现游戏的基础,包括方块的生成、旋转、移动、消除行等。这部分通常用面向对象编程实现,每个方块是一个对象,具有位置、形状和旋转...
《基于Swing实现的俄罗斯方块游戏:Java基础与编程理念的综合实践》 Java Swing是Java提供的一个用于创建桌面应用程序的图形用户界面(GUI)工具包,它基于Java Foundation Classes (JFC)。在本项目中,"swing实现...
在Java编程中实现俄罗斯方块,主要涉及以下几个关键知识点: 1. **图形用户界面(GUI)**:游戏界面通常使用Java的Swing或JavaFX库构建。开发者需要创建一个窗口,绘制游戏区域,并实现方块的显示和移动。例如,使用`...
游戏的核心逻辑会涉及到以下几个关键知识点: 1. **游戏循环**:游戏的每一帧都需要更新和渲染,这通常通过一个循环来实现。在Java中,可以使用定时器(javax.swing.Timer)或者线程(Thread.sleep())来控制游戏的...
Java版的俄罗斯方块游戏源程序是一套基于Java编程语言实现的经典休闲游戏。这个程序不仅提供了可执行的游戏体验,还为学习者提供了深入理解Java编程和游戏开发的宝贵资源。让我们一起探讨其中涉及的关键知识点。 ...
1. **图形用户界面(GUI)**:俄罗斯方块游戏通常会有一个显示游戏区域的窗口,这需要使用到GUI库,如Java的Swing或JavaFX。开发者可能创建了一个JFrame或Stage来作为游戏主窗口,并在其中添加了画布来绘制方块。 2...
以下是关于这个Java-俄罗斯方块游戏设计和实现的一些关键知识点: 1. **Java编程基础**:Java是一种广泛使用的面向对象的编程语言,具有跨平台的特性。在这个项目中,我们将运用Java的基础语法,类和对象的概念,...
在Java中实现“俄罗斯方块”,首先需要设计一个游戏循环,这个循环不断地更新屏幕上的方块位置,处理用户输入,并检查游戏状态。游戏循环通常是一个无限循环,直到玩家选择退出游戏为止。 接着,我们需要创建一个...
在Java中,俄罗斯方块的实现主要涉及到以下几个关键知识点: 1. **图形用户界面(GUI)设计**:游戏界面通常通过Java的Swing或JavaFX库构建。在这个项目中,可能使用了Swing来创建游戏窗口、按钮和对话框。例如,`...
在Java编程中,实现俄罗斯方块的核心部分包括以下几个关键知识点: 1. **图形用户界面(GUI)**:使用Java的Swing或JavaFX库创建游戏窗口,展示游戏区域、分数显示、控制按钮等元素。你需要熟悉JFrame、JPanel、 ...
通过研究这个"俄罗斯方块 游戏源码",开发者可以学到以下关键知识点: 1. **Java GUI编程**:了解如何使用Java的Swing或JavaFX库创建图形用户界面,设置窗口、按钮、面板等组件,并实现它们的交互功能。 2. **事件...