import javax.swing.;
import java.awt.;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
import java.util.Random;
//游戏的面板
public class GamePanel extends JPanel implements KeyListener ,ActionListener {
int length;
int[] X = new int[600];
int[] Y = new int[600];
String fx;
int foodX;
int foodY;
boolean t = false;
boolean j = false;
boolean z = false;
boolean k = false;
int a=0;
boolean xuanzhe = true;
boolean isStart = false;//默认不开始
boolean isFail = false;//
int score;
Random random = new Random();
Timer timer1 = new Timer(200, this);
Timer timer2 = new Timer(175, this);
Timer timer3 = new Timer(100, this);
Timer timer4 = new Timer(125, this);
public GamePanel() {//
init();
this.setFocusable(true);
this.addKeyListener(this);
}
public void init() {
length = 3;
X[0] = 100;
Y[0] = 100;
X[1] = 75;
Y[1] = 100;
X[2] = 50;
Y[2] = 100;
fx = "R";
score = 0;
foodX = 25 + 25 * random.nextInt(34);
foodY = 75 + 25 * random.nextInt(24);
if(isFail&&k==true){
k=false;
isFail=!isFail;
}
if (j = true) {
timer1.start();
} else if (z = true) {
timer2.start();
} else if (k = true) {
timer3.start();
} else if (t = true) {
timer1.start();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//清屏
this.setBackground(Color.white);
Data.head.paintIcon(this, g, 25, 11);
g.fillRect(25, 75, 900, 750);
if (xuanzhe) {
g.setColor(Color.white);
g.setFont(new Font("微软雅黑", Font.BOLD, 20));
g.drawString("请选择模式,按下Q-挑战模式,按下W-简单模式,按下E-中等模式,按下R-困难模式", 100, 300);
}
if ((isStart == false && xuanzhe == false)) {
g.setColor(Color.white);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("按下空格开始游戏,", 300, 300);
}
if (isFail) {
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑", Font.BOLD, 40));
g.drawString("你失败了,按下空格重新开始", 200, 300);
}
//画食物
Data.food.paintIcon(this, g, foodX, foodY);
g.setFont(new Font("微软雅黑", Font.BOLD, 20));
g.drawString("分数:" + score, 850, 50);
//画小蛇
if (fx.equals("R")) {
Data.right.paintIcon(this, g, X[0], Y[0]);
} else if (fx.equals("L")) {
Data.left.paintIcon(this, g, X[0], Y[0]);
} else if (fx.equals("U")) {
Data.up.paintIcon(this, g, X[0], Y[0]);
} else if (fx.equals("D")) {
Data.down.paintIcon(this, g, X[0], Y[0]);
}
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this, g, X[i], Y[i]);
}
}
@Override
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
if (keycode == KeyEvent.VK_SPACE && xuanzhe == false) {
if (isFail) {
isFail=!isFail;//重新开始
xuanzhe = true;
init();//回到初始化
} else {
isStart = !isStart;
}
repaint();
}
if (keycode == KeyEvent.VK_Q && isFail == false) {
t = true;
xuanzhe = !xuanzhe;
}//挑战模式
if (keycode == KeyEvent.VK_W && isFail == false) {
j = true;
xuanzhe = !xuanzhe;
}//简单模式
if (keycode == KeyEvent.VK_E && isFail == false) {
z = true;
xuanzhe = !xuanzhe;
}//中等模式
if (keycode == KeyEvent.VK_R && isFail == false) {
k = true;
xuanzhe = !xuanzhe;
}//困难模式
if (keycode == KeyEvent.VK_RIGHT && fx != "L") {
fx = "R";
} else if (keycode == KeyEvent.VK_LEFT && fx != "R") {
fx = "L";
} else if (keycode == KeyEvent.VK_UP && fx != "D") {
fx = "U";
} else if (keycode == KeyEvent.VK_DOWN && fx != "U") {
fx = "D";
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void actionPerformed(ActionEvent e) {
if (isStart && isFail == false) {
if (X[0] == foodX && Y[0] == foodY) {
length++;
score++;
foodX = 25 + 25 * random.nextInt(30);
foodY = 75 + 25 * random.nextInt(20);
}
}
if (k == true) {
timer3.start();
}
if (j == true) {
timer1.start();
}
if (z == true) {
timer2.start();
}
if (t == true) {
if (score <= 5) {
timer1.start();
} else if (score > 5 && score < 15) {
timer2.start();
} else if (score > 15 && score < 20) {
timer3.start();
} else {
timer4.start();
}
if (score == 20) {//如果达到一定的分数会跳出一个弹窗,显示你会得到什么
}
}
if (isStart && xuanzhe == false) {
for (int i = length - 1; i > 0; i--) {
X[i] = X[i - 1];
Y[i] = Y[i - 1];
}
//按下那个蛇头改变方向
if (fx.equals("R")) {
X[0] = X[0] + 25;
if (X[0] > 900) {
isFail = true;
xuanzhe = false;
}
} else if (fx.equals("L")) {
X[0] = X[0] - 25;
if (X[0] < 25) {
isFail = true;
xuanzhe = false;
}
} else if (fx.equals("U")) {
Y[0] = Y[0] - 25;
if (Y[0] < 75) {
isFail = true;
xuanzhe = false;
}
} else if (fx.equals("D")) {
Y[0] = Y[0] + 25;
if (Y[0] > 800) {
isFail = true;
xuanzhe = false;
}
}
for (int i = 1; i < length; i++) {//撞到身体就失败
if (X[0] == X[i] && Y[0] == Y[i]) {
isFail = true;
xuanzhe = false;
}
}
}
repaint();
}
}
因为面板没有获取到焦点,要调用panel的requestFocus获取焦点,按键才有效果。