首页 > 代码库 > 贪吃蛇单机版
贪吃蛇单机版
1 package greedySnaker; 2 3 import java.awt.Graphics; 4 import java.util.LinkedList; 5 6 /** 7 * 蛇类 8 * @author 俊霖 9 * 10 */ 11 public class Snake { 12 private Direction dir = Direction.LEFT; 13 private LinkedList<SnakeNode> list = new LinkedList<SnakeNode>(); 14 private boolean isAlive = true; 15 public Snake(){ 16 for (int i = 0; i < GameContext.SNAKE_LENGTH; i++) { 17 list.add(new SnakeNode(270 + i * GameContext.SNAKE_SIZE, 290,i == 0)); 18 } 19 } 20 /** 21 * 改变蛇的方向 22 * @param dir 新的方向 23 */ 24 public void changeDir(Direction newDir) { 25 if (!((dir == Direction.LEFT && newDir == Direction.RIGHT) || 26 (dir == Direction.RIGHT && newDir == Direction.LEFT) || 27 (dir == Direction.UP && newDir == Direction.DOWN) || 28 (dir == Direction.DOWN && newDir == Direction.UP))) { 29 dir = newDir; 30 } 31 } 32 public SnakeNode getHead() { 33 return list.get(0); 34 } 35 public SnakeNode getTail() { 36 return list.get(list.size() - 1); 37 } 38 /** 39 * 移动 40 */ 41 public void move(){ 42 SnakeNode headNode = getHead(); 43 int x = headNode.getX(); 44 int y = headNode.getY(); 45 int size = GameContext.SNAKE_SIZE; 46 switch (dir) { 47 case UP: 48 y -= size; 49 break; 50 case DOWN: 51 y += size; 52 break; 53 case LEFT: 54 x -= size; 55 break; 56 case RIGHT: 57 x += size; 58 break; 59 } 60 SnakeNode newNode = new SnakeNode(x, y,true); 61 for (SnakeNode snakeNode : list) { 62 snakeNode.setHead(false); 63 } 64 list.addFirst(newNode); 65 } 66 public void remove() { 67 list.removeLast(); 68 } 69 /** 70 * 返回到上一步 71 */ 72 public void returnBack() { 73 SnakeNode headNode = getTail(); 74 int x = headNode.getX(); 75 int y = headNode.getY(); 76 int size = GameContext.SNAKE_SIZE; 77 switch (dir) { 78 case UP: 79 y += size; 80 break; 81 case DOWN: 82 y -= size; 83 break; 84 case LEFT: 85 x += size; 86 break; 87 case RIGHT: 88 x -= size; 89 break; 90 } 91 SnakeNode newNode = new SnakeNode(x, y); 92 list.addLast(newNode); 93 list.removeFirst(); 94 getHead().setHead(true); 95 } 96 /** 97 * 蛇撞到 98 */ 99 public void callideSnakeNode() {100 SnakeNode head = getHead();101 int headX = head.getX();102 int headY = head.getY();103 for (int i = 1; i < list.size(); i++) {104 if (headX == list.get(i).getX() && headY == list.get(i).getY()) {105 isAlive = false;106 }107 }108 }109 /**110 * 绘制111 * @param g 画笔工具112 */113 public void draw(Graphics g) {114 for (SnakeNode snakeNode : list) {115 snakeNode.draw(g);116 }117 }118 /**119 * 蛇吃蛋120 * @param egg121 * @return122 */123 public boolean eat(Egg egg) {124 SnakeNode headNode = getHead();125 return headNode.getX() == egg.getX() && headNode.getY() == egg.getY();126 }127 public Direction getDir() {128 return dir;129 }130 public boolean isAlive() {131 return isAlive;132 }133 public void setAlive(boolean isAlive) {134 this.isAlive = isAlive;135 }136 137 138 }
1 package greedySnaker; 2 3 import java.awt.Color; 4 import java.awt.Graphics; 5 6 public class Egg { 7 private int x,y; 8 private int size = GameContext.EGG_SIZE; 9 public Egg(){10 int maxX = (GameContext.SQUARER_WIDTH - GameContext.EGG_SIZE) / 20;11 x = (int) ((int)(Math.random() * maxX) * 20 + GameContext.WALL_X);12 int maxY = (GameContext.SQUARER_HEIGHT - GameContext.EGG_SIZE) / 20;13 y = (int) ((int)(Math.random() * maxY) * 20 + GameContext.WALL_Y);14 }15 public void draw(Graphics g) {16 g.setColor(Color.ORANGE);17 g.fillOval(x, y, size, size);18 }19 public int getX() {20 return x;21 }22 public int getY() {23 return y;24 }25 26 }
1 package greedySnaker; 2 /** 3 * 游戏的上下文 4 * @author 俊霖 5 * 6 */ 7 public class GameContext { 8 public static final int EGG_SIZE = 20; 9 /**10 * 蛇的初始长度11 */12 public static final int SNAKE_LENGTH = 5;13 /**14 * 蛇的速度15 */16 public static final int SNAKE_SPEED = 5;17 /**18 * 蛇头初始坐标19 */20 public static final int SNAKE_X = 270;21 public static final int SNAKE_Y = 290;22 /**23 * 蛇大小24 */25 public static final int SNAKE_SIZE = 20;26 /**27 * 游戏宽度28 */29 public static final int GAME_WIDTH = 600;30 /**31 * 游戏高度32 */33 public static final int GAME_HEIGHT = 600;34 /**35 * 围墙宽度36 */37 public static final int SQUARER_WIDTH = 500;38 /**39 * 围墙高度40 */41 public static final int SQUARER_HEIGHT = 500;42 /**43 * 围墙坐标44 */45 public static final int WALL_X = 50;46 public static final int WALL_Y = 50;47 /**48 * 刷新间隔时间49 */50 public static final int INTERVAL = 200;51 }
1 package greedySnaker; 2 3 import java.awt.Color; 4 import java.awt.Graphics; 5 /** 6 * 蛇节点类 7 * @author 俊霖 8 * 9 */10 public class SnakeNode {11 private int x,y;12 private int size = GameContext.SNAKE_SIZE;13 private boolean isHead = false;14 15 public SnakeNode(int x, int y) {16 this.x = x;17 this.y = y;18 }19 20 public SnakeNode(int x, int y, boolean isHead) {21 this.x = x;22 this.y = y;23 this.isHead = isHead;24 }25 26 public int getX() {27 return x;28 }29 public int getY() {30 return y;31 }32 /**33 * 绘制蛇节点34 * @param g 画笔工具35 */36 public void draw(Graphics g) {37 if (!isHead) {38 g.setColor(Color.GREEN);39 }else {40 g.setColor(Color.RED);41 }42 g.fillRect(x, y, size, size);43 g.setColor(Color.BLACK);44 g.drawRect(x, y, size, size);45 }46 47 public void setHead(boolean isHead) {48 this.isHead = isHead;49 }50 51 }
1 package greedySnaker;2 /**3 * 方向枚举4 * @author 俊霖5 *6 */7 public enum Direction {8 UP,DOWN,LEFT,RIGHT9 }
1 package greedySnaker; 2 3 import java.awt.BasicStroke; 4 import java.awt.Color; 5 import java.awt.Graphics; 6 import java.awt.Graphics2D; 7 import java.awt.Image; 8 import java.awt.Stroke; 9 import java.awt.event.ActionEvent; 10 import java.awt.event.ActionListener; 11 import java.awt.event.KeyAdapter; 12 import java.awt.event.KeyEvent; 13 import java.awt.image.BufferedImage; 14 15 import javax.swing.JFrame; 16 import javax.swing.Timer; 17 18 19 @SuppressWarnings("serial") 20 public class GameFrame extends JFrame{ 21 private Timer timer; 22 private int score; 23 private int interval = GameContext.INTERVAL; 24 private Egg egg = new Egg(); 25 private Snake snake = new Snake(); 26 private Image image = new BufferedImage(GameContext.GAME_WIDTH, GameContext.GAME_HEIGHT, BufferedImage.TYPE_INT_RGB); 27 public GameFrame(){ 28 this.setTitle("贪吃蛇"); 29 this.setSize(GameContext.GAME_WIDTH,GameContext.GAME_HEIGHT); 30 this.setResizable(false); 31 this.setLocationRelativeTo(null); 32 this.setDefaultCloseOperation(EXIT_ON_CLOSE); 33 initComponents(); 34 } 35 36 private void initComponents() { 37 this.setLayout(null); 38 timer = new Timer(interval, new ActionListener() { 39 40 @Override 41 public void actionPerformed(ActionEvent e) { 42 snake.move(); 43 snake.callideSnakeNode(); 44 if (snake.isAlive()) { 45 if (snake.eat(egg)) { 46 egg = new Egg(); 47 score += 10; 48 if (score == 100) { 49 interval -= 30; 50 } else if (score == 200) { 51 interval -= 50; 52 } else if (score == 300) { 53 interval -= 50; 54 } 55 } else { 56 snake.remove(); 57 } 58 SnakeNode head = snake.getHead(); 59 int x = head.getX(); 60 int y = head.getY(); 61 if (x < GameContext.WALL_X 62 || x > GameContext.WALL_X 63 + GameContext.SQUARER_WIDTH 64 - GameContext.SNAKE_SIZE 65 || y < GameContext.WALL_Y 66 || y > GameContext.WALL_Y 67 + GameContext.SQUARER_HEIGHT 68 - GameContext.SNAKE_SIZE) { 69 timer.stop(); 70 snake.setAlive(false); 71 } 72 repaint(); 73 } 74 } 75 }); 76 timer.start(); 77 this.addKeyListener(new KeyAdapter() { 78 @Override 79 public void keyPressed(KeyEvent e) { 80 Direction newDir = snake.getDir(); 81 switch (e.getKeyCode()) { 82 case KeyEvent.VK_A: 83 newDir = Direction.LEFT; 84 break; 85 case KeyEvent.VK_D: 86 newDir = Direction.RIGHT; 87 break; 88 case KeyEvent.VK_W: 89 newDir = Direction.UP; 90 break; 91 case KeyEvent.VK_S: 92 newDir = Direction.DOWN; 93 break; 94 case KeyEvent.VK_F2: 95 snake = new Snake(); //重置蛇 96 newDir = Direction.LEFT;//重置方向 97 egg = new Egg(); //重置蛋 98 timer.start(); 99 break;100 }101 if (snake.getDir() != newDir && snake.isAlive()) {102 snake.changeDir(newDir);103 }104 }105 });106 }107 @Override108 public void paint(Graphics g) {109 Graphics2D imageG = (Graphics2D)image.getGraphics();110 super.paint(imageG);111 imageG.setColor(Color.BLACK);//内存图片的画笔默认为白色,所以要设置一下画笔颜色112 Stroke stroke = imageG.getStroke();113 imageG.setStroke(new BasicStroke(4));114 imageG.drawRect(GameContext.WALL_X, GameContext.WALL_Y, GameContext.SQUARER_WIDTH, GameContext.SQUARER_HEIGHT);115 imageG.setStroke(stroke);116 imageG.setColor(Color.RED);117 imageG.drawString("得分:" + String.valueOf(score), 50, 40);118 if (!snake.isAlive()) {119 snake.returnBack();120 imageG.setColor(Color.BLACK);121 imageG.drawString("按F2重置游戏", 280, 40);122 }123 snake.draw(imageG); 124 egg.draw(imageG);125 g.drawImage(image, 0, 0, null);126 }127 public static void main(String[] args) {128 new GameFrame().setVisible(true);129 }130 }
贪吃蛇单机版
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。