贪吃蛇的实现(代码3)
package gluttonous_snake;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class GameFrame extends JFrame {
private static final long serialVersionUID = 4962810544181991386L;
private Toolkit tempKit;
private int horizontalGrid, verticalGrid;
private int singleWidthX, singleHeightY;
private int cooPos;
private Snake mainSnake;
private LinkedList eatedBean;
{
eatedBean = new LinkedList();
}
private Iterator snakeSq;
public javax.swing.Timer snakeTimer;
private int direction = 2;
private int score;
private String info;
private Point bean;
{
bean = new Point();
}
private boolean flag;
private JLabel scoreLabel;
{
scoreLabel = new JLabel();
}
/*private ImageIcon snakeHead;
{
snakeHead = new ImageIcon("LOGO.gif");
}*/
private ConfigMenu configMenu;
private boolean hasStoped = true;
public GameFrame() {
this.tempKit = this.getToolkit();
this.setSize(tempKit.getScreenSize());//控制窗口大小
this.setGrid(60, 40, 5);
this.getContentPane().setBackground(ColorGroup.COLOR_BACK);//设置窗口背景颜色
this.setUndecorated(true);//控制是否显示窗口的标题栏 ture 无标题栏
this.setResizable(false);//窗口的最大化按钮是否灰色
this.addKeyListener(new KeyHandler());
GameFrame.this.snakeTimer = new javax.swing.Timer(80,
new TimerHandler());
this.getContentPane().add(scoreLabel, BorderLayout.SOUTH);
this.scoreLabel.setFont(new Font("Fixedsys", Font.BOLD, 15));
this.scoreLabel.setText("Pause[SPACE] - Exit[ESC]");
this.configMenu = new ConfigMenu(this);
this.setVisible(true);
}
public void setGrid(int temp1, int temp2, int temp3) {
this.horizontalGrid = temp1;
this.verticalGrid = temp2;
this.singleWidthX = this.getWidth() / temp1;
this.singleHeightY = this.getHeight() / temp2;
this.cooPos = temp3;
}
private class KeyHandler extends KeyAdapter {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 27) {
snakeTimer.stop();
if (JOptionPane
.showConfirmDialog(null, "Are you sure to exit?") == 0) {
System.exit(0);
}
snakeTimer.start();
} else if (e.getKeyCode() == 37 && mainSnake.snakeDirection != 2)// left
{
direction = 4;
} else if (e.getKeyCode() == 39 && mainSnake.snakeDirection != 4)// right
{
direction = 2;
} else if (e.getKeyCode() == 38 && mainSnake.snakeDirection != 3)// up
{
direction = 1;
} else if (e.getKeyCode() == 40 && mainSnake.snakeDirection != 1)// down
{
direction = 3;
} else if (e.getKeyCode() == 32) {
if (!hasStoped) {
if (!flag) {
snakeTimer.stop();
configMenu.setVisible(true);
configMenu.setMenuEnable(false);
flag = true;
} else {
snakeTimer.start();
configMenu.setVisible(false);
configMenu.setMenuEnable(true);
flag = false;
}
}
}
}
}
private class TimerHandler implements ActionListener {
public synchronized void actionPerformed(ActionEvent e) {
Point temp = (Point) mainSnake.getLast();
snakeSq = mainSnake.iterator();
while (snakeSq.hasNext()) {
Point tempPoint = (Point) snakeSq.next();
if (temp.equals(tempPoint) && snakeSq.hasNext() != false) {
snakeTimer.stop();
stopGame();
JOptionPane.showMessageDialog(null, "Your Score is "
+ score + "\n\nYou Loss!");
}
}
System.out.println(temp.x + " " + temp.y);
if ((temp.x == 0 && direction == 4)
|| (temp.x == horizontalGrid - 1 && direction == 2)
|| (temp.y == 0 && direction == 1)
|| (temp.y == verticalGrid - 1 && direction == 3)) {
snakeTimer.stop();
stopGame();
JOptionPane.showMessageDialog(null, "Your Score is " + score
+ "\n\nYou Loss!");
}
if (direction != mainSnake.snakeReDirection) {
moveSnake(direction);
}
mainSnake.drawSnake(getGraphics(), singleWidthX, singleHeightY,
cooPos);
drawBeanAndEBean(getGraphics());
}
}
public void stopGame() {
this.hasStoped = true;
this.snakeTimer.stop();
Graphics2D g = (Graphics2D) GameFrame.this.getGraphics();
g.setColor(ColorGroup.COLOR_BACK);
super.paint(g);
configMenu.setVisible(true);
}
public void resetGame() {
System.gc();
this.hasStoped = false;
Graphics2D g = (Graphics2D) GameFrame.this.getGraphics();
g.setColor(ColorGroup.COLOR_BACK);
super.paint(g);
this.mainSnake = new Snake();
this.createBean(bean);
this.eatedBean.clear();
mainSnake.drawSnake(getGraphics(), singleWidthX, singleHeightY, cooPos);
this.snakeTimer.start();
this.direction = 2;
this.score = 0;
this.scoreLabel.setText("Pause[SPACE] - Exit[ESC]");
}
private void moveSnake(int direction) {
if (mainSnake.checkBeanIn(this.bean)) {
this.score += 100;
this.scoreLabel.setText(this.info + " Current Score:" + this.score);
this.eatedBean.add(new Point(this.bean));
this.createBean(this.bean);
}
mainSnake.changeDirection((Point) mainSnake.getLast(), direction);
Point temp = (Point) mainSnake.getFirst();
if (eatedBean.size() != 0) {
if (eatedBean.getFirst().equals(temp)) {
eatedBean.remove(0);
} else {
mainSnake.clearEndSnakePiece(getGraphics(), temp.x, temp.y,
singleWidthX, singleHeightY, cooPos);
mainSnake.removeTail();
}
} else {
mainSnake.clearEndSnakePiece(getGraphics(), temp.x, temp.y,
singleWidthX, singleHeightY, cooPos);
mainSnake.removeTail();
}
}
private void drawBeanAndEBean(Graphics g) {
g.setColor(ColorGroup.COLOR_BEAN);
this.drawPiece(g, this.bean.x, this.bean.y);
g.setColor(ColorGroup.COLOR_EATEDBEAN);
snakeSq = eatedBean.iterator();
while (snakeSq.hasNext()) {
Point tempPoint = (Point) snakeSq.next();
this.drawPiece(g, tempPoint.x, tempPoint.y);
}
}
private void drawPiece(Graphics g, int x, int y) {
g.fillRoundRect(this.singleWidthX * x + 1, this.singleHeightY * y + 1,
this.singleWidthX - 2, this.singleHeightY - 2, this.cooPos,
this.cooPos);
}
private void createBean(Point temp) {
LP: while (true) {
temp.x = (int) (Math.random() * this.horizontalGrid);
temp.y = (int) (Math.random() * this.verticalGrid);
snakeSq = mainSnake.iterator();
while (snakeSq.hasNext()) {
if (snakeSq.next().equals(new Point(temp.x, temp.y))) {
continue LP;
}
}
break;
}
}
}