知道这里大神多,本人不编程10余年了,手生的很,盼大神多给提意见啊
前段时间心血来潮,突然想学java,看书月余,准备写个程序练练手,正犹豫写什么呢,看到老婆在玩俄罗斯方块,就它吧。
1、创建1个方块类JuXing{
private Point psite; //方块的左下角坐标
private Color c; //颜色
private int width; //宽度
private int height; //高度
}
包括一个画自己的方法
public void drawSef(Graphics g){}//画方块
复写equals、hashcode、tostring方法
因为概念还都不是很清楚,这里先照本宣科。
2、由于俄罗斯方块含有若干小方块,这里再创建1个NJuXing的类,顾名思义,包括N个小JuXing。
一个图形类的实例就是1个由方块组成的整体,例如L、T、|以及反方向的
class NJuXing{ //图形类,是方块类的集合
private Point psite; //旋转时基准点坐标,此点不动
private static int width=20; //方块的宽度
private static int height=20; //方块的高度
private int selshape; //用来确定当前图形的形状
Set<JuXing> ls; //当前图形包含所有方块的坐标
private Color c; //当前图形的颜色
}
包括一个画自己的方法
public void drawSef(Graphics g){ }//画一个图形
这个图形要移动,所以包括一个判断能否移动的方法,这里移动包括上下左右,由方向键控制,最后把向上移动给注释就OK了
public boolean canMove(){}
由空格键控制图形的旋转
public void turnSel(){}
然后就是四个方向的移动了
moveUp(){}、moveDown(){}、moveLeft(){}、moveRight(){}
还有图形的闪烁,比如说刚出来,或者到了底部,马上就不能移动的时候
flash(){}//最后这项任务没实现,思路还不清晰
3、基础工作做完了,就需要画图了,画图就需要画板
class Palette extends JPanel{
private static int row=26; //行数
private static int col=15; //列数
private static int width=20;
private static int height=20;
private static Point zerop=new Point(10,540); //左下角方块坐标
private NJuXing njx; //当前移动的图形
private Set<JuXing> lsbottom; //所有不可移动方块的坐标
private static Point gop=new Point(zerop.x+(col/2+1)*20,zerop.y-row*20);//所有图形的出发位置
private NJuXing nextnjx; //下一个图形
private Point nextp=new Point(400,100); //下一个图形的坐标
private static long score=0; //分值
private int level=1; //级别
private Timer timedown; //下降速度
private boolean timeflag=false; //实现暂停
}
这里需要一个产生图形实例的方法,
newNJuXing(){}
还需要实现键盘监听,4个方向键控制移动方向,空格实现旋转,ESC实现暂停,功能不多
用时间timer来控制图形的自动下坠,所有下坠到底部的图形加入到lsbottom中
还有一个重要功能没有实现:清除已放满小方块的行并计分,这里设计了两个方法
fullRow(){}和clearRow()
运行了一下,没图,还需要复写paintComponent(){},在这里画lsbottom,当前图形njx,下一个图形nextjx,级别level,成绩score
4、画布类
class Canvas extends JFrame {
private static int width=500;
private static int height=600;
private Palette ipal;}
只需要把画板加进来就好了
运行,基本功能都实现了。
总结:Set集合的内容改变值后不能自动排序,这点记忆深刻,因为这个问题困扰了1天,既然不能自动排序,也就没必要用Set集合了,不过后来也没再修改。
下一节介绍:推箱子