java写出蛇吃蛋小游戏

来源:互联网 发布:python 输入ctrl c 编辑:程序博客网 时间:2024/05/01 08:56
package snakeategg;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Map;/** * Created by Administrator on 2016/11/9. */public class SnakeControl implements KeyListener {    private SnakeModel model;    private SnakeView view;    private int district_maxX;    private int district_maxY;    public SnakeControl(){        this.district_maxX=30;        this.district_maxY=40;        inits();    }   public SnakeControl(int maxX,int maxY){       if((10<maxX)&&(maxX<100)&&((10<maxY)&&(maxY<100))){           this.district_maxY=maxY;           this.district_maxX=maxX;       }else {           this.district_maxX=30;           this.district_maxY=40;       }       inits();   }    private void inits() {        this.model=new SnakeModel(district_maxX,district_maxY);        this.view=new SnakeView(district_maxX,district_maxY,500,200);        this.model.addObserver(this.view);        this.view.addKeyListener(this);        (new Thread(this.model)).start();    }    @Override    public void keyTyped(KeyEvent e) {    }    @Override    public void keyPressed(KeyEvent e) {       int keyCode=e.getKeyCode();        if(model.isRunning()){            switch (keyCode){                case KeyEvent.VK_UP:                    model.changeDirection(SnakeModel.UP);                    break;                case KeyEvent.VK_DOWN:                    model.changeDirection(SnakeModel.DOWN);                    break;                case KeyEvent.VK_LEFT:                    model.changeDirection(SnakeModel.LEFT);                    break;                case KeyEvent.VK_RIGHT:                    model.changeDirection(SnakeModel.RIGHT);                    break;                case KeyEvent.VK_ADD:                case KeyEvent.VK_PAGE_UP:                    model.speedUp();                    break;                case KeyEvent.VK_P:                case KeyEvent.VK_SUBTRACT:                    model.changePauserState();                    break;                default:            }            if(keyCode==KeyEvent.VK_R||keyCode==KeyEvent.VK_ENTER||keyCode==KeyEvent.VK_S){                model.reset();            }            if(keyCode==KeyEvent.VK_Q){                model.SetRunning(false);            }        }    }    @Override    public void keyReleased(KeyEvent e) {    }}

package snakeategg;import javax.swing.*;import java.util.Arrays;import java.util.LinkedList;import java.util.Observable;import java.util.Random;/** * Created by Administrator on 2016/11/9. */public class SnakeModel extends Observable implements Runnable{    public static final int UP=2;    public static final int DOWN=4;    public static final int LEFT=1;    public static final int RIGHT=3;    private boolean [][]matrix;    private LinkedList nodeArray=new LinkedList();    private Node food;    private int maxX;    private int maxY;    private int timeInterval=200;    private int direction=UP;    private boolean running=false;    private double speedChangeRate=0.75;    private boolean paused=false;    private int score=0;    private int countMove=0;    public SnakeModel(int maxX,int maxY){        this.maxX=maxX;        this.maxY=maxY;        reset();    }    public void reset(){        direction=SnakeModel.UP;        timeInterval=200;        paused=false;        score=0;        countMove=0;        matrix=new boolean[maxX][maxY];        for(int i=0;i<maxX;i++){            matrix[i]=new boolean[maxY];            Arrays.fill(matrix[i],false);        }        int initArrayLength=maxX>20?10:maxX/2;        int x=maxX/2;        int y=maxY/2;        for(int i=0;i<initArrayLength;i++){            nodeArray.addLast(new Node(x,y));            matrix[x][y]=true;            x++;        }        food=creatFood();        matrix[food.x][food.y]=true;    }    public void changeDirection(int newDirection){        if(direction%2!=newDirection){            direction=newDirection;        }    }    public boolean moveOn(){        Node head = (Node)nodeArray.getFirst();        int headX=head.x;        int headY=head.y;        switch (direction){            case UP:                headY--;                break;            case DOWN:                headY++;                break;            case LEFT:                headX--;                break;            case RIGHT:                headX++;                break;        }        if((0<=headX&&headX<maxX)&&(0<=headY&&headY<maxY)){            if(matrix[headX][headY]){                if(headX==food.x&&headY==food.y){                    nodeArray.addFirst(food);                    int ScoreGet=(10000-200*countMove)/timeInterval;                    score+=ScoreGet>0?ScoreGet:10;                    countMove=0;                    food=creatFood();                    matrix[food.x][food.y]=true;                    return true;                }else {                    return false;                }            }else {                nodeArray.addFirst(new Node(headX,headY));                matrix[headX][headY]=true;                head=(Node)nodeArray.removeLast();                matrix[head.x][head.y]=false;                countMove++;                return true;            }        }        return false;    }    private Node creatFood() {        int x=0;        int y=0;        do{            Random r=new Random();            x=r.nextInt(maxX);            y=r.nextInt(maxY);        }while (matrix[x][y]);            return new Node(x,y);    }    @Override    public void run() {        running=true;        while (running){            try {                Thread.sleep(timeInterval);            } catch (InterruptedException e) {                e.printStackTrace();            }            if(!paused){                if(moveOn()){                    setChanged();                    notifyObservers();                }else {                    JOptionPane.showMessageDialog(null,"你失败了","GAME OVER",JOptionPane.INFORMATION_MESSAGE);                    break;                }            }        }if(!running){            JOptionPane.showMessageDialog(null,"你停止了游戏","game over",JOptionPane.INFORMATION_MESSAGE);        }    }    public void speedUp(){        timeInterval*=speedChangeRate;    }    public void speedDown(){        timeInterval/=speedChangeRate;    }    public void changePauserState(){        paused=!paused;    }    public boolean isRunning(){        return running;    }    public void SetRunning(boolean running){        this.running=running;    }    public LinkedList getNodeArray(){        return nodeArray;    }    public Node getFood(){        return food;    }    public int getSore(){        return score;    }    public String toString(){         String result="";        for(int i=0;i<nodeArray.size();++i){            Node n=(Node)nodeArray.get(i);            result+="["+n.x+""+n.y+"]";        }        return result;    }     public   class Node{        int x;        int y;        Node(int x,int y){            this.x=x;            this.y=y;        }    }}

package snakeategg;import javafx.beans.Observable;import javax.swing.*;import java.awt.*;import java.util.Iterator;import java.util.LinkedList;import java.util.Observer;/** * Created by Administrator on 2016/11/9. */public class SnakeView extends JFrame implements Observer{    public static final int nodeWidth=10;    public static final int nodeHeight=10;    private int canvasWidth;    private int cancasHeight;    private int startX=0;    private int startY=0;    JLabel labelScore;    Canvas paitCanvas;    public SnakeView(){        this(30,40,0,0);    }    public SnakeView(int maxX,int maxY){        this(maxX,maxY,0,0);    }    public SnakeView(int maxX,int maxY,int startX,int startY){        this.canvasWidth=maxX*nodeWidth;        this.cancasHeight=maxY*nodeHeight;        this.startX=startX;        this.startY=startY;        init();    }    private void init() {        this.setName("蛇吃蛋");        this.setLocation(startX,startY);        Container cp = this.getContentPane();        labelScore=new JLabel("Score");        cp.add(labelScore,BorderLayout.NORTH);        paitCanvas=new Canvas();        paitCanvas.setSize(canvasWidth+1,cancasHeight+1);        cp.add(paitCanvas,BorderLayout.CENTER);        JPanel panelBottom=new JPanel();        panelBottom.setLayout(new BorderLayout());        JPanel panel1=new JPanel();        panel1.setLayout(new BorderLayout());        JLabel lablehelp;        lablehelp=new JLabel("pageup,pagedown for speed",JLabel.CENTER);        panel1.add(lablehelp,BorderLayout.NORTH);        lablehelp=new JLabel("enter ot r or s for start",JLabel.CENTER);        panel1.add(lablehelp,BorderLayout.CENTER);        panelBottom.add(panel1,BorderLayout.NORTH);        lablehelp=new JLabel("q for stop",JLabel.CENTER);        panelBottom.add(lablehelp);        cp.add(panelBottom,BorderLayout.SOUTH);        this.pack();        this.setResizable(false);        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        this.setVisible(true);    }    @Override    public void update(java.util.Observable o, Object arg) {        SnakeModel model=(SnakeModel) o;        Graphics g = paitCanvas.getGraphics();        g.setColor(Color.white);        g.fillRect(0,0,canvasWidth,cancasHeight);        g.setColor(Color.black);        LinkedList na=model.getNodeArray();        Iterator it = na.iterator();        while (it.hasNext()){            SnakeModel.Node n=(SnakeModel.Node) it.next();            drawNode(g,n);        }        g.setColor(Color.RED);        SnakeModel.Node n = model.getFood();        drawNode(g,n);        this.updateScore(model.getSore());    }    private void updateScore(int sore) {        String s="Score:"+sore;        labelScore.setText(s);    }    private void drawNode(Graphics g, SnakeModel.Node n) {        g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1);    }}

package snakeategg;/** * Created by Administrator on 2016/11/9. */public class Test {    public  static void main(String []args){        SnakeControl control=new SnakeControl(30,30);    }}

0 0