import java.awt.event.*;
public class SnakeFrame extends Frame {
Snake snakeDemo = null;
Food food = null;
Boolean flagRun = true;
public SnakeFrame(){
food =new Food();
snakeDemo = new Snake(2,food);
}
public static void main(String[] args){
new SnakeFrame().lauchFrame();
}
public void lauchFrame(){
setBounds(200,300,405,430);
setTitle("贪吃蛇");
setVisible(true);
//匿名类,完成windows的框的关闭
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.addKeyListener(new KeyMontitor());
//start();
new Thread(new ThreadPaint()).start();
}
public void paint(Graphics g) {
flagRun = snakeDemo.drawSnake(g);
food.drawFood(g);
}
//直接在主进程里运行,对上下左右的反应比较慢,所以改用线程实现,经测试感觉也差不多
/*public void start() {
while(true){
repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
*/
//监听键盘的上下左右键
private class KeyMontitor extends KeyAdapter{
public void keyPressed(KeyEvent e) {
snakeDemo.keyPressed(e);
}
}
class ThreadPaint implements Runnable{
public void run() {
while(flagRun){
repaint();
try {
Thread.sleep(250);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
import java.util.List;//awt和util下都有List,需要指明
import java.awt.*;
import java.awt.event.KeyEvent;
public class Snake {
List<Point> snakes = null;
Food food = null;
enum Direction{up,down,left,right};
Direction snakeDirection = Direction.right;
final static int rectFrameLength = 20;
public Snake(int snakeLength,Food food){
snakes = new ArrayList<Point>();
this.food =food;
for(int i=0;i< snakeLength;i++){
snakes.add(i, new Point(i * rectFrameLength,0));
}
}
public boolean drawSnake(Graphics g){
Color x = g.getColor();
boolean flagRun =true ;
g.setColor(Color.blue);
g.fillRect(snakes.get(snakes.size()-1).x +5,snakes.get(snakes.size()-1 ).y + 30,rectFrameLength, rectFrameLength);
for(int i = snakes.size() -2 ; i >= 0 ; i--){
g.setColor(Color.red);
g.drawRect(snakes.get(i).x +5,snakes.get(i).y + 30,rectFrameLength, rectFrameLength);
}
move();
isEat();
flagRun=!isDead();
g.setColor(x);
return flagRun ;
}
public void move(){
//从蛇尾开始依次复制
for(int i = 0; i < snakes.size()-1;i++){
snakes.get(i).x =snakes.get(i+1).x;
snakes.get(i).y =snakes.get(i+1).y;
}
//只需判断蛇头
switch(snakeDirection){
case right: snakes.get(snakes.size()-1).x += rectFrameLength;break;
case left: snakes.get(snakes.size()-1).x -= rectFrameLength;break;
case up: snakes.get(snakes.size()-1).y -= rectFrameLength;break;
case down: snakes.get(snakes.size()-1).y += rectFrameLength;break;
}
}
public void isEat(){
Point p= food.getP();
int length = snakes.size();
boolean a = snakes.get(snakes.size()-1).x == p.x;
boolean b= snakes.get(snakes.size()-1).y == p.y;
if(a && b){
switch(snakeDirection){
case right: p.x += rectFrameLength;break;
case left: p.x -= rectFrameLength;break;
case up: p.y -= rectFrameLength;break;
case down: p.y += rectFrameLength;break;
}
snakes.add(length,new Point(p));
while(isOnBody()){
}
}
}
private boolean isOnBody(){
for(int i=0; i<snakes.size();i++){
if(food.foodRandom().equals(snakes.get(i))){
return true;
}
}
return false;
}
public boolean isDead(){
for(int i=0; i<snakes.size()-1;i++){
if(snakes.get(snakes.size()-1).equals(snakes.get(i))){
return true;
}
if( snakes.get(snakes.size()-1).x > 415 || snakes.get(snakes.size()-1).y > 400 ){
return true;
}
if( snakes.get(snakes.size()-1).y < -20 || snakes.get(snakes.size()-1).x < -20){
return true;
}
}
return false;
}
public void keyPressed(KeyEvent e){
int keyCode=e.getKeyCode();
switch(keyCode){
case KeyEvent.VK_DOWN: snakeDirection = Direction.down;break;
case KeyEvent.VK_UP: snakeDirection = Direction.up;break;
case KeyEvent.VK_LEFT: snakeDirection = Direction.left;break;
case KeyEvent.VK_RIGHT: snakeDirection = Direction.right;break;
}
}
}
import java.awt.event.*;
import java.util.*;
public class Food {
private Point food=null;
final static int rectFrameLength = 20;
public Food(){
foodRandom();
}
public Point foodRandom(){
int x = (int)(Math.random()*20);
int y = (int)(Math.random()*20);
return food = new Point(x* rectFrameLength,y* rectFrameLength);
}
public void drawFood(Graphics g){
Color x = g.getColor();
g.setColor(Color.red);
g.fillRect(food.x+5, food.y+30, rectFrameLength, rectFrameLength);
g.setColor(x);
}
public Point getP(){
return food;
}
}