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);//添加controlsetLayout(new BorderLayout());setLocation(dimen.width / 3, dimen.height / 3);// 挪位置,dimen.width/3,dimen.height/3setSize(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 list, listBody;//ArrayList,类似于二维数组,声明了两个泛型对象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();//创造一个初始容量为10的数列listBody = new ArrayList();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;// 2setBackground(Color.WHITE);//为窗口添加背景色setSize(new Dimension(318, 380));//重新定义窗口的高和宽final Timer time = new Timer(speed, this);time.start();//timer类,在指定时间间隔触发一个或多个 ActionEventaddKeyListener(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,yg.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);//蛇的长度最大为9g.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;// 2fy = rand.nextInt(30) * 10 + 5;// 2snakeBody++;// 2} // 2repaint();//重新进行}public void addPoint(int xx, int yy) {// 动态的记录最新发生的50步以内的移动过的坐标// 并画出最新的snakeBodyif (list.size() < 100) {// 蛇身长度最长为100list.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;}} 总结
本周按照项目设计,逐步完成各个模块的代码,初步完成项目雏形。但没有完全编写成功,在下一周还要继续努力。
转载于:https://www.cnblogs.com/is145251/p/5540314.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
