package com.cn;
public class TestSnake {
public static void main(String[] args) {
MyFrame f=new MyFrame();
f.setTitle("贪吃蛇小程序");
f.setBounds(100,200, 810, 450);
f.setVisible(true);
f.setResizable(false);
}
}
package com.cn;
class Node {
private int x;
private int y;
public Node(int x,int y){
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
@Override
public String toString() {
return "Node [x=" + x + ", y=" + y + "]";
}
}
package com.cn;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;
public class Snake {
ArrayList<Node> panel=new ArrayList<Node>();//墙
ArrayList<Node> body=new ArrayList<Node>();//蛇的身体
ArrayList<Node> food1=new ArrayList<Node>();//食物
Node food=new Node(13,21);
private int lastFX=KeyEvent.VK_LEFT;
int fx,fy;
public void createPanel(){
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 40; j++) {
if(i==0||i==19||j==0||j==39){
panel.add(new Node(i,j));
}
}
}
}
public void createFood(){
Random rd=new Random();
while(body.contains(food)){
int x=rd.nextInt(15)+1;
int y=rd.nextInt(38)+1;
food=new Node(x,y);
}
}
public void createBody(){
body.add(new Node(8,8));
body.add(new Node(8,9));
body.add(new Node(9,9));
}
public Snake(){
createPanel();
createBody();
}
public boolean move(){
Node node=body.get(0);
switch(lastFX){
case KeyEvent.VK_UP:
body.add(0,new Node(node.getX()-1,node.getY()));
break;
case KeyEvent.VK_LEFT:
body.add(0,new Node(node.getX(),node.getY()-1));
break;
case KeyEvent.VK_DOWN:
body.add(0,new Node(node.getX()+1,node.getY()));
break;
case KeyEvent.VK_RIGHT:
body.add(0,new Node(node.getX(),node.getY()+1));
break;
default:
body.add(0,new Node(node.getX(),node.getY()-1));
}
Node header=body.get(0);
if(header.equals(food)){
createFood();
}else{
body.remove(body.size()-1);
}
if(panel.contains(header)){
return false;
}
for (int i = 1; i < body.size(); i++) {
if(body.get(i).equals(header)){
return false;
}
}
return true;
}
public void move(int keycode){
this.lastFX=keycode;
}
}
package com.cn;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class MyFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
Snake snake=new Snake();
boolean flag=false,isAlive=true;
class MyPanel extends JPanel{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < 20; i++) {
for (int j = 0; j <40; j++) {
if(snake.body.contains(new Node(i,j))){
g.setColor(Color.green);
g.fill3DRect(20*j, 20*i, 20,20, true);
}
if(snake.food.equals(new Node(i,j))){
g.setColor(Color.green);
g.fill3DRect(20*j, 20*i, 20,20, true);
}
if(snake.panel.contains(new Node(i,j))){//确保墙在窗体里面;
g.setColor(Color.red);
g.fill3DRect(20*j, 20*i, 20,20, true);
}
}
}
}
}
public MyFrame(){
final MyPanel panel=new MyPanel();
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent k) {
int lastFX;
switch(k.getKeyCode()){
case KeyEvent.VK_UP:
lastFX=KeyEvent.VK_UP;
break;
case KeyEvent.VK_LEFT:
lastFX=KeyEvent.VK_LEFT;
break;
case KeyEvent.VK_DOWN:
lastFX=KeyEvent.VK_DOWN;
break;
case KeyEvent.VK_RIGHT:
lastFX=KeyEvent.VK_RIGHT;
break;
default:
lastFX=KeyEvent.VK_LEFT;
break;
}
snake.move(lastFX);
}
});
getContentPane().add(panel);
final Timer timer=new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
if(isAlive){
panel.repaint();
isAlive=snake.move();
}
else{
JOptionPane.showMessageDialog(panel,"撞到墙啦,GAME OVER!!");
timer.cancel();
}
}
},0,200);
}
}
效果图如下: