import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {
int snakelong=2;//蛇当前长度
int[] Snakex=new int[100];
int[] Snakey=new int[100];
Random random=new Random();
int foodx;
int foody;
Timer timer=new Timer(100, this);//定时器
int started=0;//游戏信息 0-未开始 1-开始 2-结束
int fangxiang=1;//蛇的方向 0-左 1-右 2-上 3-下
public void myJFrame() {
this.setTitle("贪吃蛇大作战");
this.setSize(800, 600);
this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE);
this.setResizable(false);
this.addKeyListener(this);
this.setVisible(true);
// 蛇的初识位置
Snakex[0]=60;
Snakey[0]=100;
Snakex[1]=40;
Snakey[1]=100;
// 随机食物的初识位置
foodx=random.nextInt(40);
foody=random.nextInt(20);
foodx=foodx*20;
foody=foody*20+80;
}
//覆写paint方法,绘制界面
public void paint(Graphics g) {
// 绘制背景
g.setColor(Color.BLUE);
g.fillRect(0, 0, 800, 600);
//绘制游戏区域
g.setColor(Color.black);
g.fillRect(0, 80, 800, 520);
//绘制蛇
for (int i=0;i<snakelong;i++) {
g.setColor(Color.yellow);
g.fillRect(Snakex[i],Snakey[i],25,25);
}
// 绘制食物
g.setColor(Color.red);
g.fillOval(foodx,foody,25,25);
if (started==0) {
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("微软雅黑",10,20)); //设置字体
g.drawString("按下“空格键”开始游戏",300,65); //绘制字符
} else if (started==1 ) {
g.setColor(Color.BLACK);
g.setFont(new Font("微软雅黑",10,20));
g.drawString("当前分数为:",300,65);
g.drawString(String.valueOf(snakelong - 2),420,65);
} else if (started == 2) {
g.setColor(Color.BLACK);
g.setFont(new Font("微软雅黑",10,20));
g.drawString("游戏结束-",250,65);
g.drawString("游戏得分为:",350,65);
g.drawString(String.valueOf(snakelong - 2),470,65);
}
}
// 事件监听
@Override
public void actionPerformed(ActionEvent e) {
// 判断游戏是否开始
if (started==1) {
// 通过循环控制蛇移动
for (int i=snakelong-1;i>0;i--) {
Snakex[i]=Snakex[i-1];
Snakey[i]=Snakey[i-1];
}
// 判断蛇移动的方向
if (fangxiang==0) {//蛇的方向 0-左 1-右 2-上 3-下
Snakex[0]=Snakex[0]-20;
} else if (fangxiang==1) {
Snakex[0]=Snakex[0] + 20;
} else if (fangxiang==2) {
Snakey[0]=Snakey[0] - 20;
} else if (fangxiang==3) {
Snakey[0]=Snakey[0] + 20;
}
// 判断是否撞墙
if (Snakex[0]<0||Snakex[0]>780||Snakey[0]<80||Snakey[0]>580) {
started=2;
}
// 判断蛇是否吃到了食物
if (Snakex[0]==foodx&&Snakey[0]==foody) {
snakelong++;
foodx=random.nextInt(39);
foody=random.nextInt(22);
foodx=foodx*20;
foody=foody*20+80;
System.out.println(foodx +","+foody);
}
// 判断是否吃到了自己
for (int i=1;i<snakelong; i++) {
if (Snakex[0]==Snakex[i]&&Snakey[0]==Snakey[i]) {
started=2;
}
}
// 判断食物是否随机在了蛇身上
for (int i=0;i<snakelong;i++) {
if (foodx==Snakex[i]&&foody==Snakey[i]) {
// 随机食物的初识位置
foodx=random.nextInt(39);
foody=random.nextInt(22);
foodx=foodx*20;
foody=foody*20 +80;
System.out.println(foodx +","+foody);
}
}
repaint();
}
timer.start();
}
// 输入
@Override
public void keyTyped(KeyEvent e) {
}
// 键盘按下——控制游戏的开始以及蛇的移动方向
@Override
public void keyPressed(KeyEvent e) {
int key=e.getKeyCode();
// 判断是否为空格
if (key==KeyEvent.VK_SPACE) {
if (started==0) {
started=1;
} else if(started==1) {
started=0;
} else if (started==2) {
started=0;
snakelong=2;//蛇当前长度
//蛇的初识位置
Snakex[0]=60;
Snakey[0]=100;
Snakex[1]=40;
Snakey[1]= 100;
// 随机食物的初识位置
foodx=random.nextInt(40);
foody=random.nextInt(20);
foodx=foodx*20;
foody=foody*20+80;
// 初始化方向
fangxiang=1;
}
repaint();
timer.start();
// 左
} else if(key==KeyEvent.VK_LEFT) {
if (fangxiang!= 1) {
fangxiang=0;
}
// 右
} else if(key==KeyEvent.VK_RIGHT) {
if (fangxiang!=0) {
fangxiang=1;
}
// 上
} else if(key==KeyEvent.VK_UP) {
if (fangxiang!=3) {
fangxiang=2;
}
//下
} else if (key == KeyEvent.VK_DOWN) {
if (fangxiang!=2) {
fangxiang=3;
}
}
}
// 弹起
@Override
public void keyReleased(KeyEvent e) {
}
// 点击
@Override
public void mouseClicked(MouseEvent e) {
}
// 按下
@Override
public void mousePressed(MouseEvent e) {
}
// 抬起
@Override
public void mouseReleased(MouseEvent e) {
}
// 进入
@Override
public void mouseEntered(MouseEvent e) {
}
// 离开
@Override
public void mouseExited(MouseEvent e) {
}
public static void main(String[] args) {
Snake snake=new Snake();
snake.myJFrame();
}
}