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

基础知识原理

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. MQTT协议笔记之订阅

    前言 记忆不太好的时候,只能翻看以前的文章/笔记重新温习一遍,但找不到MQTT协议有关订阅部分的描述,好不容易从Evernote中找到贴出来,这样整个MQTT协议笔记,就比较齐全了. SUBSCRIB ...

  2. Android内存优化总结【整理】

    http://blog.csdn.net/tiantangrenjian/article/details/39182293 [前段时间接到任务着手进行app的内存优化,从各种各样的渠道搜索相关资料,最 ...

  3. 删除lv

    author: headsen  chen date: 2018-09-12  11:52:02 [root@sz02 ~]# umount /var/lib/docker [root@sz02 ~] ...

  4. 【BZOJ4101】[Usaco2015 Open]Trapped in the Haybales Silver 二分

    [BZOJ4101][Usaco2015 Open]Trapped in the Haybales (Silver) Description Farmer John has received a sh ...

  5. 【Android】Android Theme的设置

    在AndroidManifest.xml文件中,可以对每一个Activity设置android:theme theme的设置 可以设置为系统自带的格式,也可以自定义格式. A: 系统自带格式 @and ...

  6. mysql 5.7如何添加用户

    MySQL5.7 添加用户.删除用户与授权  转自:https://www.cnblogs.com/xujishou/p/6306765.html mysql -uroot -proot MySQL5 ...

  7. 有限制的最短路spfa+优先队列

    poj1724 ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10751   Accepted: 3952 De ...

  8. [Android Tips] 32. 解决 Android Device Monitor 在 Mac OS X 卡住

    Alternatively you can keep latest jdk and update swt used by monitor: get updated swt: https://www.e ...

  9. Nexus私有仓库简介

    1.    Nexus中的仓库 1.1  类型介绍 登陆Nexus,在左边菜单栏里选择Repositories,然后会出现右边的画面,右边上半部分是列出来的repository,黑体字是类型为grou ...

  10. HDU 6016 Count the Sheep

    Count the Sheep Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...