黑马程序员技术交流社区

标题: 贪吃蛇代码 [打印本页]

作者: lxdamya    时间: 2015-5-14 12:32
标题: 贪吃蛇代码
import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class MainClass extends JFrame {
ControlSnake control;

Toolkit kit;

Dimension dimen;

public static void main(String[] args) {
  new MainClass("my snake");
}

public MainClass(String s) {
  super(s);
  control = new ControlSnake();
  control.setFocusable(true);
  kit = Toolkit.getDefaultToolkit();
  dimen = kit.getScreenSize();

  add(control);
  setLayout(new BorderLayout());
  setLocation(dimen.width / 3, dimen.height / 3);// dimen.width/3,dimen.height/3
  setSize(FWIDTH, FHEIGHT);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setResizable(false);
  setVisible(true);
}

public static final int FWIDTH = 315;

public static final int FHEIGHT = 380;
}

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
import java.util.Random;

@SuppressWarnings("serial")
public class ControlSnake extends JPanel implements ActionListener {
Random rand;

ArrayList<Point> list, listBody;

String str, str1;

static boolean key;

int x, y, dx, dy, fx, fy, flag;

int snakeBody;

int speed;

public ControlSnake() {
  snakeBody = 1;

  str = "上下左右方向键控制 P键暂停...";
  str1 = "现在的长度为:" + snakeBody;
  key = true;
  flag = 1;

  speed = 700;
  rand = new Random();
  list = new ArrayList<Point>();
  listBody = new ArrayList<Point>();

  x = 5;
  y = 5;
  list.add(new Point(x, y));
  listBody.add(list.get(0));

  dx = 10;
  dy = 0;

  fx = rand.nextInt(30) * 10 + 5;// 2
  fy = rand.nextInt(30) * 10 + 5;// 2

  setBackground(Color.WHITE);
  setSize(new Dimension(318, 380));

  final Timer time = new Timer(speed, this);
  time.start();

  addKeyListener(new KeyAdapter() {
   public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == 37) {
     dx = -10;
     dy = 0;
    } else if (e.getKeyCode() == 38) {
     dx = 0;
     dy = -10;
    } else if (e.getKeyCode() == 39) {
     dx = 10;
     dy = 0;
    } else if (e.getKeyCode() == 40) {
     dx = 0;
     dy = 10;
    } else if (e.getKeyCode() == 80) {
     if (flag % 2 == 1) {
      time.stop();
     }
     if (flag % 2 == 0) {
      time.start();
     }
     flag++;
    }
   }
  });

}

public void paint(Graphics g) {
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, 400, 400);
  g.setColor(Color.DARK_GRAY);
  g.drawLine(3, 3, 305, 3);
  g.drawLine(3, 3, 3, 305);
  g.drawLine(305, 3, 305, 305);
  g.drawLine(3, 305, 305, 305);
  g.setColor(Color.PINK);

  for (int i = 0; i < listBody.size(); i++) {
   g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9);
  }
  g.fillRect(x, y, 9, 9);
  g.setColor(Color.ORANGE);
  g.fillRect(fx, fy, 9, 9);

  g.setColor(Color.DARK_GRAY);
  str1 = "现在的长度为:" + snakeBody;
  g.drawString(str, 10, 320);
  g.drawString(str1, 10, 335);
}

public void actionPerformed(ActionEvent e) {
  x += dx;
  y += dy;
  if (makeOut() == false) {
   JOptionPane.showMessageDialog(null, "重新开始......");

   speed = 700;

   snakeBody = 1;

   x = 5;
   y = 5;

   list.clear();
   list.add(new Point(x, y));
   listBody.clear();
   listBody.add(list.get(0));

   dx = 10;
   dy = 0;

  }
  addPoint(x, y);
  if (x == fx && y == fy) {
   speed = (int) (speed * 0.8);//速度增加参数
   if (speed < 200) {
    speed = 100;
   }
   fx = rand.nextInt(30) * 10 + 5;// 2
   fy = rand.nextInt(30) * 10 + 5;// 2
   snakeBody++;// 2
  } // 2
  repaint();
}

public void addPoint(int xx, int yy) {
  // 动态的记录最新发生的50步以内的移动过的坐标
  // 并画出最新的snakeBody
  if (list.size() < 100) {//蛇身长度最长为100
   list.add(new Point(xx, yy));
  } else {
   list.remove(0);
   list.add(new Point(xx, yy));
  }
  if (snakeBody == 1) {
   listBody.remove(0);
   listBody.add(0, list.get(list.size() - 1));
  } else {
   listBody.clear();
   if (list.size() < snakeBody) {
    for (int i = list.size() - 1; i > 0; i--) {
     listBody.add(list.get(i));
    }
   } else {
    for (int i = list.size() - 1; listBody.size() < snakeBody; i--) {
     listBody.add(list.get(i));
    }
   }
  }
}

public boolean makeOut() {
  if ((x < 3 || y < 3) || (x > 305 || y > 305)) {
   return false;
  }
  for (int i = 0; i < listBody.size() - 1; i++) {
   for (int j = i + 1; j < listBody.size(); j++) {
    if (listBody.get(i).equals(listBody.get(j))) {
     return false;
    }
   }
  }
  return true;
}
}
作者: hellotaomi    时间: 2015-5-14 15:47
编译没通过啊 楼主 什么情况
作者: 980595778    时间: 2015-5-14 15:52
好长,学习了。留下以后慢慢看,谢谢了
作者: 开到荼靡    时间: 2015-5-14 20:01
,。,。,。
作者: shuadianqian8    时间: 2015-5-14 22:25
顶                                                                       
作者: xuelanghu120    时间: 2015-5-15 00:04
说实话没看懂




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2