3 定义Tetris项目中的O类并测试

在今天的课上案例中已经定义了T型和J型方块对应的类,本案例要求模仿课上定义的T型方块的类T和J型方块的类J,来定义O型方块对应的类O。O型方块的形状如图-1中的红色方块。

图- 1

参考答案

首先,定义名为O的类,由于每个方块有四个格子,因此,在O类中添加属性cells,cells属性的类型为Cell数组类型,即,Cell[]。这样,cells数组中就可以存储四个格子来表示一个方块。

其次,为O类添加构造方法。可以提供无参数构造方法,及按顺时针方向,方块中第一个格子的行和列作为参数的构造方法。

第三,为了方便查看方块中四个格子的坐标,因此,定义print方法,实现按顺时针方向,打印方块中四个格子所在的坐标,并对print进行测试。

第四,每个方块都可以下落,左移和右移,因此,在O类中,定义drop方法实现方块下落;定义moveLeft方法实现方块左移;定义moveRight方法实现方块右移,并对这三个方法进行测试。

实现此案例需要按照如下步骤进行。

步骤一:定义O类

首先定义一个名为 O的类,代码如下所示:

步骤二:定义属性

由于每个方块有四个格子,因此,在类 O中定义一个名为cells的属性,cells属性的类型为Cell数组类型,即,Cell[]。代码如下所示:

public class O {

Cell[] cells;

}

步骤三:定义构造方法

首先,在O类中添加第一个格子的行和列作为参数的构造方法,并在构造方法中按顺时针方向初始化O型方块。

图- 2

从图-2中,按顺时针方向查看O型方块,可以看出,第一个格子的行列坐标是(0,5),第二个格子的行列坐标是(0,6),第三个格子的行列坐标是(1,5),第四个格子的行列坐标是(1,6)。假设把第一个格子的行列坐标用(row,col)来表示,那么,第二个格子的行列坐标为(row,col+1), 第三个格子的行列坐标为(row+1,col), 第四个格子的行列坐标为(row+1,col+1),这样,O型方块就可以用传入的参数对cells属性进行初始化了。代码如下所示:

public class O {

Cell[] cells;

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow顺时针方向

* ,第一个坐标的行

* @paramcol顺时针方向

* ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

}

然后,在O类中添加无参数构造方法,在该构造方法中,使用this关键字调用参数为O(int row, int col)的构造方法,并设置方块的顺时针方向的第一个格子的行和列为(0,0),代码如下所示:

public class O {

Cell[] cells;// 属性,用来存储一个方块的四个格子的坐标

/**

* 构造方法,为属性cells进行初始化

*/

public O() {

this(0, 0);

}

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow

* 顺时针方向 ,第一个坐标的行

* @paramcol

* 顺时针方向 ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

}

步骤四:定义打印方法

为了方便查看方块中四个格子的坐标,因此,定义print方法。在print方法中,按顺时针方向,打印方块中四个格子所在的坐标。实现此功能,循环遍历cells数组即可。代码如下所示:

public class O {

Cell[] cells;// 属性,用来存储一个方块的四个格子的坐标

/**

* 构造方法,为属性cells进行初始化

*/

public O() {

this(0, 0);

}

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow

* 顺时针方向 ,第一个坐标的行

* @paramcol

* 顺时针方向 ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

/**

* 按顺时针方向,打印方块中四个格子所在的坐标

*/

public void print() {

String str = "";

for (int i = 0; i < cells.length - 1; i++) {

str += "(" + cells[i].getCellInfo() + "), ";

}

str += "(" + cells[cells.length - 1].getCellInfo() + ")";

System.out.println(str);

}

}

步骤五:测试打印方法

新建名为TestO的类,在类中添加main方法,并在main方法中,首先,创建O类的对象,将该对象的cells属性的第一个格子的行和列设置为(0,5);然后调用print方法,打印cells属性中的四个格子坐标,代码如下所示:

public class TestO {

public static void main(String[] args) {

O o=new O(0,5);

System.out.println("原始坐标为:");

o.print();

}

}

打印结果如下所示:

原始坐标为:

(0,5), (0,6), (1,5), (1,6)

根据以上结果,对照图-3中,顺时针方向看O型的每个格子的坐标,可以看出与打印结果是匹配的。

图- 3

步骤六:定义方块的下落方法

定义方块的下落的方法,即,在O类中,添加方块下落一个格子的方法。要实现下落一个格子,只需要循环cells属性,将方块中的每一个格子的行加1即可。代码如下所示:

public class O {

Cell[] cells;// 属性,用来存储一个方块的四个格子的坐标

/**

* 构造方法,为属性cells进行初始化

*/

public O() {

this(0, 0);

}

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow

* 顺时针方向 ,第一个坐标的行

* @paramcol

* 顺时针方向 ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

/**

* 按顺时针方向,打印方块中四个格子所在的坐标

*/

public void print() {

String str = "";

for (int i = 0; i < cells.length - 1; i++) {

str += "(" + cells[i].getCellInfo() + "), ";

}

str += "(" + cells[cells.length - 1].getCellInfo() + ")";

System.out.println(str);

}

/**

* 使方块下落一个格子

*/

public void drop() {

for (int i = 0; i < cells.length; i++) {

cells[i].row++;

}

}

}

步骤七:测试方块下落的方法

在TestO类中的main方法中,首先,调用对象o的drop方法,然后,再调用对象o的print方法查看坐标的变化情况,代码如下所示:

public class TestO {

public static void main(String[] args) {

O o=new O(0,5);

//测试print方法

System.out.println("原始坐标为:");

o.print();

//测试drop方法

o.drop();

System.out.println("调用drop方法后的坐标:");

o.print();

}

}

控制台的输出结果为:

原始坐标为:

(0,5), (0,6), (1,5), (1,6)

调用drop方法后的坐标:

(1,5), (1,6), (2,5), (2,6)

从输出结果上,可以看出方块中的每个格子的行都在原有基础上增加了1。界面对比效果如图-4所示。

下落前 下落后

图- 4

步骤八:定义方块的左移方法

定义方块的左移的方法,即,在O类中,添加方块左移一个格子的方法。要实现方块左移一个格子,只需要循环cells属性,将方块中的每一个格子的列减1即可。代码如下所示:

public class O {

Cell[] cells;// 属性,用来存储一个方块的四个格子的坐标

/**

* 构造方法,为属性cells进行初始化

*/

public O() {

this(0, 0);

}

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow

* 顺时针方向 ,第一个坐标的行

* @paramcol

* 顺时针方向 ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

/**

* 按顺时针方向,打印方块中四个格子所在的坐标

*/

public void print() {

String str = "";

for (int i = 0; i < cells.length - 1; i++) {

str += "(" + cells[i].getCellInfo() + "), ";

}

str += "(" + cells[cells.length - 1].getCellInfo() + ")";

System.out.println(str);

}

/**

* 使方块下落一个格子

*/

public void drop() {

for (int i = 0; i < cells.length; i++) {

cells[i].row++;

}

}

/**

* 使方块左移一个格子

*/

public void moveLeft() {

for (int i = 0; i < cells.length; i++) {

cells[i].col--;

}

}

}

步骤九:测试方块的左移方法

在TestO类中的main方法中,首先,将测试方块下落的代码注释,然后,调用对象o的moveLeft方法,最后,再调用对象o的print方法查看坐标的变化情况,代码如下所示:

public class TestO {

public static void main(String[] args) {

O o=new O(0,5);

//测试print方法

System.out.println("原始坐标为:");

o.print();

//测试drop方法

//        o.drop();

//        System.out.println("调用drop方法后的坐标:");

//        o.print();

//测试moveLeft方法

o.moveLeft();

System.out.println("调用moveLeft方法后的坐标:");

o.print();

}

}

控制台的输出结果为:

原始坐标为:

(0,5), (0,6), (1,5), (1,6)

调用moveLeft方法后的坐标:

(0,4), (0,5), (1,4), (1,5)

从输出结果上,可以看出O型方块中的每个格子的列都在原有的基础上减去了1。界面对比效果如图-5所示。

左移前 左移后

图- 5

步骤十:定义方块的右移方法

定义方块的右移的方法,即,在O类中,添加方块右移一个格子的方法。要实现方块右移一个格子,只需要循环cells属性,将方块中的每一个格子的列加1即可。代码如下所示:

public class O {

Cell[] cells;// 属性,用来存储一个方块的四个格子的坐标

/**

* 构造方法,为属性cells进行初始化

*/

public O() {

this(0, 0);

}

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow

* 顺时针方向 ,第一个坐标的行

* @paramcol

* 顺时针方向 ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

/**

* 按顺时针方向,打印方块中四个格子所在的坐标

*/

public void print() {

String str = "";

for (int i = 0; i < cells.length - 1; i++) {

str += "(" + cells[i].getCellInfo() + "), ";

}

str += "(" + cells[cells.length - 1].getCellInfo() + ")";

System.out.println(str);

}

/**

* 使方块下落一个格子

*/

public void drop() {

for (int i = 0; i < cells.length; i++) {

cells[i].row++;

}

}

/**

* 使方块左移一个格子

*/

public void moveLeft() {

for (int i = 0; i < cells.length; i++) {

cells[i].col--;

}

}

/**

* 使用方块右移一个格子

*/

public void moveRight() {

for (int i = 0; i < cells.length; i++) {

cells[i].col++;

}

}

}

步骤十一:测试方块的右移方法

在TestO类中的main方法中,首先,将测试方块的左移的代码注释,然后,调用对象o的moveRight方法,最后,再调用对象o的print方法查看坐标的变化情况,代码如下所示:

public class TestO {

public static void main(String[] args) {

O o=new O(0,5);

//测试print方法

System.out.println("原始坐标为:");

o.print();

//测试drop方法

//        o.drop();

//        System.out.println("调用drop方法后的坐标:");

//        o.print();

//测试moveLeft方法

//        o.moveLeft();

//        System.out.println("调用moveLeft方法后的坐标:");

//        o.print();

//测试moveRight方法

o.moveRight();

System.out.println("调用moveRight方法后的坐标:");

o.print();

}

}

控制台的输出结果为:

原始坐标为:

(0,5), (0,6), (1,5), (1,6)

调用moveRight方法后的坐标:

(0,6), (0,7), (1,6), (1,7)

从输出结果上,可以看出O型方块中的每个格子的列都在原有的基础上增加了1。界面对比效果如图-6所示。

右移前 右移后

图- 6

本案例中,O类的完整代码如下所示:

public class O {

Cell[] cells;// 属性,用来存储一个方块的四个格子的坐标

/**

* 构造方法,为属性cells进行初始化

*/

public O() {

this(0, 0);

}

/**

* 构造方法,为属性cells进行初始化

*

* @paramrow

* 顺时针方向 ,第一个坐标的行

* @paramcol

* 顺时针方向 ,第一个坐标的列

*/

public O(int row, int col) {

cells = new Cell[4];

// 按顺时针方向初始化Cell

cells[0] = new Cell(row, col);

cells[1] = new Cell(row, col + 1);

cells[2] = new Cell(row + 1, col);

cells[3] = new Cell(row + 1, col + 1);

}

/**

* 按顺时针方向,打印方块中四个格子所在的坐标

*/

public void print() {

String str = "";

for (int i = 0; i < cells.length - 1; i++) {

str += "(" + cells[i].getCellInfo() + "), ";

}

str += "(" + cells[cells.length - 1].getCellInfo() + ")";

System.out.println(str);

}

/**

* 使方块下落一个格子

*/

public void drop() {

for (int i = 0; i < cells.length; i++) {

cells[i].row++;

}

}

/**

* 使方块左移一个格子

*/

public void moveLeft() {

for (int i = 0; i < cells.length; i++) {

cells[i].col--;

}

}

/**

* 使用方块右移一个格子

*/

public void moveRight() {

for (int i = 0; i < cells.length; i++) {

cells[i].col++;

}

}

}

TestO类的完整代码如下:

public class TestO {

public static void main(String[] args) {

O o=new O(0,5);

//测试print方法

System.out.println("原始坐标为:");

o.print();

//测试drop方法

//        o.drop();

//        System.out.println("调用drop方法后的坐标:");

//        o.print();

//测试moveLeft方法

//        o.moveLeft();

//        System.out.println("调用moveLeft方法后的坐标:");

//        o.print();

//测试moveRight方法

o.moveRight();

System.out.println("调用moveRight方法后的坐标:");

o.print();

}

}

俄罗斯方块 java_java 俄罗斯方块相关推荐

  1. arm linux 俄罗斯方块,ARM 俄罗斯方块 - 下载 - 搜珍网

    单片机游戏/俄罗斯方块/Keil/Include/160128_driver.h 单片机游戏/俄罗斯方块/Keil/Include/Assistant.h 单片机游戏/俄罗斯方块/Keil/Inclu ...

  2. c语言程序设计俄罗斯方块PPT,俄罗斯方块游戏:C语言程序设计初步感受

    C语言课程设以一节课,老师提供了一个C语言的俄罗斯方块游戏让我们感受,本学期C语言课程,主要是各种语句的练习,这次是用以前的知识来感受一个实际的系统. 首先安装c-free,然后打开老师所发给我们的小 ...

  3. java俄罗斯方块旋转,俄罗斯方块旋转算法研究

    发表于 2012-12-05 06:36:24 by 月小升 最近在阅读俄罗斯方块的 A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4 D1 D2 D3 D4 旋转以B2 B3 ...

  4. ai俄罗斯方块java_俄罗斯方块进阶--AI俄罗斯方块

    原标题:俄罗斯方块进阶--AI俄罗斯方块 人工智能大火的今天,如果还是自己玩俄罗斯方块未免显得太LOW,为什么不对游戏升级,让机器自己去玩俄罗斯方块呢?有了这个想法之后利用周六周日两天的时间去搜集了大 ...

  5. 2048版俄罗斯方块java_俄罗斯方块版2048

    F)~15$NGC{)`PUWJ(RTH6.png (9.15 KB, 下载次数: 8) 2016-9-19 12:42 上传 ◆ 游 戏 简 介___________________________ ...

  6. c语言图像库 俄罗斯方块,C++俄罗斯方块游戏 无需图形库的俄罗斯方块

    本文实例为大家分享了C++俄罗斯方块游戏的具体实现代码,供大家参考,具体内容如下. #include #include #include #include #include #define MOD 2 ...

  7. 2048版俄罗斯方块java_俄罗斯方块2048

    俄罗斯方块和2048都是小伙伴们都玩过的游戏,那如果将两者相融合会产生什么样的效果呢>在<俄罗斯方块2048>中,玩家就将体验到结合了2048的俄罗斯方块,这款游戏不仅难度上更上一层 ...

  8. java俄罗斯方块ppt_java俄罗斯方块游戏毕业设计答辩.ppt

    java俄罗斯方块游戏毕业设计答辩 使用JavaGUI开发俄罗斯方块游戏 作者: 项目介绍 1.传统游戏 2.主要使用Java语言进行GUI设计.图形编程.线程程序开发.算法的实现思路 意义和研究目的 ...

  9. python编辑俄罗斯方块_python俄罗斯方块

    #coding=utf-8 from tkinter import * from random import * importthreadingfrom tkinter.messagebox impo ...

  10. java双人俄罗斯方块_俄罗斯方块双人对战java源码

    [实例简介] 可以直接运行的java代码,朱福喜的实训书上的,需要的请拿去 [实例截图] [核心代码] b8080832-7336-4ebe-9fc9-43418e387635 └── 俄罗斯对战标准 ...

最新文章

  1. python中的order_Hive中Order by和Sort by的区别是什么?
  2. vscode如何添加头部注释、作者注释
  3. (一二四)给类对象赋值、以及类对象的返回值
  4. aws rds监控慢sql_AWS RDS SQL Server恢复模型,备份和还原
  5. Innodb中常见SQL语句设置的锁类型
  6. Atitit webclient httpclient技术总结 RestTemplate Atitit CateIT重要技术httpclient iduah2 impt 体系树路径:CS
  7. 图书管理系统(C语言实现)
  8. access导入失败:操作必须使用一个可更新的查询。
  9. 自己动手写reg注册表文件--thanklife整理后
  10. win7录屏_录屏软件推荐用什么?绝地求生录屏游戏的工具分享
  11. 最详细的选型攻略!选择工业相机必须搞懂这10大要素!(建议收藏)
  12. HP-Socket精简示例
  13. 有关tty hangup
  14. 周转时间 平均周转时间 带权周转时间 平均带权周转时间
  15. 远程桌面 域计算机,在AD中实现仅普通域用户可通过远程桌面控制自身计算机
  16. APP超级签名分发系统 企业签名免签封装微信多开自助分发多合一系统
  17. Robust Visual Tracking with a Freely-moving Event Camera
  18. QDir 类 -属性详解
  19. [转] 为UIWebView实现离线浏览
  20. vim / gedit 打开GBK文件乱码问题

热门文章

  1. 数据库系统教程-面试汇总-合集
  2. html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面
  3. 网络爬虫:中国大学排名定向爬虫
  4. 基金登记过户系统相关
  5. excel 2016 英文界面 更换 中文界面
  6. 医院药品管理系统java sql_医院药品管理系统设计(Netbeans,Myeclipse,MySQL,SQLServer)
  7. 集体智慧编程 - 读书笔记
  8. 芯片验证工作初有感--没落骑士
  9. 国内银行卡BIN号速查简表
  10. eclipse下彻底删除SVN插件