做一个贪吃蛇游戏
1。作一个方块代表蛇,可以四个方向移动
2。随即出现某个圆代表食物,蛇碰到后消失
3。蛇长一节身体

解决方案 »

  1.   

    以前很迷恋这种靠1维数组来计算用Jlabel数组来表现的小游戏
      

  2.   

    fool_leave() ( ) 信誉:92    Blog 
    ----------------------------------
    估计差不多了 都6点了
      

  3.   

    这个实现起来其实还是有点难度的,主要要考虑人机交互和设计模式的合理性
    我写了一个,严格按照mvc模式设计,数据部分的snake用Linkedlist比较简单有效
    我觉得花时间写一个还是蛮有收获的,至少涉及到了一些线程,2d画图,键盘响应
    等内容。不过公司考这种考试,我觉得对java初学者还是太难了。
      

  4.   

    写了一个最简单的欢迎拍砖
    controlSnake.java
    package snake;import java.util.Timer;
    import java.util.TimerTask;
    public class controlSnake {
    Timer timer;
    public snakePanel spanel=null;
    public snakePath spath = new snakePath();

    public void startSnake()
    {
    timer = new Timer();
    timer.schedule(new runSnake(),0);
    }
    public void stopExtracting()
    {

    }
    public controlSnake(snakePanel spanel){
    this.spanel=spanel;
    }
        class runSnake extends TimerTask {
            public void run() {
             while(true){
             int dir = spanel.direction;
             System.out.println("dir:"+dir);
             if(!spath.forward(dir))
             {
             System.out.println("you lose!!");
             break;
             }
             System.out.println("here");
             try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
             //
             //spanel.panel.invalidate();
             spanel.panel.updateUI();
            
             }
             timer.cancel(); //Terminate the timer thread
            }
        }}
      

  5.   

    snakePanel.java
    package snake;import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.JButton;
    public class snakePanel extends JFrame {

    public controlSnake controlsnake =null;
    private static final long serialVersionUID = 1L;
        public int direction;
    //0:east
    //1:south
    //2:west
    //3:north
    private JPanel jContentPane = null; public snakeStage panel = null;
    private JButton start = null;
    private JButton go = null;

    /**
     * This method initializes start
     * 
     * @return javax.swing.JButton
     */
    private JButton getStart() {
    if (start == null) {
    start = new JButton();
    start.setBounds(new Rectangle(16, 9, 122, 38));
    start.setText("start");
    start.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent e) {
    //System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
    //start.lostFocus(, arg1)
    go.requestFocus(true);
    controlsnake.startSnake();
    }
    });

    }
    return start;
    } /**
     * This method initializes go
     * 
     * @return javax.swing.JButton
     */
    private JButton getGo() {
    if (go == null) {
    go = new JButton();
    go.setBounds(new Rectangle(155, 7, 117, 41));
    go.setText("go");
    go.addKeyListener(new java.awt.event.KeyListener() {
    public void keyTyped(java.awt.event.KeyEvent e) {
    System.out.println("keyTyped()"); // TODO Auto-generated Event stub keyTyped()
    }
    public void keyPressed(java.awt.event.KeyEvent e) {
    System.out.println("keyPressed()"); 
    if(e.getKeyChar()=='d')
    direction = 0;
    else if(e.getKeyChar()=='s')
    direction =1;
    else if(e.getKeyChar()=='a')
    direction =2;
    else if(e.getKeyChar()=='w')
    direction =3;
    }
    public void keyReleased(java.awt.event.KeyEvent e) {
    }
    });

    }
    return go;
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    snakePanel thisClass = new snakePanel();
    thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisClass.setControlSnake(new controlSnake(thisClass));
    thisClass.go.requestFocus();
    thisClass.setVisible(true);
    }
    });
    } /**
     * This is the default constructor
     */
    public snakePanel() {
    super();
    initialize();
    }
    public void setControlSnake(controlSnake con){
    controlsnake = con;
    panel.snakepath=controlsnake.spath;
    direction = 0;



    }
    /**
     * This method initializes this
     * 
     * @return void
     */ private void initialize() {
    this.setSize(978, 667);
    this.setContentPane(getJContentPane());
    this.setTitle("JFrame");
    } /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
    if (jContentPane == null) {

    panel = new snakeStage();

    panel.setBounds(new Rectangle(14, 64, 800, 400));
    panel.setText("");



    jContentPane = new JPanel();
    jContentPane.setLayout(null);
    jContentPane.add(panel, null);
    jContentPane.add(getStart(), null);
    jContentPane.add(getGo(), null);

    }
    return jContentPane;
    }}  //  @jve:decl-index=0:visual-constraint="10,10"
      

  6.   

    snakePath.java
    package snake;import java.awt.Point;
    import java.util.LinkedList;public class snakePath {
    LinkedList<Point> snake = null;
    static int snakeSwimmed = 1;
    static int untouched = 2;
    static int fruit = 3;
    boolean hasfruit;
    //地图是800*400,每一个10*10,这些参数都写死在程序中了
    int[][] data=new int[40][80];
    public snakePath(){
    for(int i=0;i<data.length;i++){
    for(int j=0;j<data[i].length;j++){
    data[i][j]=untouched;
    }
    }
    data[0][0]=snakeSwimmed;
    snake = new LinkedList<Point>();
    snake.add(new Point(0,0));

    generateFruit();
    hasfruit = true;
    }

    public void generateFruit(){
    int xx,yy;
    while(true){
     xx = (int)(Math.random()*80);
     yy = (int)(Math.random()*40);
     System.out.println(xx+" "+yy+" "+data[yy][xx]);
    if(data[yy][xx]==untouched)
    break;
    }
    data[yy][xx]=fruit;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    /* snakePath sna =new snakePath();
    for(int i=0;i<10;i++)
    {
    sna.forward();
    }
    */
    }
    public boolean forward(int dir) {
    // TODO Auto-generated method stub
    Point tail = snake.getLast();
    Point head = snake.getFirst();
    Point newHead = newhead(head,dir);
    if(newHead.x<0||newHead.x>=80||newHead.y<0||newHead.y>=40)
    return false;//finish
    if(data[newHead.y][newHead.x]==fruit)
    {
    data[newHead.y][newHead.x]=snakeSwimmed;
    snake.addFirst(newHead);
    generateFruit();
    hasfruit = true;
    }
    else{
    System.out.println("no fruit");
    data[tail.y][tail.x]=untouched;
    data[newHead.y][newHead.x]=snakeSwimmed;
    snake.removeLast();
    snake.addFirst(newHead);
    }

    return true;
    }
    private Point newhead(Point head, int dir) {
    // TODO Auto-generated method stub
    // 0:east
    // 1:south
    // 2:west
    // 3:north
    Point newPoint = null;
    switch(dir){
    case 0:
    newPoint = new Point(head.x+1,head.y);
    break;
    case 1:
    newPoint = new Point(head.x,head.y+1);
    break;
    case 2:
    newPoint = new Point(head.x-1,head.y);
    break;
    case 3:
    newPoint = new Point(head.x,head.y-1);
    break;
    }
    return newPoint;
    }}