package com.wxh.snake;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Snake {
public static void main(String[] args) {

JFrame jf=new JFrame();
jf.setBounds(400, 200, 432, 454);
jf.setLayout(null);
jf.setTitle("贪吃蛇");
jf.setDefaultCloseOperation(3);

SnakePanel sp=new SnakePanel();

jf.add(sp);

jf.setVisible(true);

sp.requestFocus(true);

sp.headGo();

}
}

class SnakePanel extends JPanel implements KeyListener{
private int speed=400;//蛇移动的速度
private int fangxiang=4;//运动方向
private JPanel[] jps=new JPanel[400];
//定义一个蛇头
private Rect headRect;
//定义整个身体
private ArrayList<Rect> list;


//定义食物小方块
private Rect foodRect;

public SnakePanel(){
//初始化舌头的坐标
headRect=new Rect(0,0);
list=new ArrayList<Rect>();
//把舌头添加进去
list.add(headRect);

//产生一个食物
foodRect=randomFood();

this.setSize(419,419);
this.setBackground(Color.black);
this.setLayout(new GridLayout(20, 20, 1, 1));
for(int i=0;i<jps.length;i++){
jps[i]=new JPanel();
jps[i].setBackground(Color.green);
this.add(jps[i]);
}
this.addKeyListener(this);
}


//随机食物的方法
public Rect randomFood(){
return new Rect((int)(Math.random()*20)*21,(int)(Math.random()*20)*21);
}

//判断食物是否被吃到
public boolean eat(){
boolean flag=false;
if(headRect.getX()==foodRect.getX() && headRect.getY()==foodRect.getY()){
flag=true;
if(speed>=200){
speed-=50;
}else if(speed>=100){
speed-=20;
}else if(speed>=40){
speed-=4;
}else if(speed == 10){

}

}
return flag;
}


@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
//g.fillRect(headRect.getX(), headRect.getY(), 20, 20); //画舌头


//画整个蛇
for(int i=0;i<list.size();i++){
g.fillRect(list.get(i).getX(), list.get(i).getY(), 20, 20);
}


g.fillRect(foodRect.getX(), foodRect.getY(), 20, 20);//画食物
}


//身体移动
public void bodyGo(){
for(int i=list.size()-1;i>0;i--){
list.get(i).setX(list.get(i-1).getX());
list.get(i).setY(list.get(i-1).getY());
}
}

//判断游戏结束


//蛇头运动
public void headGo(){
while(true){
bodyGo();
if(fangxiang==1){
headRect.setY(headRect.getY()-21);
}else if(fangxiang==2){
headRect.setY(headRect.getY()+21);
}else if(fangxiang==3){
headRect.setX(headRect.getX()-21);
}else if(fangxiang==4){
headRect.setX(headRect.getX()+21);
}
repaint();
if(eat()){
list.add(foodRect);
foodRect=randomFood();//如果食物被吃到,则将食物的坐标改动
}
try {
Thread.sleep(speed);//睡眠控制速度
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


@Override
public void keyPressed(KeyEvent e) {
int i=e.getKeyCode();
if(i==KeyEvent.VK_UP){
fangxiang=1;
}else if(i==KeyEvent.VK_DOWN){
fangxiang=2;
}else if(i==KeyEvent.VK_LEFT){
fangxiang=3;
}else if(i==KeyEvent.VK_RIGHT){
fangxiang=4;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}
}


class Rect{
private int x;
private int y;

public Rect() {
}
public Rect(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}

}