import java.awt.*;
巴东网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联建站于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class SnakeGame extends JFrame implements KeyListener{
private int stat=1,direction=0,bodylen=6,headx=7,heady=8,
tailx=1,taily=8,tail,foodx,foody,food;//初始化定义变量
public final int EAST=1,WEST=2,SOUTH=3,NORTH=4;//方向常量
int [][] fillblock=new int [20][20];//定义蛇身所占位置
public SnakeGame() {//构造函数
super("贪吃蛇");
setSize(510,510);
setVisible(true);//设定窗口属性
addKeyListener(this);//添加监听
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
for(int i=1;i=7;i++) fillblock[i][8]=EAST;//初始化蛇身属性
direction=EAST;//方向初始化的设置
FoodLocate(); //定位食物
while (stat==1){
fillblock[headx][heady]=direction;
switch(direction){
case 1:headx++;break;
case 2:headx--;break;
case 3:heady++;break;
case 4:heady--;break;
}//蛇头的前进
if(heady19||headx19||tailx19||taily19||heady0||headx0||tailx0||taily0||fillblock[headx][heady]!=0){
stat=0;
break;
} //判断游戏是否结束
try{
Thread.sleep(150); }
catch(InterruptedException e){}//延迟
fillblock[headx][heady]=direction;
if(headx==foodxheady==foody){//吃到食物
FoodLocate();
food=2;
try{
Thread.sleep(100); }
catch(InterruptedException e){}//延迟
}
if(food!=0)food--;
else{tail=fillblock[tailx][taily];
fillblock[tailx][taily]=0;//蛇尾的消除
switch(tail){
case 1:tailx++;break;
case 2:tailx--;break;
case 3:taily++;break;
case 4:taily--;break;
}//蛇尾的前进
}
repaint();
}
if(stat==0)
JOptionPane.showMessageDialog(null,"GAME OVER","Game Over",JOptionPane.INFORMATION_MESSAGE);
}
public void keyPressed(KeyEvent e) {//按键响应
int keyCode=e.getKeyCode();
if(stat==1) switch(keyCode){
case KeyEvent.VK_UP:if(direction!=SOUTH) direction=NORTH;break;
case KeyEvent.VK_DOWN:if(direction!=NORTH)direction=SOUTH;break;
case KeyEvent.VK_LEFT:if(direction!=EAST)direction=WEST;break;
case KeyEvent.VK_RIGHT:if (direction!=WEST)direction=EAST;break;
}
}
public void keyReleased(KeyEvent e){}//空函数
public void keyTyped(KeyEvent e){} //空函数
public void FoodLocate(){//定位食物坐标
do{
Random r=new Random();
foodx=r.nextInt(20);
foody=r.nextInt(20);
}while (fillblock[foodx][foody]!=0);
}
public void paint(Graphics g){//画图
super.paint(g);
g.setColor(Color.BLUE);
for(int i=0;i20;i++)
for(int j=0;j20;j++)
if (fillblock[i][j]!=0)
g.fillRect(25*i+5,25*j+5,24,24);
g.setColor(Color.RED);
g.fillRect(foodx*25+5,foody*25+5,24,24);
}
public static void main(String[] args) {//主程序
SnakeGame application=new SnakeGame();
}
}
package games;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import static java.lang.Math.*;//静态导入
/*
* 此类是贪吃蛇的简单实现方法
* 自己可以加入在开始时的设置,比如
* 选关,初始的蛇的长度等等
*/
public class Snake extends JPanel {
private static final long serialVersionUID = 1L;
private Direction dir;// 要走的方向
private int blockWidth = 10;// 块大小
private int blockSpace = 2;// 块之间的间隔
private long sleepTime;// 重画的进间间隔
private MySnake my;
private int total;// 代表蛇的长度
private Rectangle food;// 代表蛇的食物
private volatile boolean go;
private int round;// 表示第几关
public Snake(JFrame jf) {
initOther();
// 为顶级窗口类JFrame添加事件处理函数
jf.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ke) {
int code = ke.getKeyCode();
if (code == KeyEvent.VK_RIGHT) {
if (dir != Direction.WEST)
dir = Direction.EAST;
}
else if (code == KeyEvent.VK_LEFT) {
if (dir != Direction.EAST)
dir = Direction.WEST;
}
else if (code == KeyEvent.VK_UP) {
if (dir != Direction.SOUTH)
dir = Direction.NORTH;
}
else if (code == KeyEvent.VK_DOWN) {
if (dir != Direction.NORTH)
dir = Direction.SOUTH;
} else if (code == KeyEvent.VK_ENTER) {
if (!go)
initOther();
}
}
});
this.setBounds(300, 300, 400, 400);
this.setVisible(true);
}
// 随机生成一个食物的位置
private void makeFood() {
int x = 40 + (int) (random() * 30) * 12;
int y = 10 + (int) (random() * 30) * 12;
food = new Rectangle(x, y, 10, 10);
}
// 做一些初始化的工作
private void initOther() {
dir = Direction.EAST;
sleepTime = 500;
my = new MySnake();
makeFood();
total = 3;
round = 1;
new Thread(new Runnable() {
public void run() {
go = true;
while (go) {
try {
Thread.sleep(sleepTime);
repaint();
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
}).start();
}
// 处理多少关的函数
private void handleRound() {
if (total == 6) {
round = 2;
sleepTime = 300;
} else if (total == 10) {
round = 3;
sleepTime = 200;
} else if (total == 15) {
round = 4;
sleepTime = 100;
} else if (total == 18) {
round = 5;
sleepTime = 50;
} else if (total == 20) {
round = 6;
sleepTime = 20;
} else if (total 21) {
round = 7;
sleepTime = 15;
}
}
// 把自己的组件全部画出来
public void paintComponent(Graphics g) {
g.setColor(Color.PINK);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.BLACK);
g.drawRect(40, 10, 358, 360);
if (go) {
my.move();
my.draw(g);
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("您的得分:" + (total * 10) + " 第" + round + "关", 40,
400);
} else {
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("游戏结束,按回车(ENTER)键重玩!", 40, 440);
}
g.setColor(Color.RED);
g.fillRect(food.x, food.y, food.width, food.height);
}
private class MySnake {
private ArrayListRectangle list;
public MySnake() {
list = new ArrayListRectangle();
list.add(new Rectangle(160 + 24, 130, 10, 10));
list.add(new Rectangle(160 + 12, 130, 10, 10));
list.add(new Rectangle(160, 130, 10, 10));
}
// 蛇移动的方法
public void move() {
if (isDead()) {
go = false;
return;
}
if (dir == Direction.EAST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
+ (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.WEST) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x
- (blockWidth + blockSpace), rec.y, rec.width,
rec.height);
list.add(0, rec1);
} else if (dir == Direction.NORTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
- (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
} else if (dir == Direction.SOUTH) {
Rectangle rec = list.get(0);
Rectangle rec1 = new Rectangle(rec.x, rec.y
+ (blockWidth + blockSpace), rec.width, rec.height);
list.add(0, rec1);
}
if (isEat()) {
handleRound();
makeFood();
} else {
list.remove(list.size() - 1);
}
}
// 判断是否吃到了食物
private boolean isEat() {
if (list.get(0).contains(food)) {
total++;
return true;
} else
return false;
}
// 判断是否死了,如果碰壁或者自己吃到自己都算死了
private boolean isDead() {
Rectangle temp = list.get(0);
if (dir == Direction.EAST) {
if (temp.x == 388)
return true;
else {
Rectangle comp = new Rectangle(temp.x + 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.WEST) {
if (temp.x == 40)
return true;
else {
Rectangle comp = new Rectangle(temp.x - 12, temp.y, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.NORTH) {
if (temp.y == 10)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y - 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else if (dir == Direction.SOUTH) {
if (temp.y == 358)
return true;
else {
Rectangle comp = new Rectangle(temp.x, temp.y + 12, 10, 10);
for (Rectangle rec : list) {
if (rec.contains(comp))
return true;
}
}
return false;
} else {
return false;
}
}
// 把自己画出来
public void draw(Graphics g) {
for (Rectangle rec : list) {
g.fillRect(rec.x, rec.y, rec.width, rec.height);
}
}
}
public static void main(String arsg[]) {
JFrame jf = new JFrame("贪吃蛇");
Snake s = new Snake(jf);
jf.getContentPane().add(s, BorderLayout.CENTER);
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// 定义一个枚举,在此也可以用接口或者常量值代替
enum Direction {
EAST, SOUTH, WEST, NORTH;
}
三个文件,楼主看好:
运行可以,但是并不能鼓吹是一个具有好的风格的代码,。
//文件一
package greedysnake_cx;
public class Node {
int x=0;
int y=0;
int nodewidth;
int nodeheight;
Node(int x,int y){
this.x=x;
this.y=y;
}
}
//文件二
package greedysnake_cx;
/**
* 实现一个greedysnake的模型,具有功能:
* 1)移动,moveOn()----从director参数中获取方向信息,如果方向定义的下一个点的逻辑值是true,检查是不是food,是则将food添加到
* 列表的头部,snake继续移动,不是则停止移动(撞到蛇尾巴了)
* 2)加速,speedUp()----将现成的停滞时间间隔interval按照一定的比率 speedRate进行扩大
* 3)减速,speedDown()----....
*
* 该类实现Runnable接口,
* */
//定义snake的模型
import java.util.*;
import javax.swing.*;
public class SnakeModel implements Runnable {
private GreedSnake gs;
//给每一个矩阵点确立一个boolean值
boolean[][] matrix;
private int maxX;
private int maxY;
//设置一个节点的列表;
LinkedList nodeArray = new LinkedList();
Node food=null;
int direction=UP;
int score=0;
//定义方向
public final static int LEFT=1;
public final static int UP=2;
public final static int RIGHT=3;
public final static int DOWN=4;
private int interval=200; //停顿时间的间隔
boolean pause=false; //定义暂停
private double speedRate=0.5; //定义速度的变更幅度
//constructor
public SnakeModel(GreedSnake gs,int maxx,int maxy){
this.gs=gs;
this.maxX=maxx;
this.maxY=maxy;
//this.matrix=null;
////////////////////////////////////////////////////////////////////
//init matrix[][];
matrix=new boolean[maxX][]; //***********************不初始化是不行滴
for(int i=0;imaxX;i++){
matrix[i]=new boolean[maxY];//将矩阵的每一行定义成列的集合
Arrays.fill(matrix[i], false);///使用java.util.Arrays的static方法fill,将matrix[]数组里面的元素全部定义成false
//至此,矩阵里面所有的点的boolean值都是flase
//for(int j=0;jmaxY;j++){
//matrix[i][j]=false;
//}
}
////////////////////////////////////////////////////////////////////
//init nodeArray
int initlength=10;
for(int i=0;iinitlength;i++){
//确保snake出现在屏幕的中央 assure that the greedy snake appears in the center of the model
//snake的长度由maxX来确定
int x=maxX/2+i;
int y=maxY/2;
nodeArray.addFirst(new Node(x,y));
matrix[x][y]=true;
}
//////////////////////////////////////////////////////////////////////
//创建食物
food=createFood();
System.out.println("some test!");
matrix[food.x][food.y]=true;
}//end constructor
//snake动起
public boolean moveOn(){
Node head=(Node)nodeArray.getFirst();
int x=head.x;
int y=head.y;
switch(direction){
case LEFT:
x--;break;
case UP:
y--;break;
case RIGHT:
x++;break;
case DOWN:
y++;break;
default:
}
if((x = 0 x maxX) (y = 0 y maxY)){
if(matrix[x][y]){//当蛇头转至一个bool值为true的点时
if(x==food.xy==food.y){//该点是食物
nodeArray.addFirst(food);
//吃掉补上
food=createFood();
matrix[food.x][food.y]=true;
score+=10;
return true;
}
else //该点不是食物,(蛇尾巴)
return false;
}
else{
nodeArray.addFirst(new Node(x,y));
matrix[x][y]=true;
Node nn=(Node)nodeArray.removeLast();//移除并且返回列表中的最后一个元素
matrix[nn.x][nn.y]=false;
return true;
}
}
return false;
}//end moveOn
public void run() {
boolean running=true;
while(running){
try{
Thread.sleep(interval);
}
catch(InterruptedException e){
e.printStackTrace();
}
if(!pause){
if(moveOn()){
gs.repaint();
}
else{
JOptionPane.showMessageDialog(null, "sorry myboy,GAME OVER!", "message", JOptionPane.INFORMATION_MESSAGE);
running=false;
}
}
}
/*boolean running=true;
while(running){
try{
Thread.sleep(interval);
}
catch (InterruptedException e){
e.printStackTrace();
}
if(!pause){
if(moveOn()){
gs.repaint();
}
else{
JOptionPane.showMessageDialog(null,"i am sorry ,you failed!","message",JOptionPane.INFORMATION_MESSAGE);
break;
}
}
}//end while
running=false;//当且仅当失败退出的时候;
*/
}
//获取当前游戏得分
public int getScore(){
return this.score;
}
//加速
public void speedUp(){
interval*=speedRate;
}
//减速
public void speedDown(){
interval/=speedRate;
}
//设置暂停
public void chagePause(){
pause=!pause;
}
//设置方向
public void chageDirection(int newdirection){
if(direction % 2 != newdirection % 2){
direction=newdirection;
}
}
//生成食物
private Node createFood() {
/*
* 创建一个随机数的生成器,这个是java.util.Random类
* 与java.lang.Math类中的random()方法有不一样的地方,彼方法返回一个0-1之间的随机数
* */
Random random=new Random();
int foodx=random.nextInt(maxX);
int foody=random.nextInt(maxY);
Node food=new Node(foodx,foody);
return food;
}
}
//文件三
package greedysnake_cx;
/**
* 在repaint()方法中,绘画上下文对象是从canvas对象使用getContentPane()获取的!!
* */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class GreedSnake implements KeyListener{
Canvas canvas;
private JLabel jlabel;
private JPanel jpanel;
private JFrame jframe;
SnakeModel snakemodel;
private final static int canvaswidth=400;
private final static int canvasheight=300;
private final static int nodewidth=10;
private final static int nodeheight=10;
//construction
GreedSnake(){
jframe=new JFrame("The Greed Sanke!");
jframe.setLayout(new BorderLayout());
Container cp=jframe.getContentPane();
//在jframe面板中添加各种组件
jlabel=new JLabel("welcome");
jlabel.setText("Welcome my friend! Enjoy your self!");
cp.add(jlabel,BorderLayout.NORTH);
canvas=new Canvas();
canvas.setSize(canvaswidth,canvasheight);
canvas.addKeyListener(this); //给空白面板添加键盘时间监听器!
cp.add(canvas,BorderLayout.CENTER);
jpanel=new JPanel();
jpanel.setLayout(new BorderLayout());
JLabel label=new JLabel("Pass enter or 'r' or 's' to start",JLabel.CENTER);
jpanel.add(label,BorderLayout.NORTH);
JLabel label2=new JLabel("Pass space to pause this game!",JLabel.CENTER);
jpanel.add(label2,BorderLayout.CENTER);
JLabel label3=new JLabel("Pass pageUp or pageDown to up or down the speed of the snake!",JLabel.CENTER);
jpanel.add(label3,BorderLayout.SOUTH);
cp.add(jpanel,BorderLayout.SOUTH);
//给顶层容器设置时间监听、可视化、关闭按钮的设定
jframe.addKeyListener(this);
jframe.pack();
jframe.setVisible(true);
jframe.setResizable(false);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
begin();
}//end construction
public void begin(){
//开启一个SnakeModel的进程,并且开始改进程
snakemodel=new SnakeModel(this,canvaswidth/nodewidth,canvasheight/nodeheight);
(new Thread(snakemodel)).start();
}
void repaint(){
int score=snakemodel.getScore();
jlabel.setText("您的得分是:"+score);
Graphics g=canvas.getGraphics();///pay attention!
g.setColor(Color.white);
g.fillRect(0, 0, canvaswidth, canvasheight);
g.setColor(Color.blue);
LinkedList list=snakemodel.nodeArray;
for(int i=0;ilist.size();i++){
Node nn=(Node)list.get(i);
paintingNode(g,nn);
}
//绘制food
g.setColor(Color.green);
Node foodnode=new Node(snakemodel.food.x,snakemodel.food.y);
paintingNode(g,foodnode);
}
public void paintingNode(Graphics gg,Node n){
/*
* 使用Graphics 的fillRect方法,填充一个矩形,
* 矩形的起点需要乘以一个NODE的长宽,以避免重叠
* */
gg.fillRect(n.x*nodewidth, n.y*nodeheight,nodewidth-1,nodeheight-1);
}
public void keyPressed(KeyEvent e) {//按下某一个键时,调用此方法
int keycode=e.getKeyCode();
/* if(keycode==KeyEvent.VK_ENTER||keycode==KeyEvent.VK_R){
begin();
}*/
switch(keycode){
case KeyEvent.VK_LEFT:
snakemodel.chageDirection(SnakeModel.LEFT);
break;
case KeyEvent.VK_UP:
snakemodel.chageDirection(SnakeModel.UP);
break;
case KeyEvent.VK_RIGHT:
snakemodel.chageDirection(SnakeModel.RIGHT);
break;
case KeyEvent.VK_DOWN:
snakemodel.chageDirection(SnakeModel.DOWN);
break;
case KeyEvent.VK_PAGE_DOWN:
snakemodel.speedDown();
break;
case KeyEvent.VK_PAGE_UP:
snakemodel.speedUp();
break;
case KeyEvent.VK_ENTER:
case KeyEvent.VK_R:
begin();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
snakemodel.chagePause();
default:
}//end switch
}//end keyPressed
public void keyReleased(KeyEvent e) {//释放某一个键时,调用此方法
}
public void keyTyped(KeyEvent e) {//键入某一个键时,调用此方法!
}
//main
public static void main(String[] args){
GreedSnake gs=new GreedSnake();
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
public class InterFace extends JFrame {
/**
* WIDTH:宽
* HEIGHT:高
* SLEEPTIME:可以看作蛇运动的速度
* L = 1,R = 2, U = 3, D = 4 左右上下代码
*/
public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 200, L = 1,R = 2, U = 3, D = 4;
BufferedImage offersetImage= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_3BYTE_BGR);;
Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35);
Snake snake;
Node node;
public InterFace() {
//创建"蛇"对象
snake = new Snake(this);
//创建"食物"对象
createNode();
this.setBounds(100, 100, WIDTH, HEIGHT);
//添加键盘监听器
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent arg0) {
System.out.println(arg0.getKeyCode());
switch (arg0.getKeyCode()) {
//映射上下左右4个键位
case KeyEvent.VK_LEFT:
snake.dir = L;
break;
case KeyEvent.VK_RIGHT:
snake.dir = R;
break;
case KeyEvent.VK_UP:
snake.dir = U;
break;
case KeyEvent.VK_DOWN:
snake.dir = D;
}
}
});
this.setTitle("贪吃蛇 0.1 By : Easy");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
//启动线程,开始执行
new Thread(new ThreadUpadte()).start();
}
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();
g2d.setColor(Color.white);
g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.black);
g2d.drawRect(rect.x, rect.y, rect.width, rect.height);
//如果蛇碰撞(吃)到食物,则创建新食物
if (snake.hit(node)) {
createNode();
}
snake.draw(g2d);
node.draw(g2d);
g.drawImage(offersetImage, 0, 0, null);
}
class ThreadUpadte implements Runnable {
public void run() {
//无限重绘画面
while (true) {
try {
Thread.sleep(SLEEPTIME);
repaint(); //
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 创建食物
*/
public void createNode() {
//随机食物的出现位置
int x = (int) (Math.random() * 650) + 50,y = (int) (Math.random() * 500) + 50;
Color color = Color.blue;
node = new Node(x, y, color);
}
public static void main(String args[]) {
new InterFace();
}
}
/**
* 节点类(包括食物和蛇的身躯组成节点)
*/
class Node {
int x, y, width = 15, height = 15;
Color color;
public Node(int x, int y, Color color) {
this(x, y);
this.color = color;
}
public Node(int x, int y) {
this.x = x;
this.y = y;
this.color = color.black;
}
public void draw(Graphics2D g2d) {
g2d.setColor(color);
g2d.drawRect(x, y, width, height);
}
public Rectangle getRect() {
return new Rectangle(x, y, width, height);
}
}
/**
* 蛇
*/
class Snake {
public ListNode nodes = new ArrayListNode();
InterFace interFace;
int dir=InterFace.R;
public Snake(InterFace interFace) {
this.interFace = interFace;
nodes.add(new Node(20 + 150, 40 + 150));
addNode();
}
/**
* 是否碰撞到食物
* @return true 是 false 否
*/
public boolean hit(Node node) {
//遍历整个蛇体是否与食物碰撞
for (int i = 0; i nodes.size(); i++) {
if (nodes.get(i).getRect().intersects(node.getRect())) {
addNode();
return true;
}
}
return false;
}
public void draw(Graphics2D g2d) {
for (int i = 0; i nodes.size(); i++) {
nodes.get(i).draw(g2d);
}
move();
}
public void move() {
nodes.remove((nodes.size() - 1));
addNode();
}
public synchronized void addNode() {
Node nodeTempNode = nodes.get(0);
//如果方向
switch (dir) {
case InterFace.L:
//判断是否会撞墙
if (nodeTempNode.x = 20) {
nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y);
}
nodes.add(0, new Node(nodeTempNode.x - nodeTempNode.width,
nodeTempNode.y));
break;
case InterFace.R:
//判断是否会撞墙
if (nodeTempNode.x = 20 + 15 * 50 - nodeTempNode.width) {
nodeTempNode = new Node(20 - nodeTempNode.width, nodeTempNode.y);
}
nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width,
nodeTempNode.y));
break;
case InterFace.U:
//判断是否会撞墙
if (nodeTempNode.y = 40) {
nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35);
}
nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y - nodeTempNode.height));
break;
case InterFace.D:
//判断是否会撞墙
if (nodeTempNode.y = 40 + 15 * 35 - nodeTempNode.height) {
nodeTempNode = new Node(nodeTempNode.x,40 - nodeTempNode.height);
}
nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height));
break;
}
}
}
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class SnakeGame{
public static void main(String[] args){
SnakeFrame frame = new SnakeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//----------记录状态的线程
class StatusRunnable implements Runnable{
public StatusRunnable(Snake snake,JLabel statusLabel,JLabel scoreLabel){
this.statusLabel = statusLabel;
this.scoreLabel = scoreLabel;
this.snake = snake;
}
public void run(){
String sta = "";
String spe = "";
while(true){
switch(snake.status){
case Snake.RUNNING:
sta = "Running";break;
case Snake.PAUSED:
sta = "Paused";break;
case Snake.GAMEOVER:
sta = "GameOver";break;
}
statusLabel.setText(sta);
scoreLabel.setText(""+snake.score);
try{
Thread.sleep(100);
}
catch(Exception e){
}
}
}
private JLabel scoreLabel;
private JLabel statusLabel;
private Snake snake;
}
//----------蛇运动以及记录分数的线程
class SnakeRunnable implements Runnable{
public SnakeRunnable(Snake snake,Component component){
this.snake = snake;
this.component = component;
}
public void run(){
while(true){
try{
snake.move();
component.repaint();
Thread.sleep(snake.speed);
}
catch(Exception e){
}
}
}
private Snake snake;
private Component component;
}
class Snake{
boolean isRun;//---------是否运动中
ArrayListNode body;//-----蛇体
Node food;//--------食物
int derection;//--------方向
int score ;
int status;
int speed;
public static final int SLOW = 500;
public static final int MID = 300;
public static final int FAST = 100;
public static final int RUNNING = 1;
public static final int PAUSED = 2;
public static final int GAMEOVER = 3;
public static final int LEFT = 1;
public static final int UP = 2;
public static final int RIGHT = 3;
public static final int DOWN = 4;
public Snake(){
speed = Snake.SLOW;
score = 0;
isRun = false;
status = Snake.PAUSED;
derection = Snake.RIGHT;
body = new ArrayListNode();
body.add(new Node(60,20));
body.add(new Node(40,20));
body.add(new Node(20,20));
makeFood();
}
//------------判断食物是否被蛇吃掉
//-------如果食物在蛇运行方向的正前方,并且与蛇头接触,则被吃掉
private boolean isEaten(){
Node head = body.get(0);
if(derection == Snake.RIGHT (head.x+Node.W) == food.xhead.y == food.y )
return true;
if(derection == Snake.LEFT (head.x-Node.W) == food.xhead.y == food.y )
return true;
if(derection == Snake.UP head.x == food.x(head.y-Node.H) == food.y )
return true;
if(derection == Snake.DOWN head.x == food.x(head.y+Node.H) == food.y )
return true;
else return false;
}
//----------是否碰撞
private boolean isCollsion(){
Node node = body.get(0);
//------------碰壁
if(derection == Snake.RIGHT node.x == 280)
return true;
if(derection == Snake.UP node.y == 0)
return true;
if(derection == Snake.LEFT node.x == 0)
return true;
if(derection == Snake.DOWN node.y == 380)
return true;
//--------------蛇头碰到蛇身
Node temp = null;
int i = 0;
for(i = 3;ibody.size();i++)
{
temp = body.get(i);
if(temp.x == node.x temp.y==node.y)
break;
}
if(i body.size())
return true;
else return false;
}
//-------在随机的地方产生食物
public void makeFood(){
Node node = new Node(0,0);
boolean isInBody = true;
int x = 0,y = 0;
int X = 0,Y = 0;
int i = 0;
while(isInBody){
x = (int)(Math.random()*15);
y = (int)(Math.random()*20);
X = x*Node.W;
Y = y*Node.H;
for(i = 0;i body.size();i ++){
if( X == body.get(i).x Y == body.get(i).y)
break;
}
if(i body.size())
isInBody = true;
else
isInBody = false;
}
food = new Node(X,Y);
}
//---------改变运行方向
public void changeDerection(int newDer){
if(derection%2 != newDer%2)//-------如果与原来方向相同或相反,则无法改变
derection = newDer;
}
public void move(){
if(isEaten()){//-----如果食物被吃掉
body.add(0,food);//--------把食物当成蛇头成为新的蛇体
score += 10;
makeFood();//--------产生食物
}
else if(isCollsion())//---------如果碰壁或自身
{
isRun = false;
status = Snake.GAMEOVER;//-----结束
}
else if(isRun){//----正常运行(不吃食物,不碰壁,不碰自身)
Node node = body.get(0);
int X = node.x;
int Y = node.y;
//------------蛇头按运行方向前进一个单位
switch(derection){
case 1:
X-=Node.W;
break;
case 2:
Y-=Node.H;
break;
case 3:
X+=Node.W;
break;
case 4:
Y+=Node.H;
break;
}
body.add(0,new Node(X,Y));
//---------------去掉蛇尾
body.remove(body.size()-1);
}
}
}
//---------组成蛇身的单位,食物
class Node
{
public static final int W = 20;
public static final int H = 20;
int x;
int y;
public Node(int x,int y){
this.x = x;
this.y = y;
}
}
//------画板
class SnakePanel extends JPanel{
Snake snake;
public SnakePanel(Snake snake){
this.snake = snake;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Node node = null;
for(int i = 0;i snake.body.size();i++){//---红蓝间隔画蛇身
if(i%2 == 0)
g.setColor(Color.blue);
else g.setColor(Color.yellow);
node = snake.body.get(i);
g.fillRect(node.x,node.y,node.H,node.W);//*******************试用*********************
}
node = snake.food;
g.setColor(Color.red);
g.fillRect(node.x,node.y,node.H,node.W);
}
}
class SnakeFrame extends JFrame{
private JLabel statusLabel;
private JLabel speedLabel;
private JLabel scoreLabel;
private JPanel snakePanel;
private Snake snake;
private JMenuBar bar;
JMenu gameMenu;
JMenu helpMenu;
JMenu speedMenu;
JMenuItem newItem;
JMenuItem pauseItem;
JMenuItem beginItem;
JMenuItem helpItem;
JMenuItem aboutItem;
JMenuItem slowItem;
JMenuItem midItem;
JMenuItem fastItem;
public SnakeFrame(){
init();
ActionListener l = new ActionListener(){
public void actionPerformed(ActionEvent e){
if(e.getSource()==pauseItem)
snake.isRun = false;
if(e.getSource()==beginItem)
snake.isRun = true;
if(e.getSource()==newItem)
{ newGame();
}
//------------菜单控制运行速度
if(e.getSource()==slowItem)
{
snake.speed = Snake.SLOW;
speedLabel.setText("Slow");
}
if(e.getSource()==midItem)
{
snake.speed = Snake.MID;
speedLabel.setText("Mid");
}
if(e.getSource()==fastItem)
{
snake.speed = Snake.FAST;
speedLabel.setText("Fast");
}
}
};
pauseItem.addActionListener(l);
beginItem.addActionListener(l);
newItem.addActionListener(l);
aboutItem.addActionListener(l);
slowItem.addActionListener(l);
midItem.addActionListener(l);
fastItem.addActionListener(l);
addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
//------------方向键改变蛇运行方向
case KeyEvent.VK_DOWN://
snake.changeDerection(Snake.DOWN);
break;
case KeyEvent.VK_UP://
snake.changeDerection(Snake.UP);
break;
case KeyEvent.VK_LEFT://
snake.changeDerection(Snake.LEFT);
break;
case KeyEvent.VK_RIGHT://
snake.changeDerection(Snake.RIGHT);
break;
//空格键,游戏暂停或继续
case KeyEvent.VK_SPACE://
if(snake.isRun == true)
{snake.isRun = false;snake.status = Snake.PAUSED;break;}
if(snake.isRun == false)
{snake.isRun = true; snake.status = Snake.RUNNING;break;}
}
}
public void keyReleased(KeyEvent k){
}
public void keyTyped(KeyEvent k){
}
});
}
private void init(){
speedLabel = new JLabel();
snake = new Snake();
setSize(380,460);
setLayout(null);
this.setResizable(false);
bar = new JMenuBar();
gameMenu = new JMenu("Game");
newItem= new JMenuItem("New Game");
gameMenu.add(newItem);
pauseItem = new JMenuItem("Pause");
gameMenu.add(pauseItem);
beginItem = new JMenuItem("Continue");
gameMenu.add(beginItem);
helpMenu = new JMenu("Help");
aboutItem = new JMenuItem("About");
helpMenu.add(aboutItem);
speedMenu = new JMenu("Speed");
slowItem = new JMenuItem("Slow");
fastItem = new JMenuItem("Fast");
midItem = new JMenuItem("Middle");
speedMenu.add(slowItem);
speedMenu.add(midItem);
speedMenu.add(fastItem);
bar.add(gameMenu);
bar.add(helpMenu);
bar.add(speedMenu);
setJMenuBar(bar);
statusLabel = new JLabel();
scoreLabel = new JLabel();
snakePanel = new JPanel();
snakePanel.setBounds(0,0,300,400);
snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
add(snakePanel);
statusLabel.setBounds(300,25,60,20);
add(statusLabel);
scoreLabel.setBounds(300,20,60,20);
add(scoreLabel);
JLabel temp = new JLabel("状态");
temp.setBounds(310,5,60,20);
add(temp);
temp = new JLabel("分数");
temp.setBounds(310,105,60,20);
add(temp);
temp = new JLabel("速度");
temp.setBounds(310,55,60,20);
add(temp);
speedLabel.setBounds(310,75,60,20);
add(speedLabel);
}
private void newGame(){
this.remove(snakePanel);
this.remove(statusLabel);
this.remove(scoreLabel);
speedLabel.setText("Slow");
statusLabel = new JLabel();
scoreLabel = new JLabel();
snakePanel = new JPanel();
snake = new Snake();
snakePanel = new SnakePanel(snake);
snakePanel.setBounds(0,0,300,400);
snakePanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
Runnable r1 = new SnakeRunnable(snake,snakePanel);
Runnable r2 = new StatusRunnable(snake,statusLabel,scoreLabel);
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
add(snakePanel);
statusLabel.setBounds(310,25,60,20);
add(statusLabel);
scoreLabel.setBounds(310,125,60,20);
add(scoreLabel);
}
}
你不是有个temp的标识吗?可以用这个判断撒,记录上一状态。
修改如下:
public void keyPressed(KeyEvent e) {
if (start){
switch (e.getKeyCode()){
case KeyEvent.VK_UP:
if(temp==2) break;
move(0,-1);
temp =1;
break;
case KeyEvent.VK_DOWN:
if(temp==1) break;
move(0,1);
temp =2;
break;
case KeyEvent.VK_LEFT:
if(temp==4) break;
move(-1,0);
temp =3;
break;
case KeyEvent.VK_RIGHT:
if(temp==3) break;
move(1,0);
temp =4;
break;
default:
break;
}
}
}