《Java小游戏实现》:贪吃蛇
在完成坦克大战之后,就想到了贪吃蛇这个小游戏,因为这两个游戏太像了,因此,就决定把这个游戏来尝试的写下。接下来的几篇博文就是来记录这个小游戏实现的全过程。
突然,想起,一年前(时间是2015年7月3日),我刚学习Java的时候看过别人写的这个游戏源代码,还专门写了篇博文,连接如下:http://blog.csdn.net/u010412719/article/details/46746343
确实好巧,今天我自己就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现。
第一步完成的功能:写一个界面
大家见到的贪吃蛇小游戏,界面肯定是少不了的。因此,第一步就是写一个小界面。
实现代码如下:
public class SnakeFrame extends Frame{
//方格的宽度和长度
public static final int BLOCK_WIDTH = 15 ;
public static final int BLOCK_HEIGHT = 15 ;
//界面的方格的行数和列数
public static final int ROW = 40;
public static final int COL = 40;
public static void main(String[] args) {
new SnakeFrame().launch();
}
public void launch(){
this.setTitle("Snake");
this.setSize(ROW*BLOCK_HEIGHT, COL*BLOCK_WIDTH);
this.setLocation(300, 400);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setVisible(true);
}
}
第二步完成的功能:在界面上画成一格一格的
我们见过的贪吃蛇游戏,是有一个格子一个格子构成,然后蛇在这个里面运动。
重写paint方法,单元格就是横着画几条线竖着画几条线即可。
代码如下:
@Override
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.GRAY);
/*
* 将界面画成由ROW*COL的方格构成,两个for循环即可解决
* */
for(int i = 0;i<ROW;i++){
g.drawLine(0, i*BLOCK_HEIGHT, COL*BLOCK_WIDTH,i*BLOCK_HEIGHT );
}
for(int i=0;i<COL;i++){
g.drawLine(i*BLOCK_WIDTH, 0 , i*BLOCK_WIDTH ,ROW*BLOCK_HEIGHT);
}
g.setColor(c);
}
效果如下:
第三步完成的功能:建立另外的线程来控制重画
由于,蛇的运动就是改变蛇所在的位置,然后进行重画,就是我们所看到的运动。因此,在这里,我们单独用一个线程来控制重画。
1、新建一个MyPaintThread类,实现了Runnable接口
private class MyPaintThread implements Runnable{
@Override
public void run() {
//每隔50ms重画一次
while(true){
repaint();//会自动调用paint方法
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2、在SnakeFrame的launchFrame方法中添加代码:new Thread(new MyPaintThread()).start();
即可。
完成功能:利用双缓冲来解决闪烁的问题
private Image offScreenImage = null;
/*
* 重写update方法
* */
@Override
public void update(Graphics g) {
if(offScreenImage==null){
offScr