//游戏主体
package com.anlong.贪吃蛇;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
* @author bujiasisuo
* @create 2020-05-09-10:18
* @Version 1.0
* 功能:贪吃蛇小游戏
* 蛇的身体位置存放在数组中,移动即只改变第一个,数组元素以此后移。
* 通过实现ActionListener接口使用时钟事件
* new Timer(时间(毫秒),this(用于那个窗口));
*
*/
//主界面
public class GreedySnake extends JFrame implements ActionListener {
public MyPanel panel = new MyPanel();
public Timer timer = new Timer(200,this);
public Snake snake = new Snake();
public Ball ball = new Ball();
public void init(){
this.setLocation(300,300);
this.setSize(816,639);
this.setResizable(false);
this.add(panel);
this.setVisible(true);
this.setDefaultCloseOperation(3);
KayListener(panel);
// Insets insets = getInsets();// 得到窗口的边界区域。
// System.out.println("窗口边框上"+insets.top);//上
// System.out.println("窗口边框下"+insets.bottom);//下
// System.out.println("窗口边框左"+insets.left);//左
// System.out.println("窗口边框右"+insets.right);//右
//
// Dimension di = getContentPane().getSize();//内容面板的大小
// System.out.println("内容面板宽度"+di.width);//宽
// System.out.println("内容面板的高度"+di.height);//高
}
public static void main(String[] args) {
new GreedySnake().init();
}
//时钟事件
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("X:"+snake.getX()[0]+",Y"+snake.getY()[0]);
if(!ball.isStatus())
{
ball.init();
// System.out.println("1111111111111111111111");
}
if(ball.getX()==snake.getX()[0] && ball.getY()==snake.getY()[0])
{
panel.setScore(1);
snake.setLength();
ball.setStatus();
}
for (int i = snake.getLength(); i > 0 ; i--) {
snake.getX()[i] = snake.getX()[i-1];
snake.getY()[i] = snake.getY()[i-1];
}
snake.getX()[0] = snake.getX()[0] + panel.getXvalue();
snake.getY()[0] = snake.getY()[0] + panel.getYvalue();
// System.out.println("X:"+snake.getX()[0]+",Y"+snake.getY()[0]);
// System.out.println("-X:"+snake.getX()[2]+",Y"+snake.getY()[2]);
if(snake.getX()[0] < 35 || snake.getX()[0] > 755 || snake.getY()[0] < 85 || snake.getY()[0] > 565)
{
new MyJDialog();
timer.stop();
}
for (int i = 2; i < snake.getLength(); i++) {
if(snake.getX()[0]==snake.getX()[i] && snake.getY()[0]==snake.getY()[i])
{
new MyJDialog();
timer.stop();
}
}
panel.repaint();
}
//键盘事件
public void KayListener(MyPanel panel){
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==32)
{
panel.setStatus();
if(panel.getStatus())
{
timer.start();
}
else
{
timer.stop();
}
}else if(e.getKeyCode()==37)
{
//左
panel.setYValue(0);
panel.setXValue(-10);
}else if(e.getKeyCode()==38){
//上
panel.setXValue(0);
panel.setYValue(-10);
}else if(e.getKeyCode()==39){
//右
panel.setYValue(0);
panel.setXValue(10);
}else if(e.getKeyCode()==40){
//下
panel.setXValue(0);
panel.setYValue(10);
}
panel.repaint();
}
});
}
//游戏面板
class MyPanel extends JPanel{
private boolean status = false;
private int score = 0;
private int Xvalue = 10;
private int Yvalue = 0;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.blue);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("贪吃蛇小游戏",25,40);
g.setFont(new Font("微软雅黑",Font.BOLD,20));
g.drawString("长度:" + snake.getLength(),280,23);
g.drawString("得分:" + score,280,43);
g.setColor(Color.RED);
g.fillRect(25,75,750,510);
g.setColor(Color.black);
g.fillRect(35,85,730,490);
if(!status)
{
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40));
g.drawString("点击空格开始游戏。",200,300);
}
g.setColor(Color.pink);
g.fillOval(ball.getX(),ball.getY(),10,10);
// System.out.println(ball.getX()+","+ball.getY());
for(int i=snake.getLength()-1;i>=0;i--)
{
if(i==0)
{
g.setColor(Color.orange);
g.fillOval(snake.getX()[i],snake.getY()[i],10,10);
}
else
{
g.setColor(Color.yellow);
g.fillRect(snake.getX()[i],snake.getY()[i],10,10);
}
}
}
public void setStatus(){
this.status = !this.status;
}
public boolean getStatus(){
return this.status;
}
public void setXValue(int v){
this.Xvalue = v;
}
public void setYValue(int v){
this.Yvalue = v;
}
public int getXvalue() {
return Xvalue;
}
public int getYvalue() {
return Yvalue;
}
public void setScore(int n) {
this.score += n;
}
public int getScore(){
return this.score;
}
}
//弹窗
class MyJDialog extends JDialog{
public MyJDialog(){
this.setTitle("温馨提示");
this.setBounds(400,400,200,150);
JLabel label = new JLabel("游戏结束。");
label.setHorizontalAlignment(0);
this.add(label);
this.setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
snake = new Snake();
panel.repaint();
panel.setStatus();
panel.setYValue(0);
panel.setXValue(10);
panel.setScore(-panel.score);
}
});
}
}
}
小球
package com.anlong.贪吃蛇;
/**
* @author bujiasisuo
* @create 2020-05-09-17:00
* @Version 1.0
* 功能:小球
*/
public class Ball {
private boolean status = false;
private int x=0;
private int y=0;
public void init(){
this.status = true;
this.x = (int)((Math.random()*730)/10)*10+35;
this.y = (int)((Math.random()*480)/10)*10+85;
System.out.println(x+","+y);
}
public boolean isStatus() {
return status;
}
public void setStatus() {
this.status = !status;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
蛇的身体
package com.anlong.贪吃蛇;
/**
* @author bujiasisuo
* @create 2020-05-09-15:16
* @Version 1.0
* 功能:贪吃蛇身体
*/
public class Snake {
private int length = 0;
private int[] x;
private int[] y;
public Snake(){
this.length = 3;
this.x = new int[500];
this.y = new int[500];
for (int i = 0; i < 3; i++) {
x[i] = 55-(i*10);
y[i] = 95;
}
}
public int getLength() {
return length;
}
public void setLength() {
this.length++;
}
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;
}
}