贪吃蛇游戏源代码

package 贪吃蛇1;
import javax.swing.JFrame;import javax.swing.;import java.awt.;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.LinkedList;import java.util.Timer;import java.util.TimerTask;public class MainFrame extends JFrame{ private Snake snake; private Timer timer;//定时器,在指定的时间调用蛇移动的方法 private JPanel jPanel;//游戏棋盘 private Node food;//食物 public MainFrame() throws HeadlessException{ //初始化窗体参数 initFrame(); //初始化游戏棋盘 initGamePanel(); //初始化蛇 initSnake(); //初始化食物 initFood(); //初始化定时器 initTimer(); //设置键盘监听,让蛇沿着上下左右移动 setKeyListener(); } //初始化食物 private void initFood() { food = new Node(); food.random(); } //设置键盘监听 private void setKeyListener() { addKeyListener(new KeyAdapter() { //当键盘按下时,会自动调用此方法 public void keyPressed(KeyEvent e) { switch(e.getKeyCode()) { case KeyEvent.VK_UP: //修改蛇的运动方向 if(snake.getDirection()!=Direction.DOWN) { snake.setDirection(Direction.UP); } break; case KeyEvent.VK_DOWN: if(snake.getDirection()!=Direction.UP) { snake.setDirection(Direction.DOWN); } break; case KeyEvent.VK_LEFT: if(snake.getDirection()!=Direction.RIGHT) { snake.setDirection(Direction.LEFT); } break; case KeyEvent.VK_RIGHT: if(snake.getDirection()!=Direction.LEFT) { snake.setDirection(Direction.RIGHT); } break; } } }); } //初始化定时器 private void initTimer() { timer=new Timer(); //初始化定时任务 TimerTask timerTsak=new TimerTask() { public void run() { snake.move(); //判断是否和食物重合 Node head=snake.getBody().getFirst(); if(head.getX()==food.getX()&&head.getY()==food.getY()) { snake.eat(food); food.random(); } //重绘游戏棋盘 jPanel.repaint(); } }; //没一百毫秒执行一个定时方法 timer.scheduleAtFixedRate(timerTsak, 0, 100); } private void initSnake() { snake=new Snake(); } public void initGamePanel() { jPanel=new JPanel() { //绘制游戏棋盘中的内容 public void paint(Graphics g) { //Graphics g可以看做是画笔,它提供了很多方法可以绘制一些基本图形 g.clearRect(0, 0, 600, 600); //绘制40条横线 for(int i=0;i<41;i++) { g.drawLine(0, i15, 600, i15); } //绘制40条竖线 for(int i=0;i<40;i++) { g.drawLine(i15, 0, i15, 600); } //绘制蛇 LinkedList body=snake.getBody(); for(Node node:body) { g.fillRect(node.getX()*15, node.getY()*15, 15, 15);//前两个是绘制在某一位置的横纵坐标,后两个是矩形的长和宽 } //绘制食物 g.fillRect(food.getX()*15, food.getY()*15, 15, 15); } }; //把棋盘添加到窗体中 add(jPanel); }public void initFrame(){ setTitle(“贪吃蛇”);//设置标题 setSize(610,640);//设置窗体大小,宽高 setLocation(400,400);//设置窗体位置 setResizable(false);//设置窗体大小不能改变 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }public static void main(String[] args) { //创建窗体对象并显示 new MainFrame().setVisible(true); }}package 贪吃蛇1;//节点类,每一条蛇都是由若干个节点组成的,每一个节点由横纵坐标来确定位置public class Node { private int x; private int y; public Node() { } 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; } //写一个随机生成位置的方法 public void Random() { //创建random对象 java.util.Random r=new java.util.Random(); //随机生成横坐标 this.x=r.nextInt(40); //随机生成纵坐标 this.y=r.nextInt(40); } public void random() { // TODO Auto-generated method stub //创建Random对象 java.util.Random r=new java.util.Random(); //随机生成坐标 this.x=r.nextInt(40); this.y=r.nextInt(40); }}package 贪吃蛇1;import java.util.LinkedList;//表示蛇//一条蛇有多个节点使用LinkedList集合存储Node节点,蛇出生的时候有三个节点public class Snake { private LinkedList body; //蛇的运动方向,默认为左方向 private Direction direction=Direction.LEFT; //蛇是否活着 private boolean isliving=true; //构造方法,在创建Snake 对象是执行 public Snake() { //初始化蛇身 initSnake(); } //初始化蛇身 private void initSnake() { //创建集合 body=new LinkedList<>(); //创建6个节点,添加到集合中 body.add(new Node(16,20)); body.add(new Node(17,20)); body.add(new Node(18,20)); body.add(new Node(19,20)); body.add(new Node(20,20)); body.add(new Node(21,20)); } //蛇会沿着蛇头的方向移动 //在蛇头运动方向创建一个节点,去掉蛇尾的节点 public void move() { if(isliving) { //获取蛇头 Node head=body.getFirst(); switch(direction) { //在蛇头上加节点 case UP: body.addFirst(new Node(head.getX(),head.getY()-1)); break; case DOWN: body.addFirst(new Node(head.getX(),head.getY()+1)); break; case LEFT: body.addFirst(new Node(head.getX()-1,head.getY())); break; case RIGHT: body.addFirst(new Node(head.getX()+1,head.getY())); break; } //删除最后的节点 body.removeLast(); //判断是否撞墙 head=body.getFirst(); if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40) { isliving=false; } //判断蛇是否碰到自己身体 for(int i=1;i<body.size();i++) { Node node =body.get(i); if(head.getX()==node.getX()&&head.getY()==node.getY()) { isliving=false; } } } } public Direction getDirection() { return direction; } public void setDirection(Direction direction) { this.direction = direction; } public LinkedList getBody() { return body; } public void setBody(LinkedList body) { this.body = body; } //创建eat方法,蛇吃食物,沿着蛇头的移动方向添加节点 public void eat(Node food) { //获取蛇头 Node head=body.getFirst(); switch(direction) { //在蛇头上加节点 case UP: body.addFirst(new Node(head.getX(),head.getY()-1)); break; case DOWN: body.addFirst(new Node(head.getX(),head.getY()+1)); break; case LEFT: body.addFirst(new Node(head.getX()-1,head.getY())); break; case RIGHT: body.addFirst(new Node(head.getX()+1,head.getY())); break; } } }package 贪吃蛇1;//枚举:就是几个固定常量,用几个固定的单词表常量public enum Direction { UP,DOWN,LEFT,RIGHT}


版权声明:本文为m0_59503083原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。