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

基础知识原理

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. js 数组函数

    Array.prototype.join Array.prototype.reverse Array.prototype.sort Array.prototype.concat Array.proto ...

  2. html5实现的一些效果

    一.网页换肤 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...

  3. pvm虚拟机基本原理

    零.绪论:特别鸣谢下文博客,自己博客是对这篇博客的学习笔记: 大佬webber博客:https://www.cnblogs.com/webber1992/p/6597166.html 一.三种文件: ...

  4. Egret打包App 修改App名称和图标 (Egret4.1.0)

    图标替换位置在项目res下的drawable这些目录下,用新图标覆盖即可. 这里我用白色图片替换了白鹭默认的图片ic_launcher.png 修改App名字,在res->value->s ...

  5. 【BZOJ2217】[Poi2011]Lollipop 乱搞

    [BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...

  6. 微信小程序 --- 设置app.js/page.js参数的方法

    设置 app.js 文件: //app.js App({ globalData: { is_login:false, userInfo:{} } }) 设置gloabalData的方法: // 定义a ...

  7. Dcloud开发-- 打开蓝牙

    这样打开APP就会直接提示是否要打开蓝牙: <script type="text/javascript"> mui.init(); mui.plusReady(func ...

  8. 问答项目---账号密码异步校验后进行PHP校验

    在做登陆的时候,通过异步校验后还需要通过PHP来校验账号和密码的正确性. PHP校验账号密码: public function login(){ if(!IS_POST){echo "页面不 ...

  9. Shell--基础知识

    变量的定义: a=1 b=hello c="hello world !" d='hello "反启" !' e=`ls`  (注意:这是反引号) 备注:=号左右 ...

  10. HDU1573:X问题(解一元线性同余方程组)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1573 题目解析;HDU就是坑,就是因为n,m定义成了__int64就WAY,改成int就A了,无语. 这题 ...