• 在线客服

  • 扫描二维码
    下载博学谷APP

  • 扫描二维码
    关注博学谷微信公众号

  • 意见反馈

原创 Java课程设计贪吃蛇讲解

发布时间:2019-08-30 19:22:50 浏览 5183 来源:博学谷资讯 作者:照照

    Java课程设计是必不可少的一个重要学习环节,Java程序设计的目的就是加深Java学习者对Java理论基础内容的理解和掌握。今天我们要讲的Java课程设计就是贪吃蛇的小程序设计,以下是具体讲解:

     

    Java课程设计贪吃蛇

     

    1、执行程序:程序启动的入口

     

    package cn.hncu;

     

    public?class?GreedySnake {

     

    public static void main(String[] args) {

     

    Model model=new Model(80,?50);

     

    Control control=new Control(model);

     

    View view=new View(model,control);
     

     

    model.addObserver(view);

     

    (new Thread(model)).start();

     

    }

     

    }

     

    控制类:主要进行键盘的按键收集和传递

     

    package cn.hncu;  

     

    import java.awt.event.KeyEvent;

     

    import java.awt.event.KeyListener;

     

    public class Control implements KeyListener{

     

    Model model;

     

    public Control(Model?model){

     

    this.model=model;

     

    }

     

    public void keyPressed(KeyEvent?e){

     

    //此方法收集按键

     

    int key=e.getKeyCode();

     

    if (model.running) {

     

    switch (key) {

     

    case KeyEvent.VK_UP:

     

    model.changeDirection(model.up);

     

    break;

     

    case KeyEvent.VK_DOWN:

     

    model.changeDirection(model.down);

     

    break;

     

    case KeyEvent.VK_LEFT:

     

    model.changeDirection(model.left);

     

    break;

     

    case KeyEvent.VK_RIGHT:

     

    model.changeDirection(model.right);

     

    break;

     

    default:

     

    break;

     

    }

     

    }

     

    if (key==KeyEvent.VK_ENTER) {

     

    model.reset();

     

    }

     

    }

     

    public void keyReleased(KeyEvent?e) {

     

    }

     

    public void keyTyped(KeyEvent e) {

     

    }

     

    }

     

    模型类:创建蛇身和蛇的运动方式的实现,用到了线程

     

    import java.util.Arrays;

     

    import java.util.LinkedList;

     

    import java.util.Observable;

     

    import java.util.Random;

     

    import javax.swing.JOptionPane;

     

    public class Model extends Observable implements Runnable{

     

    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?boolean?coordinate[][];//用这个来当做界面的坐标

     

    public?LinkedList?node=new?LinkedList();

     

    public?int?direction=2;

     

    boolean?running=false;

     

    public?int?maxX,maxY;

     

    Node?food;

     

    public?int?sleeptime=200;

     

    public?Model(int?maxX,int?maxY){

     

    this.maxX=maxX;

     

    this.maxY=maxY;

     

    reset();

     

    }

     

    public?void?reset()?{

     

    direction=this.up;

     

    sleeptime=200;

     

    coordinate=new?boolean[maxX][];

     

    for?(int?i?=?0;?i?<?maxX;?i++)?{

     

    coordinate[i]=new?boolean[maxY];

     

    Arrays.fill(coordinate[i],?false);

     

    }

     

    //initialize?the?Snake'body

     

    int?initlenght=10;

     

    node.clear();

     

    for?(int?j?=?0;?j?<?initlenght;?j++)?{

     

    int?x=maxX/2+j;

     

    int?y=maxY/2;

     

    node.addLast(new?Node(x,y));

     

    coordinate[x][y]=true;

     

    }

     

    food=createFood();

     

    coordinate[food.x][food.y]=true;

     

    }

     

    public?boolean?move(){

     

    Node?n=(Node)node.getFirst();

     

    int?x=n.x;

     

    int?y=n.y;

     

    switch?(direction)?{

     

    case?up:

     

    y--;

     

    break;

     

    case?down:

     

    y++;

     

    break;

     

    case?left:

     

    x--;

     

    break;

     

    case?right:

     

    x++;

     

    break;

     

    default:

     

    break;

     

    }

     

    if?((x>=0&&x<maxX)&&(y>=0&&y<maxY))?{

     

    if?(coordinate[x][y])?{

     

    if?(x==food.x&&y==food.y)?{

     

    node.addFirst(food);

     

    if?(sleeptime>35)?{

     

    sleeptime-=20;

     

    }

     

    food=createFood();

     

    coordinate[food.x][food.y]=true;

     

    return?true;

     

    }else?{

     

    return?false;

     

    }

     

    }else?{

     

    node.addFirst(new?Node(x,y));

     

    coordinate[x][y]=true;

     

    n=(Node)node.getLast();

     

    node.removeLast();

     

    coordinate[n.x][n.y]=false;

     

    return?true;

     

    }

     

    }

     

    return?false;

     

    }

     

    public?void?changeDirection(int?newdir){

     

    if?(direction!=newdir)?{

     

    direction=newdir;

     

    }

     

    }

     

    public?Node?createFood()?{

     

    int?x=0,y=0;

     

    do?{

     

    Random?r?=?new?Random();

     

    x?=?r.nextInt(maxX);

     

    y?=?r.nextInt(maxY);

     

    }?while?(coordinate[x][y]);

     

    return?new?Node(x,?y);

     

    }

     

    public?void?run()?{

     

    running=true;

     

    while(running){

     

    try?{

     

    Thread.sleep(sleeptime);

     

    }?catch?(Exception?e)?{

     

    break;

     

    }

     

    if?(move())?{

     

    setChanged();

     

    notifyObservers();

     

    }else?{

     

    JOptionPane.showMessageDialog(null,?"Game?Over");

     

    break;

     

    }

     

    }

     

    }

     

    }

     

    class?Node{//创建蛇身

     

    public?int?x,y;

     

    public?Node(int?x,int?y){

     

    this.x=x;

     

    this.y=y;

     

    }

     

    }

     

    界面层:展现给用户看的,用图形界面展现蛇的运动

     

    [java]?view plain?copy

     

    import?java.awt.BorderLayout;

     

    import?java.awt.Canvas;

     

    import?java.awt.Color;

     

    import?java.awt.Container;

     

    import?java.awt.Graphics;

     

    import?java.util.Iterator;

     

    import?java.util.LinkedList;

     

    import?java.util.Observable;

     

    import?java.util.Observer;

     

    import?javax.swing.JFrame;

     

    import?javax.swing.JLabel;

     

    import?javax.swing.JPanel;

     

    public?class?View?extends?JFrame?implements?Observer{

     

    Control?control;

     

    Model?model;

     

    Canvas?canvas;

     

    public?static?final?int?canvasWidth=800,canvasHeight=500;

     

    public?static?final?int?nodeWidth=10,nodeHeight=10;

     

    public?View(Model?model,Control?control){

     

    super("GreedySnake");

     

    this.control=control;

     

    this.model=model;

     

    this.setLocation(400,?300);

     

    this.setResizable(false);

     

    this.setDefaultCloseOperation(EXIT_ON_CLOSE);

     

    canvas=new?Canvas();

     

    canvas.setSize(canvasWidth+1,?canvasHeight+1);

     

    canvas.addKeyListener(control);

     

    this.add(canvas,BorderLayout.NORTH);

     

    JPanel?panel=new?JPanel();

     

    this.add(panel,BorderLayout.SOUTH);

     

    JLabel?label=new?JLabel("Enter?for?restart");

     

    panel.add(label);

     

    this.pack();

     

    this.addKeyListener(control);??

     

    this.setVisible(true);

     

    }

     

    public?void?repaint()?{

     

    Graphics?g=canvas.getGraphics();

     

    //    draw?background

     

    g.setColor(Color.white);

     

    g.fillRect(0,?0,?canvasWidth,?canvasHeight);

     

    //      draw snake

     

    g.setColor(Color.red);

     

    LinkedList?node=model.node;

     

    Iterator?it=node.iterator();

     

    while(it.hasNext()){

     

    Node?n=(Node)it.next();

     

    drawNode(g,n);

     

    }

     

    //        draw food

     

    g.setColor(Color.black);

     

    Node?n=model.food;

     

    drawNode(g,n);

     

    }

     

    private?void?drawNode(Graphics?g,?Node?n)?{

     

    g.fillOval(n.x*nodeWidth,?n.y*nodeHeight,?nodeWidth,?nodeHeight);

     

    }

     

    public?void?update(Observable?o,?Object?arg){

     

    repaint();

     

    }

     

     

    以上就是Java课程设计贪吃蛇的全部详细讲解。大家应该都能看明白吧,还有什么不懂的,可以上博学谷在线学习。

    申请免费试学名额    

在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!

上一篇: Java课程设计参考文献推荐名单 下一篇: Java教程视频培训哪个好?零基础可以学吗?

相关推荐 更多

热门文章

  • 前端是什么
  • 前端开发的工作职责
  • 前端开发需要会什么?先掌握这三大核心关键技术
  • 前端开发的工作方向有哪些?
  • 简历加分-4步写出HR想要的简历
  • 程序员如何突击面试?两大招带你拿下面试官
  • 程序员面试技巧
  • 架构师的厉害之处竟然是这……
  • 架构师书籍推荐
  • 懂了这些,才能成为架构师
  • 查看更多

扫描二维码,了解更多信息

博学谷二维码