欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java贪吃蛇游戏代码,java贪吃蛇代码,思路 :主要是模拟蛇的

来源: javaer 分享于  点击 49074 次 点评:156

java贪吃蛇游戏代码,java贪吃蛇代码,思路 :主要是模拟蛇的


思路 :主要是模拟蛇的运动。只要对蛇头进行操作,然后让前一种状态先的蛇头位置复制给现在蛇身的第二个部分,让前一状态的蛇的第二个部分的位置复制给现在蛇身的第三个部分......以此类推,从而达到模拟蛇运动的状态。

GluttonousSnake.java```java//贪吃蛇图形界面
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class GluttonousSnake extends JFrame implements ActionListener {
private JButton upButton, downButton, leftButton, rightButton;//控制方向按钮
private JTextField score;//分数
private SnakeCanvas snake;//蛇的模型

public GluttonousSnake() {      super("贪吃蛇");//设置标题      this.setSize(725, 515);//设置大小      this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置退出按键      this.setLocationRelativeTo(null);//设置窗口居中      JPanel p = new JPanel();//控制按钮和显示分数面板      p.setBorder(new TitledBorder("控制和显示区"));//设置这个面板的标题      this.getContentPane().add(p, "East");//设置此面板的位置      p.setLayout(new GridLayout(4, 1));//设置此面板的布局方式,为网格布局方式      JPanel p2 = new JPanel();//在此面板中添加显示分数的面板      p2.setLayout(new FlowLayout());//设置为流布局方式      p2.add(new JLabel("得分:"));      score = new JTextField("0");      score.setEditable(false);      p2.add(score);      p.add(p2);      //添加按钮,有图片的并添加事件监听      upButton = new JButton("", new ImageIcon("up.png"));      upButton.setActionCommand("up");      upButton.addActionListener(this);      downButton = new JButton("", new ImageIcon("down.png"));      downButton.setActionCommand("down");      downButton.addActionListener(this);      leftButton = new JButton("", new ImageIcon("left.png"));      leftButton.setActionCommand("left");      leftButton.addActionListener(this);      rightButton = new JButton("", new ImageIcon("right.png"));      rightButton.setActionCommand("right");      rightButton.addActionListener(this);      p.add(upButton);      JPanel p1 = new JPanel();      p1.setLayout(new GridLayout(1, 2));      p1.add(leftButton);      p1.add(rightButton);      p.add(p1);      p.add(downButton);    addMenu();//添加菜单      start();      this.setResizable(false);      this.setVisible(true);}private void start() {      snake = new SnakeCanvas();      this.getContentPane().add(snake);  }private void addMenu() {      JMenuBar menubar = new JMenuBar();      this.setJMenuBar(menubar);      JMenu game = new JMenu("游戏");      JMenu help = new JMenu("帮助");      JMenuItem jitemNew = new JMenuItem("新游戏");      jitemNew.setActionCommand("new");      jitemNew.addActionListener(this);      JMenuItem jitemPause = new JMenuItem("暂停");      jitemPause.setActionCommand("pause");      jitemPause.addActionListener(this);      JMenuItem jitemExit = new JMenuItem("退出");      jitemExit.setActionCommand("exit");      jitemExit.addActionListener(this);      game.add(jitemNew);      game.add(jitemPause);      game.addSeparator();//菜单里设置分隔线      game.add(jitemExit);      menubar.add(game);      menubar.add(help);  }public static void main(String[] args) {      new GluttonousSnake();  }public void actionPerformed(ActionEvent e) {      if (e.getActionCommand().equalsIgnoreCase("exit")) {          System.exit(EXIT_ON_CLOSE);      }      if (e.getSource() instanceof JButton) {          if (e.getActionCommand().equalsIgnoreCase("up")) {//响应向上按钮按下事件              snake.setDirect(1);//设置蛇头运动方向              snake.repaint();//对蛇模型重新画              snake.timer.start();//定时器开始              return;          }          if (e.getActionCommand().equalsIgnoreCase("down")) {              snake.setDirect(2);              snake.repaint();              snake.timer.start();              return;          }          if (e.getActionCommand().equalsIgnoreCase("left")) {              snake.setDirect(3);              snake.repaint();              snake.timer.start();              return;          }          if (e.getActionCommand().equalsIgnoreCase("right")) {              snake.setDirect(4);              snake.repaint();              snake.timer.start();              return;          }      }      if (e.getSource() instanceof JMenuItem) {          if (e.getActionCommand().equalsIgnoreCase("new")) {              //this.getContentPane().remove(snake);              snake.init();              snake.repaint();              snake.timer.start();          }          if (e.getActionCommand().equalsIgnoreCase("pause")) {              snake.timer.stop();              JOptionPane.showMessageDialog(this, "继续请按“确定”");              snake.timer.start();          }      }  }

}

MapCanvas.java```javaimport java.awt.Canvas;  import java.awt.Color;  import java.awt.Graphics;  //蛇运行的地图  public class MapCanvas extends Canvas{      public void paint(Graphics g) {          g.setColor(Color.red);          for(int i=30;i<=450;i+=30){              g.drawLine(0,i,450,i);          }          for(int i=30;i<=450;i+=30){              g.drawLine(i,0,i,450);          }          g.drawLine(0, 0, 450, 0);          g.drawLine(0, 450, 450, 450);          g.drawLine(0, 0, 0, 450);          g.drawLine(450, 0, 450, 450);      }  }  

SnakeCanvas.java```javaimport java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JOptionPane;
import javax.swing.Timer;
//蛇模型
public class SnakeCanvas extends MapCanvas implements ActionListener {
private int number = 5;//蛇身的初始长度
public Timer timer;//定时器
private Body[] bodys;//蛇身
private Body food;//食物
public int score=0;//分数
private int speed=250;//定时器延时事件
int direct = 3;//蛇头初始方向
private int[][] mapflag = new int[455][455];//地图标记
//初始化
public void init(){
this.direct=3;
this.number=5;
this.bodys = new Body[this.number];
mapflag = new int[455][455];
for (int i = 0, x = 300; i < this.number; i++, x += 30) {
bodys[i] = new Body(x, 180);
mapflag[bodys[i].x][bodys[i].y] = 2;//如果是蛇体 设标记为2
}
food = creatFood();//创建食物

}  public SnakeCanvas() {      init();      timer = new Timer(speed, this);//创建定时器对象      timer.start();//定时器启动  }private class Body {//蛇头成员      int x, y;    Body(int x, int y) {          this.x = x;          this.y = y;      }  }public void paint(Graphics g) {//画图      super.paint(g);      if(bodys==null){          return ;      }      for (int i = 0; i < this.number; i++) {          if(i==0){//设置蛇头颜色不同              g.setColor(Color.blue);          }else{              g.setColor(Color.black);          }          mapflag[bodys[i].x][bodys[i].y] = 2;          g.fillOval(bodys[i].x, bodys[i].y, 30, 30);//画蛇体      }    g.setColor(Color.red);      g.fillOval(food.x, food.y, 30, 30);//画食物  }public Body creatFood() {      int x = 0, y = 0;      do {//随机生成食物位置        Random r = new Random();//创建随机数对象          x = r.nextInt(450);//在0到所给的数中随机产生一个伪随机数          y = r.nextInt(450);          //System.out.println(mapflag[x][y]+"!");      } while (x % 30 != 0 || y % 30 != 0 ||  mapflag[x][y]==2 );//保证位置不是蛇身的部分,并且确保整齐性      //System.out.println(x + " " + y);      mapflag[x][y] = 1;//将食物标记为1,下面就可以通过标记的不同来判断是吃到食物还是自身,从而进行不同的操作      return new Body(x, y);  }public void actionPerformed(ActionEvent e) {      if(bodys==null){          return ;      }      if(!isMove()){//如果移动失败,游戏结束          JOptionPane.showMessageDialog(this, "Game Over !");          bodys=null;          timer.stop();          return ;      }      repaint();  }  //蛇移动,原理:仅需对蛇头进行操作,然后将蛇头之前的位置赋值给现在蛇身的第二个部分,  //让之前的第二个部分复制个现在的第三个部分。。。。以此类推,模拟蛇运动(这是关键)  public void move(int x,int y) {      Body[] b=new Body[bodys.length];      for(int i=0;i<this.number;i++){          b[i]=new Body(bodys[i].x,bodys[i].y);      }      this.bodys[0].x=x;      this.bodys[0].y=y;      for(int i=1;i<this.number;i++){          this.bodys[i]=b[i-1];      }      setMapflag();}private void setMapflag() {//地图标记的刷新      mapflag=new int[455][455];      mapflag[food.x][food.y]=1;      for(int i=0;i<this.number;i++){          mapflag[bodys[i].x][bodys[i].y]=2;      }  }  //判断是否移动成功  public boolean isMove() {      if(bodys==null){          return false;      }      int x=bodys[0].x;      int y=bodys[0].y;      switch (this.direct) {//通过方向的不同对蛇头进行不同的操作      case 1:          y -= 30;          break;      case 2:          y += 30;          break;      case 3:          x -= 30;          break;      case 4:          x += 30;          break;      }      if(x<0||y>=450||x>=450||y<0){//越界问题          return false;      }      if(mapflag[x][y]==1){//标记为1 ,则为蛇头,要添加蛇身长度          this.number++;          addSnake(x,y);//添加蛇长

// System.out.println("*");
return true;
}else if(mapflag[x][y]==2){//标记为2,则为蛇体,即自己吃到自己,游戏结束
// System.out.println("^");
return false;
}else{
// System.out.println("%");
move(x,y);
return true;
}
}
//添加蛇身,类似move();
private void addSnake(int x, int y) {
this.score++;
Body[] b=new Body[bodys.length];
for(int i=0;i<this.number-1;i++){
b[i]=new Body(bodys[i].x,bodys[i].y);
}
bodys=new Body[this.number];
this.bodys[0]=new Body(x,y);
for(int i=1;i<this.number;i++){
this.bodys[i]=b[i-1];
}
setMapflag();
food = creatFood();
}

public void setDirect(int i) {//设置蛇头方向      this.direct = i;  }

}
```来自:http://blog.csdn.net/u011479875/article/details/46355905

相关栏目:

用户点评