<small>
图形下落
本案例要求完成 CellGame,用户可以在控制台上操作格子的下落、左移和右移。
游戏刚开始,将在界面上显示一个格子,界面效果如图-2上左图中的蓝色圈内所示,用户可以在控制台选择输入各种操作:1表示下落一行,2表示左移一列,3表示右移一列,0表示退出。如果用户录入1,则格子下落一行,并重新打印显示,界面效果如图-2上右图中的蓝色圈内所示:
如果用户录入2,则格子左移一列,并重新打印显示,界面效果如图-3上左图中蓝色圈内所示;如果用户录入3,则格子右移一列,并重新打印显示,界面如图-3上右图中蓝色圈内所示:
星星图形的对象
package com.ksxx.oop.day03.am.exercise;
/**
* *类:
* 属性:
* int x,y;//坐标
String CHARACTER = "*";//组成元素
方法:
printCell()//打印
moveLeft()//左移
moveRight()//右移
drop()//下落
* @author chengcheng
*
*/
public class Cell {
//属性:
int row,col;//坐标
String CHARACTER = "* ";//组成元素
//无参构造
public Cell(){
//默认位置(第一行,第五列)
// this.x = 0;
// this.y = 4;
this(0,4);
}
//有参构造
public Cell(int row,int col){
//默认位置(第一行,第五列)
this.row = row;
this.col = col;
}
//方法:
//打印
public void printCell(){
System.out.print(this.CHARACTER);
}
//右移:row行不变,col列每移动一次,++一次
public void moveRight(){
col++;
}
}
墙对象:
package com.ksxx.oop.day03.am.exercise;
/**
* Wall墙面:
* 由 200个-号对象 组成 无意义
*
* 属性:
* 多少行、多少列
* 组成元素
*
* 方法:
* 打印墙体
* @author chengcheng
*
*/
public class Wall {
//如下设计无意义
/*Line[][] lines;
public Wall(){
lines = new Line[20][10];
for(int i=0; i<lines.length; i++){//行:y
for(int j=0; j<lines[i].length; j++){//列:x
//矩阵中每个 - 从出现开始,坐标就已经确定。
lines[i][j] = new Line(i,j);
}
}
}*/
//属性:
int rows;//行数
int cols;//列数
String CHARACTER = "- ";//组成元素
Cell cell;//另一个组成元素
//无参构造,默认大小墙体
public Wall(){
// this.rows = 20;//20行
// this.cols = 10;//10列
this(20,10);
}
//有参构造,自定义大小墙体,默认cell位置
public Wall(int rows, int cols){
this.rows = rows;
this.cols = cols;
//默认cell在墙体的位置
cell = new Cell();
}
//有参构造,默认大小墙体,自定义cell位置
public Wall(Cell cell){
this(20,10);
//自定义cell位置
this.cell = cell;
}
//有参构造,自定义大小墙体,自定义cell位置
public Wall(int rows, int cols, Cell cell){
this.rows = rows;
this.cols = cols;
//自定义cell位置
this.cell = cell;
}
//方法:
//墙体的打印。
public void printWall(){
for(int i=0; i<rows; i++){//行:rows
for(int j=0; j<cols; j++){//列:cols
if(i == this.cell.row &&
j == this.cell.col){
System.out.print(this.cell.CHARACTER);
continue;
}
System.out.print(this.CHARACTER);
}
System.out.println();//换行
}
}
}
测试方法
package com.ksxx.oop.day03.am.exercise;
import java.util.Scanner;
public class GameStart_V2 {
public static void main(String[] args) {
//创建墙体对象
Wall wall = new Wall(new Cell(9,0));
wall.printWall();
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("3 - 向右,0 - 退出");
int number = sc.nextInt();
if(number == 0){
//退出
break;
}else if(number == 3){
//右移:
//定位墙体中的cell元素,向右移:
wall.cell.moveRight();
}
//重绘
wall.printWall();
}
}
}
如果图形由※号改为 T 形图,可以将代码修改如下
package com.ksxx.oop.day05.am.exercise;
/**
* Wall墙面:
* 由 200个-号对象 组成 无意义
*
* 属性:
* 多少行、多少列
* 组成元素
*
* 方法:
* 打印墙体
* @author chengcheng
*
*/
public class Wall {
//属性:
int rows;//行数
int cols;//列数
String CHARACTER = "- ";//组成元素
// Cell cell;//另一个组成元素
T t;//组成元素由1个Cell变成4个Cell组成的T型。
//无参构造,默认大小墙体
public Wall(){
// this.rows = 20;//20行
// this.cols = 10;//10列
this(20,10);
}
//有参构造,自定义大小墙体,默认cell位置
public Wall(int rows, int cols){
this.rows = rows;
this.cols = cols;
//默认T在墙体的位置
t = new T();
}
//有参构造,默认大小墙体,自定义T位置
public Wall(Cell cell){
this(20,10);
//自定义cell位置
this.t = new T(cell);
}
//有参构造,自定义大小墙体,自定义t位置
public Wall(int rows, int cols, Cell cell){
this.rows = rows;
this.cols = cols;
//自定义t位置
this.t = new T(cell);
}
//方法:
//墙体的打印。
public void printWall(){
//开关
/*boolean flag;
for(int i=0; i<rows; i++){//行:rows
for(int j=0; j<cols; j++){//列:cols
flag = true;//开关开启
//对T型进行打印
for(int k=0; k<t.cells.length; k++){
if(i == t.cells[k].row &&
j == t.cells[k].col){
System.out.print(t.cells[k].CHARACTER);
flag = false;//开关关闭
break;
}
}
if(flag){
System.out.print(this.CHARACTER);
}
}
System.out.println();//换行
}*/
for(int i=0; i<rows; i++){//行:rows
second:for(int j=0; j<cols; j++){//列:cols
//对T型进行打印
for(int k=0; k<t.cells.length; k++){
if(i == t.cells[k].row &&
j == t.cells[k].col){
System.out.print(t.cells[k].CHARACTER);
continue second;
}
}
System.out.print(this.CHARACTER);
}
System.out.println();//换行
}
}
}
若要求发生改变为:要把图形从 T 改变为 O、L、J、S、Z、I 等图形的的随机出现可以将代码改为:
package com.ksxx.oop.day05.am.exercise;
import java.util.Random;
/**
* Wall墙面:
* 由 200个-号对象 组成 无意义
*
* 属性:
* 多少行、多少列
* 组成元素
*
* 方法:
* 打印墙体
* @author chengcheng
*
*/
public class Wall {
//属性:
int rows;//行数
int cols;//列数
String CHARACTER = "- ";//组成元素
Tetramino newTetramino;//抽象的俄罗斯方块
//无参构造,默认大小墙体
public Wall(){
// this.rows = 20;//20行
// this.cols = 10;//10列
this(20,10);
}
//有参构造,自定义大小墙体,默认cell位置
public Wall(int rows, int cols){
this.rows = rows;
this.cols = cols;
newTetramino = randomTetramino();
}
//有参构造,默认大小墙体,自定义T位置
public Wall(Cell cell){
this(20,10);
this.newTetramino = randomTetramino(cell);
}
//有参构造,自定义大小墙体,自定义t位置
public Wall(int rows, int cols, Cell cell){
this.rows = rows;
this.cols = cols;
this.newTetramino = randomTetramino(cell);
}
//方法:
//墙体的打印。
public void printWall(){
//开关
/*boolean flag;
for(int i=0; i<rows; i++){//行:rows
for(int j=0; j<cols; j++){//列:cols
flag = true;//开关开启
//对T型进行打印
for(int k=0; k<t.cells.length; k++){
if(i == t.cells[k].row &&
j == t.cells[k].col){
System.out.print(t.cells[k].CHARACTER);
flag = false;//开关关闭
break;
}
}
if(flag){
System.out.print(this.CHARACTER);
}
}
System.out.println();//换行
}*/
for(int i=0; i<rows; i++){//行:rows
second:for(int j=0; j<cols; j++){//列:cols
//对T型进行打印
for(int k=0; k<newTetramino.cells.length; k++){
if(i == newTetramino.cells[k].row &&
j == newTetramino.cells[k].col){
System.out.print(newTetramino.cells[k].CHARACTER);
continue second;
}
}
System.out.print(this.CHARACTER);
}
System.out.println();//换行
}
}
/**
* 随机产生具体俄罗斯方块
*/
private Tetramino randomTetramino(){
Random ran = new Random();
int number = ran.nextInt(3);
//返回随机的俄罗斯方块
//方式一:
// Tetramino[] tetris = {new T(),new J(),new L()};
// return tetris[number];
Tetramino tetramino = null;
//方式二
/*if(number == 0){
tetramino = new T();
}else if(number == 1){
tetramino = new J();
}else if(number == 2){
tetramino = new L();
}else{
tetramino = new L();
}*/
//方式三
switch(number){
case 0:
tetramino = new T();break;
case 1:
tetramino = new L();break;
case 2:
tetramino = new J();break;
default:
tetramino = new T();break;
}
return tetramino;
}
private Tetramino randomTetramino(Cell cell){
Random ran = new Random();
int number = ran.nextInt(3);
Tetramino tetramino = null;
switch(number){
case 0:
tetramino = new T(cell);break;
case 1:
tetramino = new L(cell);break;
case 2:
tetramino = new J(cell);break;
default:
tetramino = new T(cell);break;
}
return tetramino;
}
}