本人做了些修改
修正如下:
1、修正了按键与行进方向相反而死的bug
2、修正了连续按键可以加速的bug
修正如下:
1、修正了按键与行进方向相反而死的bug
2、修正了连续按键可以加速的bug
GreedySnake.java
package com.fred.test; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import java.awt.Graphics; import java.awt.Point; import java.awt.Color; import java.util.Random; import java.util.List; import java.util.LinkedList; import javax.swing.JPanel; import javax.swing.JFrame; class Food{ Snake snake; int x,y; boolean flag; Food(Snake snake){ this.snake = snake; flag = true; int x = 0; int y = 0; while(flag){ flag = false; x = Math.abs(new Random().nextInt()%40); y = Math.abs(new Random().nextInt()%40); if(snake.head.x==x && snake.head.y==y) flag = true; for(Point it:snake.body) if(it.x==x && it.y==y) flag = true; } this.x = x; this.y = y; } } class Snake{ int size,length,dir; List<Point> body; Point head; Snake(Point head){ size = 10; length = 5;dir = 4; this.head = head; body = new LinkedList<Point>(); for(int i=0;i<length-1;i++){ Point p = new Point(head.x,head.y+1+i); body.add(p); } } boolean isEat(Food food){ if(head.x==food.x && head.y==food.y) return true; return false; } boolean isOut(){ if(head.x<0 || head.y<0 || head.x>=40 || head.y>=40) return true; return false; } boolean isPitch(){ for(Point it:body) if(head.x==it.x && head.y==it.y){ dead(1); return true; } return false; } void dead(int way){ System.exit(way); } } class MyPanel extends JPanel implements KeyListener,Runnable{ Snake snake; Food food; int speed; MyPanel(Snake snake,Food food){ this.snake = snake; this.food = food; speed = 526; } public void paint(Graphics g){ super.paint(g); g.fillRect(0,0,400,400); g.setColor(Color.YELLOW); g.fillRect(snake.head.x*snake.size,snake.head.y*snake.size,snake.size,snake.size); g.setColor(Color.ORANGE); for(Point it:snake.body) g.fillRect(it.x*snake.size,it.y*snake.size,snake.size,snake.size); g.setColor(Color.GREEN); g.fillRect(food.x*snake.size,food.y*snake.size,snake.size,snake.size); } //自动行进 public void keyPressed(Integer dir){ Point oxy = new Point(snake.head); if(dir==3){ snake.head.x--; } else if(dir==4){ snake.head.x++; } else if(dir==1){ snake.head.y--; } else if(dir==2){ snake.head.y++; }else return; if(snake.isOut()) snake.dead(1); snake.body.add(0,oxy); if(snake.isEat(food)){ snake.length++; if(speed >= 50) speed-=25; food = new Food(snake); }else snake.body.remove(snake.length-1); if(snake.isPitch()) snake.dead(2); repaint(); } //按键仅用于修改蛇的方向 public void keyPressed(KeyEvent e){ int key = e.getKeyCode(); //按鍵和行進方向相反,按鍵無效直接返回! if(((key==KeyEvent.VK_LEFT && snake.dir==4)||(key==KeyEvent.VK_UP && snake.dir==2) ||(key==KeyEvent.VK_DOWN && snake.dir==1)||(key==KeyEvent.VK_RIGHT && snake.dir==3))){ return; } if(key == KeyEvent.VK_LEFT){ snake.dir = 3; } else if(key == KeyEvent.VK_RIGHT){ snake.dir = 4; } else if(key == KeyEvent.VK_UP){ snake.dir = 1; } else if(key == KeyEvent.VK_DOWN){ snake.dir = 2; }else return; } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} public synchronized void run(){ while(true){ try{Thread.sleep(speed); }catch(Exception e){} keyPressed(snake.dir); } } } public class GreedySnake extends JFrame{ MyPanel mp; Snake snake; Food food; Thread t; public GreedySnake(){ snake = new Snake(new Point(5,5)); food = new Food(snake); mp = new MyPanel(snake,food); t = new Thread(mp); t.start(); add(mp); addKeyListener(mp); setTitle("GreedySnake"); setSize(40*10 + 15,40*10 + 38); setLocation(200,200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args){ new GreedySnake(); } }
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10270.html