Java课程设计——俄罗斯方块
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JAVA 程序设计
一、程序功能介绍
本程序实现了俄罗斯方块游戏的基本功能,游戏中玩家可以做的操作有: 1.中间一个方块不变其他三个以 90 度为单位向右旋转方每一格块,此程序会判断方块有没有 空间让他实现旋转,即判断是否越界,若越界则不可以实现旋转。 2.以格子为单位左右移动方块,下方向让方块加速落下,空格键则急速下落。 3. 方 块 移 到 区 域 最 下 方 或 是 着 地 到 其 他 方 块 上 无 法 移 动 时 , 就 会 固 定 在 该 处 , 而 新 的 随 机图形会出现在区域上方开始落下。 4.当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分。同时删 除的列数越多,得分指数上升。 5.当固定的方块堆到区域最上方,则游戏结束。(此功能尚未实现) 6.此程序还不完善,开始,暂停,重来,结束都没有实现,有待改进。
-1-
JAVA 程序设计
private static class Z extends Tetromino; private static class L extends Tetromino; private static class J extends Tetromino; private static class I extends Tetromino; private static class O extends Tetromino; private static class T extends Tetromino; 3.通过 switch 语句,随机输出方块到游戏区域顶部。 public static Tetromino randomOne(); 4.用键盘监听来实现下落、移动、旋转变形。 键盘监听:public void keyPressed(KeyEvent e); 软着陆:protected void softDropAction(); 硬着陆:protected void hardDropAction(); 左移:protected void moveLeftAction(); 右移:protected void moverightAction(); 右旋:public void rotateRight(); repaint(); 重绘 java 里 repaint()是重绘 component 的方法;component 中己有的图形发生变化后不会 立刻显示,须使用 repaint 方法。component 简而言之,组件就是对象。C++ Builder 中叫组 件,Delphi 中叫部件,而在 Visual BASIC 中叫控件。 组件是对数据和方法的简单封装。C++ Builder 中,一个组件就是一个从 TComponent 派生出来的特定对象组件可以有自己的属性和 方法。 判断是否越界: private boolean canMoveR();//是否碰墙,是否有其他图形 private boolean outOfBoundsTB();// private boolean baoHanR();//判断右侧墙上是否有内容 private boolean baoHanL();//判断左侧墙上是否有内容 private boolean outOfBoundsR(); private boolean outOfBoundsL(); 5.绘制图像 public void paint(Graphics g);
二、课程设计过程
1、总体概述: 设计一个简单的游戏,能够将 Java 的面向对象程序思想应用到课程设计中,用到 Java
中常用的组件以及相应的布局方式。完成设计、编程、测试等过程,给出设计思路、设计说 明书、主要的代码的说明、源代码以及可运行的游戏程序。
2、各个子类的定义: 1.定义俄罗斯方块类,通过可视化界面设定一个游戏界面窗口,用一个 10*20 表示游戏区域。 public class TetrisGame extends JPanel JFrame jf = new JFrame("俄罗斯方块"); jf.setSize(540, 600); jf.setVisible(true); public static final int ROWS = 20; public static final int COLS = 10; 2.定义 7 种俄罗斯方块的基本类型,分别以 S、Z、L、J、I、O、T 这 7 个字母的形状来命名。 先定义四方格主类:public class Tetromino; 再定义它的 7 个子类:S、Z、L、J、I、O、T private static class S extends Tetromino;
图 2 初始状态图
-6-
JAVA 程序设计
2、当底部有一行方块填充,进行计算行数并加分及消除该行,结果如图 3
图 3 计分消行图 四、课程设计总结
-7-
JAVA 程序设计
这次 JAVA 课程设计我选择了做俄罗斯方块这个小游戏,刚开始很迷茫,不知道该怎么做,
多次想要换题,但是由于很早玩过这个游戏所以对于它产生了兴趣,想要知道它到底是怎么
public static final int ROWS = 20; public static final int COLS = 10; public static final int CELL_SIZE = 26; //格子的大小 private int score;//计分 private int lines =0;//计消除行 Tetromino t= Tetromino.randomOne(); Tetromino next=Tetromino.randomOne();//下一张图 private Cell[][] wall = new Cell[20][10];//墙 public static Image background;//声明变量
不负老师所望,今后我们强化自己的知识的认识,在这里想跟老师说一声,非常感谢。
五、程序设计的完整代码及注解
package newTetris; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Arrays; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; public class TetrisGame extends JPanel {
-3-
JAVA 程序设计
java.awt.AWTEvent 类。事件由事件源所激发。向事件源注册的事件侦听器可接收有关特定 事件类型的通知。此包定义了事件和事件侦听器,以及事件侦听器适配器,它是让事件侦听 器的编写过程更为轻松的便捷类。 6、java.awt.event.KeyListener: 用于接收键盘事件(击键)的侦听器接口。旨在处理键盘事件的类要么实现此接口(及其包 含的所有方法),要么扩展抽象 KeyAdapter 类(仅重写有用的方法)。然后使用组件的 addKeyListener 方法将从该类所创建的侦听器对象向该组件注册。按下、释放或键入键时生 成键盘事件。然后调用侦听器对象中的相关方法并将该 KeyEvent 传递给它。 7、java.awt.event.KeyListener: java.util.Arrays 类包含一个静态的工厂,允许数组被视为列表。以下是关于数组的要点: 这个类包含了各种方法来操作数组(比如排序和搜索)。在这个类中的方法抛出 NullPointerException 如果指定数组引用为 null。 8、javax.imageio.ImageIO: 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage) 有的用来控制图像读取过程(ImageReader、ImageReadParam 和 ImageTypeSpecifier)和控 制图像写入过程(ImageWriter 和 ImageWriteParam);还有的用来执行格式之间的代码转换 (ImageTranscoder) 和报告错误 (IIOException)。 9、javax.swing.JFrame: java 的 GUI 程序的基本思路是以 JFrame 为基础,它是屏幕上 window 的对象,能够最大化、 最小化、关闭。 10、javax.swing.JPanel: JPanel 类是一个通用的轻量级容器。 11、java.util.Random: Random 是数的随机生成器。
-4-
4、程序功能设计: 功能模块图:如图 1:
Jቤተ መጻሕፍቲ ባይዱVA 程序设计
main 框架
墙
下一个图形
计分
监听器
判断越界
左移 右移 变形 软下降 硬下降
判断到底
Y 判断消行N
N
重画墙
图 1 功能模块图
-5-
消行重画墙计分
JAVA 程序设计 三、程序运行的结果分析
1、初始界面如图 2:有一个方块下来且右上方矩形中显示下一个方块
做成的。之后经过网上查询以及请教学霸等方法,终于慢慢的开始打代码,在学习过程中,
我学到了一些关于做游戏的相关知识,比如说怎么设置界面,设置面板,画游戏界面等,也
在过程中发现了自己的不足之处。
运行程序的时候出现了几个问题:1、不知道该用哪些函数 2、一段一段代码总有好多漏
洞,要判断好多东西,比如它是否到达底部的墙上,墙上是否有方块,到底怎样使它自动下
6.每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并 且以此来换取积分。 判断是否行满:private boolean fullCells(int row); 消行:private void destroyLines();
3、导入各种包: 1、java.awt.Font: Font 类表示字体,可以使用它以可见方式呈现文本。字体提供将字符 序列映射到字形 序列 所需要的信息,以便在 Graphics 对象和 Component 对象上呈现字形序列。 2、java.awt.Graphics: 是一个用来绘制 2D 图像必须导入的 java 包,提供对图形图像的像素,颜色的绘制。 3、java.awt.Image: 提供创建和修改图像的各种类。使用流框架来处理图像,该框架涉及图像生产者、可选的图 像过滤器和图像使用者。此框架使得在获取和生成图像的同时逐步呈现该图像成为可能。而 且,该框架允许应用程序丢弃图像使用的存储空间并随时重新生成它。此包提供了多种图像 生产者、使用者和过滤器,可以根据图像处理的需要来配置它们。 4、java.awt.event.KeyAdapter: 接收键盘事件的摘要适配器类。方法在这 类。这类 方便创建侦听器对象的存在。扩展这个 类来创建一个键盘事件听众 和覆盖感兴趣的事件的方法。(如果你实施 KeyListener 接口, 你必须定义所有的方法,它 。这个抽象类定义了无效的方法 所有,所以你只能定义为事件 你关心的方法。)创建一个使用扩展类的听众对象然后登记与 组件使用组件的 addkeylistener 方法当一个键被按下,释放,或类型,方法在听者 相关对象时, 键盘事件 通过它。 5、java.awt.event.KeyEvent: 提供处理由 AWT 组件所激发的各类事件的接口和类。有关 AWT 事件模型的细节,请参见
降等。经过这次课程设计,我对 java 这门课程更加了解了,学习也有了方向感,明白了基础
知识很重要,但实践也很重要。强大的理论功底和动手能力结合才是一个工程师必备的,理
论与实践结合才是完美的。我们应该抓住每次实验的机会,实打实的学些东西,还有在学校
提供的学习平台里面好好学习。当然,这些也离不开我们老师的悉心指导,所以我们更应该
-2-
JAVA 程序设计
private void paintScore(Graphics g); private void paintNextOne(Graphics g); private void paintWall(Graphics g); private void paintTetromino(Graphics g);
一、程序功能介绍
本程序实现了俄罗斯方块游戏的基本功能,游戏中玩家可以做的操作有: 1.中间一个方块不变其他三个以 90 度为单位向右旋转方每一格块,此程序会判断方块有没有 空间让他实现旋转,即判断是否越界,若越界则不可以实现旋转。 2.以格子为单位左右移动方块,下方向让方块加速落下,空格键则急速下落。 3. 方 块 移 到 区 域 最 下 方 或 是 着 地 到 其 他 方 块 上 无 法 移 动 时 , 就 会 固 定 在 该 处 , 而 新 的 随 机图形会出现在区域上方开始落下。 4.当区域中某一列横向格子全部由方块填满,则该列会自动消除并成为玩家的得分。同时删 除的列数越多,得分指数上升。 5.当固定的方块堆到区域最上方,则游戏结束。(此功能尚未实现) 6.此程序还不完善,开始,暂停,重来,结束都没有实现,有待改进。
-1-
JAVA 程序设计
private static class Z extends Tetromino; private static class L extends Tetromino; private static class J extends Tetromino; private static class I extends Tetromino; private static class O extends Tetromino; private static class T extends Tetromino; 3.通过 switch 语句,随机输出方块到游戏区域顶部。 public static Tetromino randomOne(); 4.用键盘监听来实现下落、移动、旋转变形。 键盘监听:public void keyPressed(KeyEvent e); 软着陆:protected void softDropAction(); 硬着陆:protected void hardDropAction(); 左移:protected void moveLeftAction(); 右移:protected void moverightAction(); 右旋:public void rotateRight(); repaint(); 重绘 java 里 repaint()是重绘 component 的方法;component 中己有的图形发生变化后不会 立刻显示,须使用 repaint 方法。component 简而言之,组件就是对象。C++ Builder 中叫组 件,Delphi 中叫部件,而在 Visual BASIC 中叫控件。 组件是对数据和方法的简单封装。C++ Builder 中,一个组件就是一个从 TComponent 派生出来的特定对象组件可以有自己的属性和 方法。 判断是否越界: private boolean canMoveR();//是否碰墙,是否有其他图形 private boolean outOfBoundsTB();// private boolean baoHanR();//判断右侧墙上是否有内容 private boolean baoHanL();//判断左侧墙上是否有内容 private boolean outOfBoundsR(); private boolean outOfBoundsL(); 5.绘制图像 public void paint(Graphics g);
二、课程设计过程
1、总体概述: 设计一个简单的游戏,能够将 Java 的面向对象程序思想应用到课程设计中,用到 Java
中常用的组件以及相应的布局方式。完成设计、编程、测试等过程,给出设计思路、设计说 明书、主要的代码的说明、源代码以及可运行的游戏程序。
2、各个子类的定义: 1.定义俄罗斯方块类,通过可视化界面设定一个游戏界面窗口,用一个 10*20 表示游戏区域。 public class TetrisGame extends JPanel JFrame jf = new JFrame("俄罗斯方块"); jf.setSize(540, 600); jf.setVisible(true); public static final int ROWS = 20; public static final int COLS = 10; 2.定义 7 种俄罗斯方块的基本类型,分别以 S、Z、L、J、I、O、T 这 7 个字母的形状来命名。 先定义四方格主类:public class Tetromino; 再定义它的 7 个子类:S、Z、L、J、I、O、T private static class S extends Tetromino;
图 2 初始状态图
-6-
JAVA 程序设计
2、当底部有一行方块填充,进行计算行数并加分及消除该行,结果如图 3
图 3 计分消行图 四、课程设计总结
-7-
JAVA 程序设计
这次 JAVA 课程设计我选择了做俄罗斯方块这个小游戏,刚开始很迷茫,不知道该怎么做,
多次想要换题,但是由于很早玩过这个游戏所以对于它产生了兴趣,想要知道它到底是怎么
public static final int ROWS = 20; public static final int COLS = 10; public static final int CELL_SIZE = 26; //格子的大小 private int score;//计分 private int lines =0;//计消除行 Tetromino t= Tetromino.randomOne(); Tetromino next=Tetromino.randomOne();//下一张图 private Cell[][] wall = new Cell[20][10];//墙 public static Image background;//声明变量
不负老师所望,今后我们强化自己的知识的认识,在这里想跟老师说一声,非常感谢。
五、程序设计的完整代码及注解
package newTetris; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Arrays; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; public class TetrisGame extends JPanel {
-3-
JAVA 程序设计
java.awt.AWTEvent 类。事件由事件源所激发。向事件源注册的事件侦听器可接收有关特定 事件类型的通知。此包定义了事件和事件侦听器,以及事件侦听器适配器,它是让事件侦听 器的编写过程更为轻松的便捷类。 6、java.awt.event.KeyListener: 用于接收键盘事件(击键)的侦听器接口。旨在处理键盘事件的类要么实现此接口(及其包 含的所有方法),要么扩展抽象 KeyAdapter 类(仅重写有用的方法)。然后使用组件的 addKeyListener 方法将从该类所创建的侦听器对象向该组件注册。按下、释放或键入键时生 成键盘事件。然后调用侦听器对象中的相关方法并将该 KeyEvent 传递给它。 7、java.awt.event.KeyListener: java.util.Arrays 类包含一个静态的工厂,允许数组被视为列表。以下是关于数组的要点: 这个类包含了各种方法来操作数组(比如排序和搜索)。在这个类中的方法抛出 NullPointerException 如果指定数组引用为 null。 8、javax.imageio.ImageIO: 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage) 有的用来控制图像读取过程(ImageReader、ImageReadParam 和 ImageTypeSpecifier)和控 制图像写入过程(ImageWriter 和 ImageWriteParam);还有的用来执行格式之间的代码转换 (ImageTranscoder) 和报告错误 (IIOException)。 9、javax.swing.JFrame: java 的 GUI 程序的基本思路是以 JFrame 为基础,它是屏幕上 window 的对象,能够最大化、 最小化、关闭。 10、javax.swing.JPanel: JPanel 类是一个通用的轻量级容器。 11、java.util.Random: Random 是数的随机生成器。
-4-
4、程序功能设计: 功能模块图:如图 1:
Jቤተ መጻሕፍቲ ባይዱVA 程序设计
main 框架
墙
下一个图形
计分
监听器
判断越界
左移 右移 变形 软下降 硬下降
判断到底
Y 判断消行N
N
重画墙
图 1 功能模块图
-5-
消行重画墙计分
JAVA 程序设计 三、程序运行的结果分析
1、初始界面如图 2:有一个方块下来且右上方矩形中显示下一个方块
做成的。之后经过网上查询以及请教学霸等方法,终于慢慢的开始打代码,在学习过程中,
我学到了一些关于做游戏的相关知识,比如说怎么设置界面,设置面板,画游戏界面等,也
在过程中发现了自己的不足之处。
运行程序的时候出现了几个问题:1、不知道该用哪些函数 2、一段一段代码总有好多漏
洞,要判断好多东西,比如它是否到达底部的墙上,墙上是否有方块,到底怎样使它自动下
6.每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并 且以此来换取积分。 判断是否行满:private boolean fullCells(int row); 消行:private void destroyLines();
3、导入各种包: 1、java.awt.Font: Font 类表示字体,可以使用它以可见方式呈现文本。字体提供将字符 序列映射到字形 序列 所需要的信息,以便在 Graphics 对象和 Component 对象上呈现字形序列。 2、java.awt.Graphics: 是一个用来绘制 2D 图像必须导入的 java 包,提供对图形图像的像素,颜色的绘制。 3、java.awt.Image: 提供创建和修改图像的各种类。使用流框架来处理图像,该框架涉及图像生产者、可选的图 像过滤器和图像使用者。此框架使得在获取和生成图像的同时逐步呈现该图像成为可能。而 且,该框架允许应用程序丢弃图像使用的存储空间并随时重新生成它。此包提供了多种图像 生产者、使用者和过滤器,可以根据图像处理的需要来配置它们。 4、java.awt.event.KeyAdapter: 接收键盘事件的摘要适配器类。方法在这 类。这类 方便创建侦听器对象的存在。扩展这个 类来创建一个键盘事件听众 和覆盖感兴趣的事件的方法。(如果你实施 KeyListener 接口, 你必须定义所有的方法,它 。这个抽象类定义了无效的方法 所有,所以你只能定义为事件 你关心的方法。)创建一个使用扩展类的听众对象然后登记与 组件使用组件的 addkeylistener 方法当一个键被按下,释放,或类型,方法在听者 相关对象时, 键盘事件 通过它。 5、java.awt.event.KeyEvent: 提供处理由 AWT 组件所激发的各类事件的接口和类。有关 AWT 事件模型的细节,请参见
降等。经过这次课程设计,我对 java 这门课程更加了解了,学习也有了方向感,明白了基础
知识很重要,但实践也很重要。强大的理论功底和动手能力结合才是一个工程师必备的,理
论与实践结合才是完美的。我们应该抓住每次实验的机会,实打实的学些东西,还有在学校
提供的学习平台里面好好学习。当然,这些也离不开我们老师的悉心指导,所以我们更应该
-2-
JAVA 程序设计
private void paintScore(Graphics g); private void paintNextOne(Graphics g); private void paintWall(Graphics g); private void paintTetromino(Graphics g);