第十三、十四周:按照项目设计,逐步完成各个模块的代码,初步完成项目雏形。

基础知识原理

1.TDD(Test Driven Development, 测试驱动开发),TDD的一般步骤如下:

  • 明确当前要完成的功能,记录成一个测试列表
  • 快速完成编写针对此功能的测试用例
  • 测试代码编译不通过(没产品代码呢)
  • 编写产品代码
  • 测试通过
  • 对代码进行重构,并保证测试通过(重构下次实验练习)
  • 循环完成所有功能的开发

2.测试类具体操作:把鼠标放到项目名上,单击右键,在弹出的菜单中选定New->Source Folder新建一个测试目录test;把鼠标放到test目录上,单击右键,在弹出的菜单中选定New->JUnit Test Case新建一个测试用例类。

重要函数及其代码

1.MainClass函数:继承JFrame类,调用ControlSnake类;定义窗口大小和位置。

package resource;

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")//注释处的所有警告都忽视

public class MainClass extends JFrame {

    ControlSnake control;

    Toolkit kit;//所有实际应用的抽象窗口工具包的父类

    Dimension dimen;//压缩了有整数精确度的组件

    public static void main(String[] args) {

        new MainClass("my snake");

    }

    public MainClass(String s) {

        super(s);

        control = new ControlSnake();//新的ControlSnake类

        control.setFocusable(true);

        kit = Toolkit.getDefaultToolkit();

        dimen = kit.getScreenSize();//获取屏幕尺寸

        add(control);//添加control

        setLayout(new BorderLayout());

        setLocation(dimen.width / 3, dimen.height / 3);// 挪位置,dimen.width/3,dimen.height/3

        setSize(FWIDTH, FHEIGHT);//定格操作窗口大小

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setResizable(false);

        setVisible(true);

    }

    public static final int FWIDTH = 315;

    public static final int FHEIGHT = 380;

}

2.ControlSnake函数:继承JPanel类;定义贪吃蛇的坐标位置和果实坐标位置,定义随机数发生器等;建立主函数接收键盘传入并转换成keyCode,执行对应操作;建立Paint函数构造窗口;建立Action函数进行动画演示(包括调用随机数发生函数产生伪随机序列,确定果实位置)

package resource;

import java.util.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.Timer;

import java.util.Random;

@SuppressWarnings("serial")

public class ControlSnake extends JPanel implements ActionListener {

    //JPanel类用于为小内容提供简单窗口,ActionListener为对象提供添加动作的方法

    Random rand;

    //Random,用48bit的种子产生伪随机序列

    ArrayList<Point> list, listBody;

    //ArrayList<Point>,类似于二维数组,声明了两个泛型对象

    String str, str1;

    static boolean key;

    int x, y, dx, dy, fx, fy, flag;

    int snakeBody;

    //控制蛇的长度

    int speed;

    public ControlSnake()

    {

        snakeBody = 1;

        str = "上下左右方向键控制 P键暂停...";

        str1 = "现在的长度为:" + snakeBody;

        key = true;

        flag = 1;

        speed = 700;

        rand = new Random();//创造一个新的随机数产生器

        list = new ArrayList<Point>();//创造一个初始容量为10的数列

        listBody = new ArrayList<Point>();

        x = 5;

        y = 5;

        list.add(new Point(x, y));//在坐标空间中创建并初始化一个新的点

        listBody.add(list.get(0));//list.get(0),返回在list列中0位置的元素

        dx = 10;

        dy = 0;

        fx = rand.nextInt(30) * 10 + 5;// rand.nextInt(30),返回一个在0——30内的随机数

        fy = rand.nextInt(30) * 10 + 5;// 2

        setBackground(Color.WHITE);//为窗口添加背景色

        setSize(new Dimension(318, 380));//重新定义窗口的高和宽

        final Timer time = new Timer(speed, this);

        time.start();

        //timer类,在指定时间间隔触发一个或多个 ActionEvent

        addKeyListener(new KeyAdapter()

        {

        //KeyAdapter(),用于接收键盘传来的事件的抽象类

            public void keyPressed(KeyEvent e)

            {

                //KeyEvent,使键盘输入转化成对应对象

                if (e.getKeyCode() == 37) {//getKeyCode(),将键盘输入转化成对应的整形键码

                    dx = -10;

                    dy = 0;

                } else if (e.getKeyCode() == 38) {

                    dx = 0;

                    dy = -10;

                } else if (e.getKeyCode() == 39) {

                    dx = 10;

                    dy = 0;

                } else if (e.getKeyCode() == 40) {

                    dx = 0;

                    dy = 10;

                } else if (e.getKeyCode() == 80) {

                    if (flag % 2 == 1) {

                        time.stop();

                    }

                    if (flag % 2 == 0) {

                        time.start();

                    }

                    flag++;

                }

            }

        });

    }

    public void paint(Graphics g) {//Graphics,所有环境算法基础类,允许应用在已有组件上进行绘制

        g.setColor(Color.WHITE);

        g.fillRect(0, 0, 400, 400);//指定一个以setColor返回值为底色的长方形,具体参数为x,y

        g.setColor(Color.DARK_GRAY);

        g.drawLine(3, 3, 305, 3);//在点(3,3)和(305,3)之间用当前色填充一条线

        g.drawLine(3, 3, 3, 305);

        g.drawLine(305, 3, 305, 305);

        g.drawLine(3, 305, 305, 305);

        g.setColor(Color.PINK);

        for (int i = 0; i < listBody.size(); i++) {//listBody.size(),返回当前list的元素个数

            g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9);

        }//控制蛇的长度

        g.fillRect(x, y, 9, 9);//蛇的长度最大为9

        g.setColor(Color.ORANGE);

        g.fillRect(fx, fy, 9, 9);//随机显示果实

        g.setColor(Color.DARK_GRAY);

        str1 = "现在的长度为:" + snakeBody;

        g.drawString(str, 10, 320);//在图形化界面中显示字符串

        g.drawString(str1, 10, 335);

    }

    public void actionPerformed(ActionEvent e) {

        x += dx;

        y += dy;

        if (makeOut() == false) {//见最后的函数,用于排除超出图形界面的不合法输出

            JOptionPane.showMessageDialog(null, "重新开始......");

            //跳出对话框,显示“重新开始”

            speed = 700;

            snakeBody = 1;

            x = 5;

            y = 5;

            list.clear();//清空数列

            list.add(new Point(x, y));//加入新元素

            listBody.clear();

            listBody.add(list.get(0));

            dx = 10;

            dy = 0;

        }

        addPoint(x, y);

        if (x == fx && y == fy) {//即“蛇吃到果实”

            speed = (int) (speed * 0.8);// 速度增加参数

            if (speed < 200) {

                speed = 100;

            }

            fx = rand.nextInt(30) * 10 + 5;// 2

            fy = rand.nextInt(30) * 10 + 5;// 2

            snakeBody++;// 2

        } // 2

        repaint();//重新进行

    }

    public void addPoint(int xx, int yy) {

        // 动态的记录最新发生的50步以内的移动过的坐标

        // 并画出最新的snakeBody

        if (list.size() < 100) {// 蛇身长度最长为100

            list.add(new Point(xx, yy));

        } else {

            list.remove(0);

            list.add(new Point(xx, yy));

        }

        if (snakeBody == 1) {

            listBody.remove(0);

            listBody.add(0, list.get(list.size() - 1));

        } else {

            listBody.clear();

            if (list.size() < snakeBody) {

                for (int i = list.size() - 1; i > 0; i--) {

                    listBody.add(list.get(i));

                }

            } else {

                for (int i = list.size() - 1; listBody.size() < snakeBody; i--) {

                    listBody.add(list.get(i));

                }

            }

        }

    }

    public boolean makeOut() {

        if ((x < 3 || y < 3) || (x > 305 || y > 305)) {

            return false;

        }

        for (int i = 0; i < listBody.size() - 1; i++) {

            for (int j = i + 1; j < listBody.size(); j++) {

                if (listBody.get(i).equals(listBody.get(j))) {

                    return false;

                }

            }

        }

        return true;

    }

}

总结

本周按照项目设计,逐步完成各个模块的代码,初步完成项目雏形。但没有完全编写成功,在下一周还要继续努力。

Javaworkers团队第三周项目总结的更多相关文章

  1. JavaEDU614 团队第三周项目总结

    JavaEDU614 团队第三周项目总结 本周,根据项目计划完成模块的设计代码 本项目主要是完成俄罗斯方块的基本操作.用户可以自己练习和娱乐.需要满足以下几点要求. (1)界面控制游戏开始.暂停和结束 ...

  2. ZLYD团队第三周项目总结

    ZLYD团队第三周项目总结 项目进展 我们的吃豆子游戏的程序由八个文件组成:Wall.java.Gold.java.Player.java.Fruit.java.Enemy.java.Ticker.j ...

  3. Surprise团队第三周项目总结

    Surprise团队第二周项目总结 项目进展 这周我们小组的项目在上周的基础上进行了补充,主要注重在注册登录界面的实现,以及关于数据库的一些学习. 在设计注册登录界面时,每一块的地方控件都不一样,比如 ...

  4. Javaworkers团队第五周项目总结

    本周项目进展 本周是我们项目开发的最后一周,所以接着上周未解决的问题,我们进行了认真的查阅与测试. 下面是我们本周解决的问题概述. 蛇爬行的速度控制 答:这是上周的遗留问题,经过一周的查阅与学习,我们 ...

  5. Cooperation.GTST团队第三周项目总结

    项目进展 这周我们仍然在学习使用博客园的相关接口,页面的一个基本模块已经搭建出来了,但是页面整体效果还没有完全做出来.另外,我们在使用其他的APP时留意到许多APP都使用上拉加载和下拉刷新的效果,所以 ...

  6. “Hello World!”团队第三周召开的第二次会议

    今天是我们团队“Hello World!”团队第三周召开的第二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 ...

  7. “Hello World!”团队第三周召开的第三次会议

    今天是我们团队“Hello World!”团队第三周召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码地址 ...

  8. “Hello World!”团队第三周召开的第一次会议

    今天是我们团队“Hello World!”团队第三周召开的第一次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时间 ...

  9. ZLYD团队第5周项目总结

    ZLYD团队第5周项目总结 项目进展 目前游戏人没有成功运行.初步判断是部分代码有误. 我们采用了两种运行方式,代码未出现明确错误.但问题可能是由于版本问题. 将Wall.java.Gold.java ...

随机推荐

  1. php array key 的存储规则

    刚刚写程序遇到php数组取值的问题,发现字符串和数字取出来的是一样的. key 可以是 integer 或者string.value 可以是任意类型. 此外 key 会有如下的强制转换: 包含有合法整 ...

  2. Python 导入与注册

    背景 最近一直学习写一个POC扫描框架,但是不知道如何下手,正巧因为一些需要有朋友在研究POCSuite的实现原理,顺面蹭一些知识点,补一补Python基础的不足,为以后编写POC框架打地基. 导入 ...

  3. 移动端touch事件滚动

    本来想用在北京欢乐谷手机上用touch事件来模拟局部左右内容滚动里,但在touchmove上下滚动时由于禁止了默认事件而body滚动条不能滚动,虽然可以根据touchmove的坐标来判断方向,但体验效 ...

  4. 【原创】asp.net内部原理(三) 第三个版本 (最详细的版本)

    前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚上我还是坚持打开电脑,分享一些asp.net生命周期的知识, ...

  5. numeric_limits 模板的相关知识点

    说白了,它是一个模板类,它主要是把C++当中的一些内建型别进行了封装,比如说numeric_limits<int>是一个特化后的类,从这个类的成员变量与成员函数中,我们可以了解到int的很 ...

  6. Python 自学积累(二)

    1. onfigParser 模块用于操作配置文件 注:Parser汉译为“解析”之意. 配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数( ...

  7. xp系统报错 windows explorer has encountered a problem and needs to close.We are sorry for the inconvenience

    xp系统遇到问题: 打开某个软件提示报错信息, windows explorer has encountered a problem and needs to close.We are sorry f ...

  8. Online handwriting recognition using multi convolution neural networks

    w可以考虑从计算机的“机械性.重复性”特征去设计“低效的”算法. https://www.codeproject.com/articles/523074/webcontrols/ Online han ...

  9. SVN跨版本库迁移目录并保留提交日志

    现在有一份代码code在版本库reposA/dirB/下,现在想把它移动到reposB/dirAA/下,本来打算交给SA做,没想到SA似乎 也不太懂的样子.于是,自己在VPS搭建了一个svnserve ...

  10. supervisord部署

    https://blog.csdn.net/vbaspdelphi/article/details/54091095https://blog.csdn.net/shudaqi2010/article/ ...