⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframe.java

📁 贪吃蛇游戏java实现,里面的结构较为清晰
💻 JAVA
字号:
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

//用JinternalFrame不知道为什么设置好的大小会被自动改变
public class MainFrame extends JFrame implements Runnable {
	public static final int WIDTH = 800;
	public static final int HEIGHT = 630;
	Snake snake = new Snake();
	Rect blood;
	int eatBloodCount = 0;
	boolean bOver = false;
	int timeInv = 500;
	boolean keyRel = true;

	enum DIRECTION {
		UP, DOWN, LEFT, RIGHT
	};

	DIRECTION dir = DIRECTION.RIGHT;

	public MainFrame() {
		blood = Rect.getBlood();
		this.addKeyListener(new FrameKeyboardListener());
		this.setSize(WIDTH, HEIGHT);
		this.setTitle("贪吃蛇游戏-林蒋");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);
		new Thread(this).start();
	}

	public void paint(Graphics g) {
		super.paint(g);
		if (!bOver) {
			snake.drawSnake(g);
			blood.drawRect(g);
			g.drawString("已吃数目:   " + eatBloodCount, MainFrame.WIDTH - 120,
					MainFrame.HEIGHT - 20);
		} else {
			String gameOver = "Game Over";
			g.drawString(gameOver, (MainFrame.WIDTH - gameOver.length()) / 2,
					(MainFrame.HEIGHT - 30) / 2);
			g.drawString("总共吃的数目:   " + eatBloodCount, MainFrame.WIDTH - 120,
					MainFrame.HEIGHT - 20);
		}
	}

	class FrameKeyboardListener extends KeyAdapter {
		@Override
		public void keyReleased(KeyEvent e) {
			super.keyReleased(e);
			super.keyPressed(e);
			int keycode = e.getKeyCode();
			switch (keycode) {
			case KeyEvent.VK_UP:
			case KeyEvent.VK_DOWN:
			case KeyEvent.VK_LEFT:
			case KeyEvent.VK_RIGHT:
				keyRel = true;
			}
		}

		@Override
		public void keyPressed(KeyEvent e) {
			super.keyPressed(e);
			int keycode = e.getKeyCode();
			switch (keycode) {
			case KeyEvent.VK_UP:
				if (!bOver && dir != DIRECTION.DOWN) {
					if ((snake.snakeList.getLast().y - Rect.HEIGHT) >= 30) {
						Rect up = new Rect(snake.snakeList.getLast().x,
								snake.snakeList.getLast().y - Rect.HEIGHT);
						if (Rect.isInSnakeBody(up)) {
							bOver = true;
							repaint();
							return;
						}
						snake.addRect(up);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}

						dir = DIRECTION.UP;
						keyRel = false;
					} else {
						bOver = true;
						repaint();
						return;
					}
				}
				repaint();
				break;
			case KeyEvent.VK_DOWN:
				if (!bOver && dir != DIRECTION.UP) {
					if ((snake.snakeList.getLast().y + Rect.HEIGHT) <= (MainFrame.HEIGHT - Rect.HEIGHT)) {
						Rect down = new Rect(snake.snakeList.getLast().x,
								snake.snakeList.getLast().y + Rect.HEIGHT);
						if (Rect.isInSnakeBody(down)) {
							bOver = true;
							repaint();
							return;
						}

						snake.addRect(down);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}

						dir = DIRECTION.DOWN;
						keyRel = false;
					} else {
						bOver = true;
						repaint();
						return;
					}
				}
				repaint();
				break;
			case KeyEvent.VK_LEFT:
				if (!bOver && dir != DIRECTION.RIGHT) {
					if ((snake.snakeList.getLast().x - Rect.WIDTH) >= 0) {
						// System.out.println(snake.snakeList.getLast().x );
						Rect left = new Rect(snake.snakeList.getLast().x
								- Rect.WIDTH, snake.snakeList.getLast().y);
						if (Rect.isInSnakeBody(left)) {
							bOver = true;
							repaint();
							return;
						}

						snake.addRect(left);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}

						dir = DIRECTION.LEFT;
						keyRel = false;
					} else {
						bOver = true;
						repaint();
						return;
					}
				}
				repaint();
				break;
			case KeyEvent.VK_RIGHT:
				if (!bOver && dir != DIRECTION.LEFT) {
					if ((snake.snakeList.getLast().x + Rect.WIDTH) <= (MainFrame.WIDTH - Rect.WIDTH)) {
						Rect right = new Rect(snake.snakeList.getLast().x
								+ Rect.WIDTH, snake.snakeList.getLast().y);
						if (Rect.isInSnakeBody(right)) {
							bOver = true;
							repaint();
							return;
						}

						snake.addRect(right);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}

						dir = DIRECTION.RIGHT;
						keyRel = false;
					} else {
						bOver = true;
						repaint();
						return;
					}
				}
				repaint();
				break;

			}
		}
	}

	public void run() {
		// System.out.println("aaaaaaaaa----------"+this.getWidth());
		while (!bOver) {

			if (keyRel) {
				switch (dir) {
				case UP:
					if ((snake.snakeList.getLast().y - Rect.HEIGHT) >= 30) {
						Rect up = new Rect(snake.snakeList.getLast().x,
								snake.snakeList.getLast().y - Rect.HEIGHT);
						if (Rect.isInSnakeBody(up)) {
							bOver = true;
							repaint();
							return;
						}
						snake.addRect(up);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}
					} else {// 碰到墙壁了
						bOver = true;
						repaint();
						return;
					}

					repaint();
					break;
				case DOWN:
					if ((snake.snakeList.getLast().y + Rect.HEIGHT) <= (MainFrame.HEIGHT - Rect.HEIGHT)) {
						Rect down = new Rect(snake.snakeList.getLast().x,
								snake.snakeList.getLast().y + Rect.HEIGHT);
						if (Rect.isInSnakeBody(down)) {
							bOver = true;
							repaint();
							return;
						}

						snake.addRect(down);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}
					} else {
						bOver = true;
						repaint();
						return;
					}
					repaint();
					break;
				case LEFT:
					if ((snake.snakeList.getLast().x - Rect.WIDTH) >= 0) {

						Rect left = new Rect(snake.snakeList.getLast().x
								- Rect.WIDTH, snake.snakeList.getLast().y);
						if (Rect.isInSnakeBody(left)) {
							bOver = true;
							repaint();
							return;
						}

						snake.addRect(left);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}
					} else {
						bOver = true;
						repaint();
						return;
					}
					repaint();
					break;
				case RIGHT:
					// System.out.println(this.getWidth());
					if ((snake.snakeList.getLast().x + Rect.WIDTH) <= (MainFrame.WIDTH - Rect.WIDTH)) {

						Rect right = new Rect(snake.snakeList.getLast().x
								+ Rect.WIDTH, snake.snakeList.getLast().y);
						if (Rect.isInSnakeBody(right)) {
							bOver = true;
							repaint();
							return;
						}

						snake.addRect(right);

						if (Rect.isInSnakeBody(blood)) {
							snake.addRect(blood);
							eatBloodCount++;
							blood = Rect.getBlood();
						} else {
							snake.snakeList.remove();
						}
					} else {
						bOver = true;
						repaint();
						return;
					}
					repaint();
					break;
				}
			}
			try {
				Thread.sleep(timeInv);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -