2020-12-14

学习目标:

一周内完成用JAVA实现贪吃蛇小游戏

学习内容:

1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握图形界面以及键盘监听
4、 掌握节点的随机生成

学习时间:

1、 周一至周五早 8点30—上午11点30
2、 周日下午 1点30-下午 4 点30


学习产出:

代码:
import javax.swing.;
import java.awt.
;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
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();
iniFood();
initTimer();
setKeyListener();

}

private void iniFood() {
    food=new Node();
    food.random();
}

//设置键盘监听
private void setKeyListener() {
    addKeyListener(new KeyListener() {


        @Override
        public void keyTyped(KeyEvent e) {

        }
        //当键盘按下时会自动调用此方法

        @Override
        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;

           }



        }

        @Override
        public void keyReleased(KeyEvent e) {

        }


    });

}

private void initTimer() {
    timer=new Timer();
    TimerTask timerTask=new TimerTask(){


        @Override
        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(timerTask,0,100);
}

private void initSnake() {
    snake=new Snake();
}

private void initGamePanel() {
    jpanel=new JPanel(){
        public void paint(Graphics g){
            g.clearRect(0,0,600,600);

            //super.paint(g);
            for(int i=0;i<40;i++){
                g.drawLine(0,i*15,600,i*15);
            }
            for(int i=0;i<40;i++){
                g.drawLine(i*15,0,i*15,600);
            }
            //绘制蛇
            LinkedList<Node> body=snake.getBody();
            for(Node node:body){
                g.fillRect(node.getX()*15,node.getY()*15,11,11);
            }
            g.fillRect(food.getX()*15, food.getY()*15,15, 15);




        }
    };
    //把棋盘添加到窗体里
    add(jpanel);

}

private void initFrame() {
    setSize(610,640);
    setLocation(400,400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);


}
public static void main(String[] args){

    new MainFrame().setVisible(true);
}

}public class Snake {
private LinkedList body;
private Direction direction = Direction.LEFT;
private boolean isLiving = true;

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() {
    Node head;
    if (isLiving) {

        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;

            }
        }
        if(isLiving==false){

        }



    }
}


public LinkedList<Node> getBody() {
    return body;
}

public void setBody(LinkedList<Node> body) {
    this.body = body;
}

public Direction getDirection() {
    return direction;
}

public void setDirection(Direction direction) {
    this.direction = direction;
}

//吃食物
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;

    }
}

}
public enum Direction {
UP,DOWN,LEFT,RIGHT
}
public class Node {
private int x;
private int y;
public Node(int x,int y){
this.x=x;
this.y=y;
}

public Node() {

}

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 r=new Random();
    //生成横坐标
    this.x=r.nextInt(40);
    //随机生成纵坐标
    this.y=r.nextInt(40);
}

}
结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值