首先理一下思路:
1.创建界面 创建一个背景类,主函数入口。
2.创建方块,从顶端出现。 创建一个节点类。
3.使方块下降,每秒一次。 改变坐标位置。每秒重画一次。
4.在下降的同时,出现新的方块。 将节点相连,并每次重画的时候创建一个新的节点。
5.实现触碰效果,碰到最下面的方块以后,消去。 设置鼠标监听事件和鼠标点击点的坐标,当点击在范围内将消去最下面的方块。
6.漏点或者有方块降下去,游戏结束。 设置边界,头部超出,或点击的不是头部区域则失败。
写的有点烂,大神勿喷,只实现了基本功能。
再运行时,反应有点慢,只能等线程阻塞完成后他才会消去方块,线程问题没有解决,到最后只会越来越多。
有什么好的见解可以告诉我一声。
界面背景类:
public class frame extends Frame{
private int vk=100;
private int x=-200,y=-200;
private boolean flag=true;
queue qq=new queue();
public frame(){ //基本界面
super("别踩白块");
this.setBounds(600, 300, 400, 700);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(-1);
}
});
new MyThread().start(); //创建一个线程,用于更新画布
addMouseListener(new Mouse()); //设立鼠标监听事件
}
public void paint(Graphics g){
g.setColor(Color.BLACK);
for(int i=0;i<=4;i++){
g.drawLine(0+i*vk, 0, 0+i*vk, 700);
}
for(int i=0;i<=7;i++){
g.drawLine(0, 100+i*vk, 400, 100+i*vk);
}
qq.draw(g);
qq.add();
}
public void carsh(){
int cx=x-x%100; //取整百数操作
int cy=y-y%100;
if ((cx==qq.getX())&&(cy==qq.getY())) { //判断点击是否在方块内,如果在则消去方块
qq.delete();
}
else {
flag=false;
}
}
public void gameover(){ //游戏结束函数
Label label=new Label("游戏结束");
label.setBounds(100, 200, 300, 100);
label.setFont(new Font("宋体", 1, 50));
this.add(label);
this.setLayout(null);
this.setVisible(true);
}
class Mouse extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton()==MouseEvent.BUTTON1) { //获得鼠标点击点的坐标
x=e.getX();
y=e.getY();
carsh();
}
}
}
public static void main(String[] args) {
frame bg=new frame();
}
class MyThread extends Thread{
@Override
public void run() {
while(true){
try {
if(flag==true){
repaint(); //重画
qq.headxy(); //获得最下面的方块坐标
}
else {
break;
}
Thread.sleep(1000);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
gameover();
}
}
}
队列类:用于将每个方块连起来,用于判断哪个是头,哪个是尾。
public class queue {
private node tail;
private node head;
private node block;
private int x,y;
public queue(){
block=new node();
head=block;
tail=block;
}
//将每个方块都画出来
public void draw(Graphics g){
for(node n=head;n!=null;n=n.next){
n.draw(g);
}
}
// 新增node节点,新增的node的后驱节点为原来的头部,令原来的头部的前驱节点等于新节点,使方块连起来,最后令新节点变为头部。
public void add(){
node block=new node();
block.next=head;
head.prex=block;
head=block;
}
//删除尾部方块,尾部删除则是另尾部变为尾部的前驱节点,接着使新的尾部的后驱节点置空。
public void delete(){
tail=tail.prex;
tail.next=null;
}
//这个是尾部删除,之前写错了,方法名没有更改
public void headxy(){
x=tail.getX();
y=tail.getY();
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
方块类:
public class node {
node prex;
node next;
private int vk=100;
private int x,y;
public node(){
x=(new Random().nextInt(4))*vk;
y=-100;
}
public void draw(Graphics g){ //画方块,每次向下移一格
g.setColor(Color.blue);
g.fillRect(x, y, 100, 100);
y=y+vk;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}