Javaworkers团队第三周项目总结
第十三、十四周:按照项目设计,逐步完成各个模块的代码,初步完成项目雏形。
基础知识原理
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团队第三周项目总结的更多相关文章
- JavaEDU614 团队第三周项目总结
		JavaEDU614 团队第三周项目总结 本周,根据项目计划完成模块的设计代码 本项目主要是完成俄罗斯方块的基本操作.用户可以自己练习和娱乐.需要满足以下几点要求. (1)界面控制游戏开始.暂停和结束 ... 
- ZLYD团队第三周项目总结
		ZLYD团队第三周项目总结 项目进展 我们的吃豆子游戏的程序由八个文件组成:Wall.java.Gold.java.Player.java.Fruit.java.Enemy.java.Ticker.j ... 
- Surprise团队第三周项目总结
		Surprise团队第二周项目总结 项目进展 这周我们小组的项目在上周的基础上进行了补充,主要注重在注册登录界面的实现,以及关于数据库的一些学习. 在设计注册登录界面时,每一块的地方控件都不一样,比如 ... 
- Javaworkers团队第五周项目总结
		本周项目进展 本周是我们项目开发的最后一周,所以接着上周未解决的问题,我们进行了认真的查阅与测试. 下面是我们本周解决的问题概述. 蛇爬行的速度控制 答:这是上周的遗留问题,经过一周的查阅与学习,我们 ... 
- Cooperation.GTST团队第三周项目总结
		项目进展 这周我们仍然在学习使用博客园的相关接口,页面的一个基本模块已经搭建出来了,但是页面整体效果还没有完全做出来.另外,我们在使用其他的APP时留意到许多APP都使用上拉加载和下拉刷新的效果,所以 ... 
- “Hello World!”团队第三周召开的第二次会议
		今天是我们团队“Hello World!”团队第三周召开的第二次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 一.会议时间 ... 
- “Hello World!”团队第三周召开的第三次会议
		今天是我们团队“Hello World!”团队第三周召开的第三次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码地址 ... 
- “Hello World!”团队第三周召开的第一次会议
		今天是我们团队“Hello World!”团队第三周召开的第一次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时间 ... 
- ZLYD团队第5周项目总结
		ZLYD团队第5周项目总结 项目进展 目前游戏人没有成功运行.初步判断是部分代码有误. 我们采用了两种运行方式,代码未出现明确错误.但问题可能是由于版本问题. 将Wall.java.Gold.java ... 
随机推荐
- c++11实现optional
			optional< T> c++14中将包含一个std::optional类,optional< T>内部存储空间可能存储了T类型的值也可能没有存储T类型的值.当optiona ... 
- jquery中的each
			$.each(Array, function(i, value) { this; //this指向当前元素 i; ... 
- Ubuntu16.04安装Nessus和MSF
			一.Nessus篇: 1.参考文献:https://www.cnblogs.com/shamojituan/p/6511208.html 2.下载地址:https://downloads.nessus ... 
- Microsoft Web Application Stress Tool 使用
			为了测试数据的准备性,首先需要删除缓存和Cookies等临时文件.启动IE后打开“工具”菜单下的“Internet”选项命令,在打开的“Internet选项”窗口的“常规”选项卡中,单击“Intern ... 
- 【BZOJ1045】[HAOI2008] 糖果传递 贪心
			[BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正 ... 
- iOS CoreMotion 纪录步数
			- (void)startUpdateAccelerometer{ /* 设置采样的频率,单位是秒 */ NSTimeInterval updateInterval = 0.05; // ... 
- MariaDB快速选择最适合您的需要的存储引擎
			1.Xtradb和InnoDB是一个很好的通用事物存储引擎.通常不确定选用何种存储引擎时,Xtradb和InnoDB是最佳的选择. 2.MyISAM和Aria,占用空间小,系统之间容易复制.MyISA ... 
- SpringMVC中使用@ResponseBody注解将任意POJO对象返回值转换成json进行返回
			@ResponseBody 作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区. ... 
- SQL Server使用 LEFT JOIN ON LIKE进行数据关联查询
			这是来新公司写的第一篇文章,使用LEFT JOIN ON LIKE处理一下这种问题: SQL视图代码如下: CREATE View [dbo].[VI_SearchCN] AS --搜索产品的文件 ( ... 
- Maven搭建Nexus私有仓库
			下载压缩包nexus-2.13.0-01-bundle.tar.gz 解压后有两个目录 进入程序目录启动 ./nexus start 启动告警(确认用root启动把以下加入到环境变量) export ... 
