废话不多说,直接奉上代码:
Frame.java
package snake;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
public class Frame extends JFrame implements KeyListener {
/**
*
*/
Boolean isAlive;
Boolean isPause;
Panel panel;
Character direction;
private static final long serialVersionUID = 1L;
public Frame(){
// TODO Auto-generated constructor stub
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,300);
addKeyListener(this);
panel = new Panel();
add(panel);
setVisible(true);
isAlive = true;
isPause = false;
direction = new Character('d');
MenuBar menuBar = new MenuBar();
Menu menu = new Menu("menu");
MenuItem reset = new MenuItem("newgame");
MenuItem pause= new MenuItem("pause");
pause.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(!isPause) isPause= true;
else isPause= false;
}
});
reset.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
reset();
}
});
menu.add(reset);
menu.add(pause);
menuBar.add(menu);
setMenuBar(menuBar);
}
public void reset(){
panel.reset();
isAlive = true;
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_UP) direction = 'w';
if(e.getKeyCode()==KeyEvent.VK_DOWN) direction = 's';
if(e.getKeyCode()==KeyEvent.VK_LEFT) direction = 'a';
if(e.getKeyCode()==KeyEvent.VK_RIGHT) direction = 'd';
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public void paint(Graphics g){
panel.repaint();
}
}
Launch.java
package snake;
import java.util.Timer;
import java.util.TimerTask;
public class Launch extends TimerTask {
Frame frame = new Frame();
public Launch() {
// TODO Auto-generated constructor stub
}
boolean crashWall(){
SnakeBody sb = frame.panel.snake.getFirst();
if((sb.x<0)||(sb.y<0)||(sb.x>=Panel.LINE)||(sb.y>=Panel.LINE))
return true;
else
return false;
}
void initial(){
frame.panel.snake.add(newBody());
frame.panel.food = newBody();
}
@Override
public void run() {
// TODO Auto-generated method stub
if(frame.panel.snake.isEmpty())
initial();
if(frame.isAlive)
if(!frame.isPause){
if(goStraight())
frame.isAlive = false;
frame.repaint();
}
if(crashWall()) frame.isAlive = false;
}
SnakeBody newBody(){
SnakeBody sb = new SnakeBody();
boolean overlap = true;
while(overlap){
overlap =false;
sb.x = (int) (Math.random()*(Panel.LINE-2)+1);
sb.y = (int) (Math.random()*(Panel.LINE-2)+1);
if(!frame.panel.snake.isEmpty())
for(SnakeBody s : frame.panel.snake)
if(sb.equals(s))
overlap =true;
}
return sb;
}
void eat(SnakeBody sb){
frame.panel.snake.addFirst(sb);
}
boolean goStraight(){
boolean result = false;
SnakeBody sb =new SnakeBody(frame.panel.snake.getFirst());
frame.panel.snake.removeLast();
if(frame.direction=='w')
sb.turnUp();
if(frame.direction=='s')
sb.turnDown();
if(frame.direction=='a')
sb.turnLeft();
if(frame.direction=='d')
sb.turnRight();
for(SnakeBody s : frame.panel.snake){
if(sb.equals(s)) result = true;
}
frame.panel.snake.addFirst(sb);
if(sb.equals(frame.panel.food)){
if(frame.direction=='w')
frame.panel.food.turnUp();
if(frame.direction=='s')
frame.panel.food.turnDown();
if(frame.direction=='a')
frame.panel.food.turnLeft();
if(frame.direction=='d')
frame.panel.food.turnRight();
eat(frame.panel.food);
frame.panel.food = newBody();
}
return result;
}
public static void main(String[] args){
// TODO Auto-generated method stub
Launch timertask = new Launch();
Timer timer = new Timer();
timer.schedule(timertask,0,500);
}
}
Panel.java
package snake;
import java.awt.Color;
import java.awt.Graphics;
import java.util.LinkedList;
import javax.swing.JPanel;
public class Panel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
public LinkedList snake = new LinkedList();
static final int LINE = 10;
SnakeBody food = new SnakeBody(-99,-99);
public Panel() {
// TODO Auto-generated constructor stub
}
public void reset(){
snake.clear();
}
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
for(SnakeBody sb : snake){
g.setColor(Color.black);
g.drawRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
g.setColor(Color.orange);
g.fillRect(sb.x*getWidth()/LINE,sb.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
}
g.setColor(Color.red);
g.fillRect(food.x*getWidth()/LINE,food.y*getHeight()/LINE,getWidth()/LINE,getHeight()/LINE);
}
}
SnakeBody.java
package snake;
class SnakeBody {
int x;
int y;
public SnakeBody() {
// TODO Auto-generated constructor stub
x = 0;
y = 0;
}
public SnakeBody(int a,int b){
x = a;
y = b;
}
public SnakeBody(SnakeBody sb){
this(sb.x,sb.y);
}
public void turnUp(){
y--;
}
public void turnDown(){
y++;
}
public void turnLeft(){
x--;
}
public void turnRight(){
x++;
}
boolean equals(SnakeBody s){
if((x==s.x)&&(y==s.y)) return true;
else return false;
}
}
以上所述就是本文给大家分享的贪吃蛇的全部代码了,希望能够对大家熟练掌握java有所帮助。