Top

JAVA OOP DAY01

  1. 打印员工信息
  2. 定义Tetris项目中的Cell类
  3. 在Tetris项目中实现格子的下落、左移以及获取格子的位置信息的功能
  4. 创建Cell对象并添加打印方法

1 打印员工信息

1.1 问题

构建程序,实现员工的信息的打印,打印的效果如图-1所示:

图-1

从图-1可以看出,第二次打印员工“”信息时,该员工的工资上涨25%。

1.2 方案

首先,一个员工包含多方面的信息数据,可以考虑使用一个对象来封装员工的数据。而多个员工的数据结构项是相同的,不同的是具体的数据,因此,可以定义一个类 Emp,用于表示员工;并在类中定义多个属性用于表示员工的各项数据。代码如下所示:

public class Emp {
	String name;
	int age;
	char gender;
	double salary;
}

然后,修改类 Emp,在类中定义打印员工信息的方法,代码如下所示:

public void printInfo() {
		System.out.println("--------------------");
		System.out.println("姓名: " + name);
		System.out.println("年龄:" + age);
		System.out.println("性别:" + gender);
		System.out.println("薪水:" + salary);
	}

最后,在main 方法中,创建员工对象之后,可以直接调用该对象的打印方法,以显示数据。代码如下所示:

		Emp emp2 = new Emp();
		emp2.name = "白发馍女";
		emp2.age = 24;
		emp2.gender = '女';
		emp2.salary = 6000;

		emp2.printInfo();

将员工信息封装为printInfo方法的好处为:如果员工增加其他数据项,或者打印的功能发生变化(比如打印的格式发生变化),只需要维护类 Emp 的代码即可,而调用方(方法main)依然只需要调用相应的方法即可,从而简化了代码的维护和扩展。

1.3 步骤

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

步骤一:定义类Emp

首先定义一个名为 Emp 的类,并在类中定义四个属性,分别表示员工的姓名、年龄、性别和薪资。代码如下所示:

public class Emp {
	String name;
	int age;
	char gender;
	double salary;
}

步骤二:修改类Emp,为其定义打印员工信息的方法

修改类 Emp 中的代码,为该类定义方法,用于打印员工信息。代码如下所示:

public class Emp {
	String name;
	int age;
	char gender;
	double salary;

#cold_bold	/**
#cold_bold	 * 打印员工信息
#cold_bold	 */
#cold_bold	public void printInfo() {
#cold_bold		System.out.println("--------------------");
#cold_bold		System.out.println("姓名: " + name);
#cold_bold		System.out.println("年龄:" + age);
#cold_bold		System.out.println("性别:" + gender);
#cold_bold		System.out.println("薪水:" + salary);
#cold_bold	}
}

步骤三:构建对象,打印数据

创建EmpManager类,在该类的 main 方法中添加代码:定义对象,封装员工的各项数据,并调用对象的打印方法。代码如下所示:

public class EmpManager{
	public static void main(String[] args) {
#cold_bold		//创建对象
#cold_bold		Emp emp2 = new Emp();
#cold_bold		emp2.name = "白发馍女";
#cold_bold		emp2.age = 24;
#cold_bold		emp2.gender = '女';
#cold_bold		emp2.salary = 6000;
#cold_bold		//打印数据
#cold_bold		emp2.printInfo();
	}
}

步骤四:修改薪资信息

将员工的薪资提高25%,并重新打印信息。代码如下所示:

public class EmpManager{
	public static void main(String[] args) {
		//创建对象
		Emp emp2 = new Emp();
		emp2.name = "白发馍女";
		emp2.age = 24;
		emp2.gender = '女';
		emp2.salary = 6000;
		//打印数据
		emp2.printInfo();

#cold_bold		//调整薪资
#cold_bold		emp2.salary *= 125.0 / 100.0;
#cold_bold		emp2.printInfo();
	}
}

1.4 完整代码

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

public class Emp {
	String name;
	int age;
	char gender;
	double salary;

	/**
	 * 打印员工信息
	 */
	public void printInfo() {
		System.out.println("--------------------");
		System.out.println("姓名: " + name);
		System.out.println("年龄:" + age);
		System.out.println("性别:" + gender);
		System.out.println("薪水:" + salary);
	}
}

类EmpManager的完整代码如下所示:

public class EmpManager{
	public static void main(String[] args) {
		//创建对象
		Emp emp2 = new Emp();
		emp2.name = "白发馍女";
		emp2.age = 24;
		emp2.gender = '女';
		emp2.salary = 6000;
		//打印数据
		emp2.printInfo();

		//调整薪资
		emp2.salary *= 125.0 / 100.0;
		emp2.printInfo();
	}
}

2 定义Tetris项目中的Cell类

2.1 问题

Tetris俄罗斯方块(Tetris, 俄文:Тетрис)是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。其界面效果如图-2所示:

图-2

Tetris游戏的基本规则为:

图-3

Tetris游戏的逻辑为:

  1. 玩家操作有:旋转方块;以格子为单位左右移动方块;让方块加速落下。
  2. 方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。
  3. 当区域中某一行的横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的行数越多,得分指数上升。
  4. 当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。
  5. 一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会考虑到下一个方块,评估要如何进行。由于游戏能不断进行下去对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度。
  6. 预先设置的随机发生器不断地输出单个方块到场地顶部。

本案例需要定义类来表示Tetris游戏中的基本构造单元:格子。

2.2 方案

每一个格子可以由其所在行的行号和所在列的列号来确定位置。例如:图-4中的白色格子,其坐标为(3,2),即行号为3,列号为2;绿色格子的坐标为(8,7),即行号为8,列号为7;黄色格子的坐标为(17,4),即行号为17,列号为4。

图-4

因此,需要定义Cell类来表示格子,且类中需要包含两个成员变量: row表示行号,类型为int;col表示列号,类型为int;代码如下所示:

public class Cell {
	int row;
	int col;
}

2.3 步骤

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

步骤一:定义 Cell类

首先定义一个名为 Cell的类,表示格子,并在类中添加两个int类型的成员变量:col和row,分别表示格子的横向坐标和纵向坐标。代码如下所示:

public class Cell {
	int row;
	int col;
}

2.4 完整代码

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

public class Cell {
	int row;
	int col;
}

3 在Tetris项目中实现格子的下落、左移以及获取格子的位置信息的功能

3.1 问题

本案例需要实现格子下落、左移以及获取格子的位置信息的功能,详细要求如下:

1. 实现格子的下落功能,即,为 Cell类定义下落的方法,调用该方法后,格子的位置将下降一行。

2. 实现格子的左移功能,即,为 Cell类定义左移的方法:调用左移方法,并传入需要移动的列数,则格子将向左移动相应的列数.

3. 实现格子的getCellInfo方法,调用该方法,即可打印格子的位置信息。

3.2 方案

要实现本案例要求的功能,解决方案如下:

1. 为实现格子下落,需要为Cell类定义 drop 方法,并在该方法中,将格子的行数增加一行,代码如下所示:

	public void drop() {
		  row++;
	}

2. 为实现格子左移,需要为Cell类定义 moveLeft 方法,该方法需要接收一个 int 类型的参数,表示向左移动的列数,然后在该方法中,将格子的列数减少相应的数值。代码如下所示:

	public void moveLeft(int d) {
		  col -= d;
	}

3. 为输出格子的位置信息,可以为Cell类定义 getCellInfo方法,该方法返回格子的位置信息,格式形如 row,col。代码如下所示:

	public String getCellInfo() {
		  return row + "," + col;
	     }

3.3 步骤

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

步骤一:为 Cell 类定义 drop 方法

在Cell 类中,添加方法 drop,实现行数的增长。代码如下所示:

public class Cell {
	int row;
	int col;
#cold_bold//下落一行
#cold_bold	public void drop() {
#cold_bold		row++;
#cold_bold	}
}

步骤二:为 Cell 类定义 moveLeft 方法

在Cell 类中,添加方法 moveLeft,实现列数的减少。代码如下所示:

public class Cell {
	int row;
	int col;

//下落一行
	public void drop() {
		row++;
	}
#cold_bold//左移
#cold_boldpublic void moveLeft(int d) {
#cold_bold		col -= d;
#cold_bold	}
}

步骤三:为 Cell 类定义 getCellInfo方法

在Cell 类中,添加方法 getCellInfo,用于返回格子的位置信息。代码如下所示:

public class Cell {
	int row;
	int col;

//下落一行
	public void drop() {
		row++;
	}
//左移
public void moveLeft(int d) {
		col -= d;
	}
#cold_boldpublic String getCellInfo () {
#cold_bold		return row + "," + col;
#cold_bold	}
}

3.4 完整代码

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

public class Cell {
	int row;
	int col;

//下落一行
	public void drop() {
		row++;
	}
//左移
public void moveLeft(int d) {
		col -= d;
	}
public String getCellInfo () {
		return row + "," + col;
	}
}

4 创建Cell对象并添加打印方法

4.1 问题

之前案例已经构建了Cell类并定义了格子的下落、左移以及获取格子的位置信息方法。本案例要求可以设置格子的坐标,然后在界面上打印显示格子的位置信息。界面效果如图-5所示:

图-5

为了更好的理解本案例,我们用图-6来标识场地以及格子的详细信息。

图-6

由图-6可以看出,游戏所在的平面由10列×20行个格子构成,可以将场地的左上角点定为原点,对行和列进行编号,列号为0~9,行号为0~19。

本案例详细要求如下:

1. 首先需要打印出游戏所在的平面(宽10格,高20格),用“-”号表示平面上的每个单元;然后假设某格子的行号为15,列号为6,即,该格子的坐标为(15,6),需要使用“*”号打印显示该格子,如图-6中蓝色圈内所示。

2. 测试格子的下落功能,界面效果如图-7所示:

图-7

图-7中的左图中的蓝色圈中的“*”号表示格子的原始位置,右图中蓝色圈中的“*”号表示格子下落一行后的位置。

4.2 方案

首先创建一个 Cell对象,并设置行列坐标,代码如下所示:

	Cell cell = new Cell();
	cell.row = 15;
	cell.col = 6;

然后,需要在控制台输出10列×20行的场地,示意代码如下所示:

//总行数和总列数
int totalRow = 20;
int totalCol = 10;
for (int row = 0; row < totalRow; row++) {
		for (int col = 0; col < totalCol; col++) {
			System.out.print("- ");//输出场地
		}
		System.out.println();
	}

如果需要在场地上用“*”号表示某个单元格,则需要进行行列的判断。示意代码如下所示:

//总行数和总列数
int totalRow = 20;
int totalCol = 10;

//某个格子的行和列
int currentRow = 5;
int currentCol = 3;
for (int row = 0; row < totalRow; row++) {
		for (int col = 0; col < totalCol; col++) {
#cold_bold			if ( currentRow == row && currentCol == col) {
#cold_bold				System.out.print("* ");//输出格子
#cold_bold			} else {
#cold_bold				System.out.print("- ");//输出场地
#cold_bold			}
		}
		System.out.println();
	}

4.3 步骤

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

步骤一:定义 CellGame 类

定义一个名为 CellGame 的类,并在类中添加Java应用程序的主方法main,代码如下所示:

public class CellGame{
	public static void main(String[] args) {
	}
}

步骤二:创建打印 Cell 对象的方法

在CellGame 的类中定义方法 printCell() ,用于打印场地以及某个 Cell 的信息。场地用“-”表示,指定的格子用“*”表示。为标识出指定格子的信息,需要将 Cell 对象作为参数传入。代码如下所示:

public class CellGame{
	public static void main(String[] args) {
	}
#cold_bold	public static void printCell(Cell cell) {
#cold_bold		int totalRow = 20;
#cold_bold		int totalCol = 10;
#cold_bold
#cold_bold		//打印场地
#cold_bold		for (int row = 0; row < totalRow; row++) {
#cold_bold			for (int col = 0; col < totalCol; col++) {
#cold_bold				if (cell.row == row && cell.col == col) {
#cold_bold					//打印指定的格子
#cold_bold					System.out.print("* ");
#cold_bold				} else {
#cold_bold					System.out.print("- ");
#cold_bold				}
#cold_bold			}
#cold_bold			System.out.println();
#cold_bold		}
#cold_bold	}
}

步骤三:创建Cell对象,并打印

在main 方法中添加代码,创建一个 Cell 对象,设置其位置后,调用上一步中所创建的打印方法打印信息。代码如下所示:

public class CellGame{
	public static void main(String[] args) {
#cold_bold		System.out.println("----------绘制Cell----------");
#cold_bold		//创建 Cell对象,并打印
#cold_bold		Cell cell = new Cell();
#cold_bold		cell.row = 15;
#cold_bold		cell.col = 6;
#cold_bold		printCell(cell);
	}

	public static void printCell(Cell cell) {
		int totalRow = 20;
		int totalCol = 10;

		//打印场地
		for (int row = 0; row < totalRow; row++) {
			for (int col = 0; col < totalCol; col++) {
				if (cell.row == row && cell.col == col) {
					//打印指定的格子
					System.out.print("* ");
				} else {
					System.out.print("- ");
				}
			}
			System.out.println();
		}
	}
}

步骤四:测试 drop 方法

在CellGame 类的main 方法中继续添加代码:调用cell 对象的 drop方法,实现格子下落一行,然后调用打印方法打印信息。代码如下所示:

public class CellGame{
	public static void main(String[] args) {
		System.out.println("----------绘制Cell----------");
		//创建 Cell对象,并打印
		Cell cell = new Cell();
		cell.row = 15;
		cell.col = 6;
		printCell(cell);

#cold_bold		//调用drop方法,下落一行
#cold_bold		System.out.println("----------Cell下落一行----------");
#cold_bold		cell.drop();
#cold_bold		printCell(cell);
	}

	public static void printCell(Cell cell) {
		int totalRow = 20;
		int totalCol = 10;

		//打印场地
		for (int row = 0; row < totalRow; row++) {
			for (int col = 0; col < totalCol; col++) {
				if (cell.row == row && cell.col == col) {
					//打印指定的格子
					System.out.print("* ");
				} else {
					System.out.print("- ");
				}
			}
			System.out.println();
		}
	}
}

测试moveLeft方法和getCellInfo方法与测试drop方法类似,请自行测试。

4.4 完整代码

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

public class Cell {
	int row;
	int col;

//下落一行
	public void drop() {
		row++;
	}
//左移
public void moveLeft(int d) {
		col -= d;
	}
public String getCellInfo () {
		return row + "," + col;
	}
}

类CellGame的完整代码如下所示:

public class CellGame{
	public static void main(String[] args) {
		System.out.println("----------绘制Cell----------");
		//创建 Cell对象,并打印
		Cell cell = new Cell();
		cell.row = 15;
		cell.col = 6;
		printCell(cell);

		//调用drop方法,下落一行
		System.out.println("----------Cell下落一行----------");
		cell.drop();
		printCell(cell);
	}

	public static void printCell(Cell cell) {
		int totalRow = 20;
		int totalCol = 10;

		//打印场地
		for (int row = 0; row < totalRow; row++) {
			for (int col = 0; col < totalCol; col++) {
				if (cell.row == row && cell.col == col) {
					//打印指定的格子
					System.out.print("* ");
				} else {
					System.out.print("- ");
				}
			}
			System.out.println();
		}
	}
}