java新手求贪食蛇源码

 我来答
杨欣
2014-04-30 · 知道合伙人互联网行家
杨欣
知道合伙人互联网行家
采纳数:4625 获赞数:11877
阅读过JAVA\PHP\ASP等多种网络语言的知识。现任石家庄雅致化工有限公司网站技术。

向TA提问 私信TA
展开全部
自己写着玩的,很简单,你试一试哦...
主要用了javax.swing.Timer这个类:

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;
 }
}
追问
我刚学完se   这个对我来说是不是有点难
追答
那我就不知道了。。
匿名用户
2014-04-30
展开全部
百度一下好像有很多哎
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式