import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Snakemain extends JFrame {
private JPanel contentPane;
private JButton button;
private Point pressedPoint;
public static int length;
private int direction = 0;
private move m = new move();
private body b[] = new body[60];
private body food1;
private body food2;
private body food3;
public static void main(String[] args) {
Snakemain s = new Snakemain();
s.setVisible(true);
}
/* 构造函数 */
public Snakemain() {
setTitle("贪吃蛇");
setBounds(300, 150, 1360, 760);
setUndecorated(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/* 背景 */
contentPane = new JPanel();
setContentPane(contentPane);
contentPane.setLayout(new BorderLayout(0, 0));
BackgroundPanel backgroundPanel = new BackgroundPanel();
backgroundPanel.setImage(getToolkit().getImage(getClass().getResource("14.jpg")));
contentPane.add(backgroundPanel);
contentPane.setBackground(Color.GRAY);
contentPane.setBorder(new EmptyBorder(3, 3, 3, 3));
/* 拖动 */
backgroundPanel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
do_mouseDragged(e);
}
private void do_mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
Point point = e.getPoint();// 获取当前坐标
Point locationPoint = getLocation();// 获取窗体坐标
int x = locationPoint.x + point.x - pressedPoint.x;// 计算移动后的新坐标
int y = locationPoint.y + point.y - pressedPoint.y;
setLocation(x, y);// 改变窗体位置
}
});
backgroundPanel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
do_mousePressed(e);
}
private void do_mousePressed(MouseEvent e) {
pressedPoint = e.getPoint();
}
});
//初始化蛇
SetLength(20);
InitSnake();
InitFood(b);
Thread m = new Thread(new moving());
//键盘监听器
addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent arg0) {
}
public void keyReleased(KeyEvent arg0) {
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_RIGHT:
direction = 0;
break;
case KeyEvent.VK_DOWN:
direction = 1;
break;
case KeyEvent.VK_LEFT:
direction = 2;
break;
case KeyEvent.VK_UP:
direction = 3;
break;
}
}
});
m.start();
}
/* 移动刷新 */
public class moving implements Runnable {
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//传参到移动功能函数中
m.setLength(length);
m.Direction(b, direction);
//更新蛇的长度
SetLength(Snakemain.this.length);
//吃到食物后的处理
if(iseat(Snakemain.this.b)) {
addlength(b, direction);
InitFood(Snakemain.this.b);
}
//判断是否自己撞死
if(new judge().die(b) ) {
JOptionPane.showMessageDialog(null, "you die");
}
//更新图形
repaint();
}
}
}
/* 初始化蛇 */
public void InitSnake() {
for (int i = 0; i < length; i++) {
b[i] = new body(400 - i*10 , 400);
}
for(int i=length; i<=59; i++) {
b[i] = new body();
}
}
/* 初始化食物 */
public void InitFood(body[] d) {
food1 = new food().check(d);
food2 = new food().check(d);
food3 = new food().check(d);
System.out.println("食物1坐标: " + food1.getX() + " " + food1.getY());
System.out.println("食物2坐标: " + food2.getX() + " " + food2.getY());
System.out.println("食物3坐标: " + food3.getX() + " " + food3.getY());
System.out.println("蛇的长度: " + length);
}
/* 设置长度 */
public void SetLength(int l) {
this.length = l;
}
/* 绘制蛇 */
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.LIGHT_GRAY);
for (int i = 0; i < length; i++) { // 画蛇
g.fillRect(b[i].getX(), b[i].getY(), 10, 10);
}
g.setColor(Color.red);
g.fillRect(food1.getX(), food1.getY(), 10, 10);
g.fillRect(food2.getX(), food2.getY(), 10, 10);
g.fillRect(food3.getX(), food3.getY(), 10, 10);
}
/* 判断是否吃到了食物 */
public Boolean iseat(body[] b) {
if ((b[0].getX()== food1.getX() && b[0].getY()== food1.getY()) || (b[0].getX()== food2.getX() && b[0].getY()== food2.getY()) || (b[0].getX()== food3.getX() && b[0].getY()== food3.getY())) {
return true;
} else {
return false;
}
}
/* 增加长度 */
public void addlength(body[] b, int direction) {
int x = b[length-1].getX();
int y = b[length-1].getY();
if (direction == 0) {
length = length+1;
b[length].setX(x - 10);
b[length].setY(y);
} else if (direction == 1) {
length = length+1;
b[length].setX(x);
b[length].setY(y - 10);
} else if (direction == 2) {
length = length+1;
b[length].setX(x + 10);
b[length].setY(y);
} else if (direction == 3) {
length = length+1;
b[length].setX(x + 10);
b[length].setY(y);
}
//刷新食物
InitFood(b);
}
}