java贪吃蛇(障碍物*咬尾巴)

java贪吃蛇(障碍物*咬尾巴)_第1张图片

java贪吃蛇(障碍物*咬尾巴)_第2张图片

java贪吃蛇(障碍物*咬尾巴)_第3张图片

ArrayList的各种方法addAll(),add(),remove(),clear(),与数组的区别
退出:System.exit(0);
JPanel的paintComponent(Graphics g)方法,有GUI系统调用,或者调用JPanel.repaint()重绘
KeyListener监听按键事件,非数字去方向键为VK_DOWN..数字区方向键为VK_PK_...
Timer time=new Timer(delay,listenr)
time.start()
time.stop()
开启后listener持续监听相应事件,每隔delay段时间刷新
感觉像是写的面向方法的程序,只有一个类和内部类,其余全是方法^^        

Snake.java

import java.awt.Color.*;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.Timer.*;
import java.awt.event.*;
import javax.swing.JComponent.*;
public class Snake{
    JFrame frame;
    MyPanel panel;
    ArrayList snake;//蛇体
    Item food;//食物
    int dir;//行进方向
    static int UP=-1;
    static int DOWN=1;
    static int LEFT=-10;
    static int RIGHT=10;
    static int l=10;//长度
    boolean lose=false;//是否输了
    int width=300;//待定
    int height=300;
    int score=0;//分数
    int randX=0;//任意选中的x坐标
    int randY=0;//任意选中的y坐标
    boolean has;//是否被占用,true则为占用
    public static void main(String[] args){
        Snake test=new Snake();
        test.init();
}


//界面初始化
    public void init(){
        if(food!=null)
            food=null;
//protected     snake.removeRange(0,snake.size());
         snake=new ArrayList();
        if(!snake.isEmpty()){
            dir=0;
            snake.clear();}
        if(frame==null)
            frame=new JFrame();
        if(panel==null)
            panel=new MyPanel();
        if(time.isRunning())
            time.stop();
//      panel.repaint();
//      snake=new ArrayList();
//              addFood();
                food=new Item(13,5);
                addSnake();
        panel.addKeyListener(key);
        panel.setFocusable(true);
//              addFood();
//                panel.repaint();
        frame.getContentPane().add(panel);
//      frame.addActionListener(listen);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(width,height);
        frame.setVisible(true);
        panel.repaint();        
}
//获取随机位置
    public void random(){
    //  boolean canUse=false;
    //  int randX;
    //  int randY;
        while(true){
            randX=(int)(Math.random()*28);
            randY=(int)(Math.random()*29);
            if(!include(randX,randY)){
            //  canUse=true;
                break;

}

}
}
//位置是否已经被占用,true为被占用
    public boolean include(int loaX,int loaY){  
        boolean contain=false;
        for(Item it:snake){
            if(it.equals(loaX,loaY)){
                contain=true;
                break;

}
}
        if(food.equals(loaX,loaY))
            contain=true;
        return contain;

}
//吃food,如果has为true表示已经吃到了食物
    public void eat(Item pos){
        int x=pos.getX();
        int y=pos.getY();
        has=false;
        if(food.equals(x,y)){
            has=true;
    //      food=null;
            addFood();

}
}
//增加snake
    public void addSnake(){
        random();
        Item one=new Item(randX,randY); 
        snake.add(0,one);
}
//增加food
    public void addFood(){
        score++;
        random();
        food=new Item(randX,randY);

}
//前进
    public void forward(int d){
        Item head=snake.get(0);
        int x=head.getX()+dir/10;
        int y=head.getY()+dir%10;
        System.out.println("forward");
        head=new Item(x,y);
        snake.add(0,head);//添加头部
        eat(head);//判断是否吃到了食物
        if(!has){//如果没有吃到食物,去掉最后一个item
            snake.remove(snake.size()-1);
}       lose();
        if(lose==true){
            System.out.println("start()");
            lose=false;
            start();

}
}
//JFrame的ActionListener

     ActionListener listen=new ActionListener(){
        public void actionPerformed(ActionEvent e){
            System.out.println("调用ActionPerformed");
            forward(dir);
            panel.repaint();//重绘
}
};

//刷新频率

    Timer time=new Timer(230,listen);

//KeyListener
    KeyListener key=new KeyListener(){
        public void keyPressed(KeyEvent k){
        //  System.out.println("引用keyPress");
            if(k.getKeyCode()==KeyEvent.VK_UP){
                if(dir!=Snake.DOWN)
                    dir=Snake.UP;
}
            if(k.getKeyCode()==KeyEvent.VK_DOWN){
                if(dir!=Snake.UP)
                    dir=Snake.DOWN;
//  }       
            }
            if(k.getKeyCode()==KeyEvent.VK_LEFT){
                if(dir!=Snake.RIGHT)
                    dir=Snake.LEFT;}
            if(k.getKeyCode()==KeyEvent.VK_RIGHT){
                if(dir!=Snake.LEFT)
                    dir=Snake.RIGHT;}
        //  System.out.println("调用forward(dir)");
        //  System.out.println(dir);
        //  forward(dir);
            time.start();
        //  panel.repaint();
}
        public void keyReleased(KeyEvent k){}
        public void keyTyped(KeyEvent k){}

};
//重绘
    class MyPanel extends JPanel{
                public void paintComponent(Graphics g){

            //刷新背景 heise
            System.out.println("调用paintComponent");
            g.setColor(Color.white);
            g.fillRect(0,0,this.getWidth(),this.getHeight());       
            System.out.println(this.getWidth()+"    "+this.getHeight());    
            //蛇身红色
            g.setColor(Color.yellow);
            g.fillRect(290,0,l,this.getHeight());
            int red=(int)(Math.random()*255);
            int green=(int)(Math.random()*255);
            int blue=(int)(Math.random()*255);
            g.setColor(new Color(red,green,blue));  
            for(Item items:snake){
                int posX=items.getX();
                int posY=items.getY();
                if(posX>=29){
                    System.out.println("posX大于29,lose=true");
                    lose=true;}
                if(posX<=0)
                    items.setX(28);
                if(posY>=29)
                    items.setY(0);
                if(posY<=0)
                    items.setY(29);
        //      System.out.println(i+"    "+posY);
                //待会在设置位置,大小
                g.fillOval(items.getX()*l,items.getY()*l,l,l);
}
            //食物为绿色
            g.setColor(Color.green);
            int foodX=food.getX();
            int foodY=food.getY();
            //同上
            g.fillOval(foodX*l,foodY*l,l,l);

}
}
//判断是否输了  返回true则输了
    public void lose(){

          int oneX=snake.get(0).getX();
                  int oneY=snake.get(0).getY();
                        for(int i=1;iif(snake.get(i).equals(oneX,oneY)){
                                        System.out.println("你输了!");
                    lose=true;
                                        break;  
}

}
    System.out.println("lose()"+lose);
}
    public void start(){
         int isRestart = JOptionPane.showConfirmDialog(frame,"分数:"+score+" 是否重新开始?", "重新开始", JOptionPane.YES_NO_OPTION);               
        score=0;
        if (isRestart == JOptionPane.YES_OPTION) {
            init();

                        }else{
                            System.exit(0);
}


}
//Item类
    class Item{
        int xPos;//item的x坐标
        int yPos;//y坐标
        public Item(int x,int y){
            this.xPos=x;
            this.yPos=y;
}
        public int getX(){
            return xPos;
}
        public int getY(){
            return yPos;
}
        public void setX(int x){
            xPos=x;
}
        public void setY(int y){
            yPos=y;
}
//判断两个坐标是否相等,true为相等
        public boolean equals(int aX,int aY){
            if((aX==xPos)&&(aY==yPos)){
                return true;
}
            else{
                return false;
}

}
}
}

你可能感兴趣的:(java贪吃蛇(障碍物*咬尾巴))