码迷,mamicode.com
首页 > 编程语言 > 详细

Java课程实验报告 实验三 敏捷开发与XP实践

时间:2015-06-05 06:18:43      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

北京电子科技学院(BESTI)

             

课程:Java程序设计     班级:1352     姓名:吕松鸿  学号:20135229

成绩:                 指导教师:娄嘉鹏             实验日期:2015.6.3

实验密级:             预习程度:                   实验时间:15:50--20:50

仪器组次:29           必修/选修: 选修             实验序号:03

 

实验内容

1. XP基础

2. XP核心实践

3. 相关工具

 

实验要求

2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)解决办法(空洞的方法如查网络问同学看书等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

3. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

 

实验步骤

(一)敏捷开发与XP

摘要:一项实践在XP环境中成功使用的依据通过XP的法则呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。

学习:XP是一种更加灵活的开发方式和理念,通过迅速的反应及时充分修改程序,保证所有团队成员对资源和责任的共享;适用于“小而精”的团队开发。同时,其所倡导的“倾听”也是实现了程序开发“需求至上”的终极目标。

(二)编码标准

摘要:编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。

操作:

  1. 格式规范——在eclipse中,用source->Format进行格式规范;
  2. 命名规范——包名全部小写,如: awt ;类名第一个字母要大写,如:HelloWorld;

学习:在团队操作中,格式规范是为提高效率扫清障碍的做法;命名规范则具有很强灵活性,根据各团队不同的情况和习惯进行,不仅是方便自己,更是方便团队其他成员。

技术分享

(三)结对编程

摘要:结对编程中的角色分配——驾驶员(控制键盘输入),领航人(起到领航、提醒作用)

(四)版本控制

摘要:版本控制提供项目级的 undo(撤销) 功能;•  版本控制允许多人在同一代码上工作;•   版本控制系统保存了过去所作的修改的历史记录;具体步骤如下——

# 添加修改文件

$ git add 所有修改的文件

# 提交到环境中本地代码仓库

$ git commit -m ‘本次修改的描述‘

# push到git.shiyanlou.com,无需输入密码

$ git push

 

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

(五)重构

摘要:重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更 。重构最主要的目标就是清楚“有臭味道”的代码,主要表现为重复代码

学习:尝试Encapsulate Field功能如下——

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

清除代码重复的重构方法——同一class中重复,则提炼重复;互为兄弟的模块内重复,则提炼到父类中;不同的方法做同样的事,则选择更清晰的算法而将另外的算法清除;

此外,在重构代码后,还有一个必不可少的步骤即进行新一轮的测试,即产品代码仍要通过之前的所有测试。

(六)实践项目

1. 以结对编程的方式编写一个软件,Blog中要给出结对同学的Blog网址,可以拍照展现结对编程情况,可以参考一下其他学校的作业

2.记录TDD和重构的过程,测试代码不要少于业务代码,Eclipserefactor菜单下的重构技能不要少于5

3.团队代码要使用git在实验楼中托管,要使用结对同学中的一个同学的账号托管。

4. 程序要有GUI界面,参考用户界面和用户体验

5.程序功能从豌豆荚游戏中选择一款用Java实现,注意:团队之间项目不能有重复,课代表协调一下。

6.实验报告中统计自己的PSP(Personal Software Process)时间

产品代码及截图如下:

技术分享

技术分享

 

package dj;

import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;


public class mainFrm extends JFrame implements KeyListener, Runnable{
 Button btn_start=new Button();
 int moveDir=0;
 int i=0;
 int x=100;
 int y=400;
 public int dr=1;
 int btm=0;
 int base=200;
 boolean isLive=true;
 JMenuBar mb=new JMenuBar();
 JMenu jm=new JMenu("菜单");
 JMenuItem jm1=new JMenuItem("开始");
 JMenuItem jm2=new JMenuItem("暂停");
 JMenuItem jm3=new JMenuItem("得分记录");
 JMenuItem jm4=new JMenuItem("退出");
 boolean isStart=false;
 Board bd[]=new Board[10];
 JLabel lbl_score=new JLabel("score:");
 JLabel lbl_level=new JLabel("level:");
 int level=1;
 int score=0;

 boolean moveBg=false;
 JLabel lbl_img=new JLabel(new ImageIcon("man.jpg"));
 JLabel lbl_bd1=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd2=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd3=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd4=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd5=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd6=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd7=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd8=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd9=new JLabel(new ImageIcon("board.jpg"));
 JLabel lbl_bd0=new JLabel(new ImageIcon("board.jpg"));
 mainFrm(){
  jm.add(jm1);
  jm.add(jm2);
  //jm.add(jm3);
  jm.add(jm4);
  setJMenuBar(mb);
  mb.add(jm);  
  setTitle("DoodleJump");
  setSize(350,600);
  setLocation(300,100);
  setBackground(Color.white);
  setVisible(true);
  setLayout(null);
  addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);}}); 
  jm3.addActionListener(new ActionListener(){
   public void actionPerformed (ActionEvent e){
   }
  });
  jm4.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    System.exit(0);}});
  jm1.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    isStart=true;}});
  jm2.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) { 
    isStart=false;}});
  lbl_score.setSize(100,30);
  lbl_score.setLocation(250, 0);
  lbl_level.setSize(100,30);
  lbl_level.setLocation(20, 0);
  bd[0]=new Board(100);
  bd[1]=new Board(120);
  bd[2]=new Board(170);
  bd[3]=new Board(230);
  bd[4]=new Board(280);
  bd[5]=new Board(330);
  bd[6]=new Board(370);
  bd[7]=new Board(400);
  bd[8]=new Board(440);
  bd[9]=new Board(480);
  btn_start.setLocation(350, 50);
  btn_start.setSize(100, 30);
  btn_start.addKeyListener(this);
  
  lbl_img.setLocation(0, 0);
  lbl_img.setSize(64, 60);
  
  lbl_bd1.setLocation(bd[1].x, bd[1].y);
  lbl_bd1.setSize(63, 19);
  lbl_bd2.setLocation(bd[2].x, bd[2].y);
  lbl_bd2.setSize(63, 19);
  lbl_bd3.setLocation(bd[3].x, bd[3].y);
  lbl_bd3.setSize(63, 19);
  lbl_bd4.setLocation(bd[4].x, bd[4].y);
  lbl_bd4.setSize(63, 19);
  lbl_bd5.setLocation(bd[5].x, bd[5].y);
  lbl_bd5.setSize(63, 19);
  lbl_bd6.setLocation(bd[6].x, bd[6].y);
  lbl_bd6.setSize(63, 19);
  lbl_bd7.setLocation(bd[7].x, bd[7].y);
  lbl_bd7.setSize(63, 19);
  lbl_bd8.setLocation(bd[8].x, bd[8].y);
  lbl_bd8.setSize(63, 19);
  lbl_bd9.setLocation(bd[9].x, bd[9].y);
  lbl_bd9.setSize(63, 19);
  
  lbl_bd0.setSize(63, 19);
  lbl_bd0.setLocation(bd[0].x, bd[0].y);
 
  add(btn_start);
  addKeyListener(this);
  add(lbl_img);
  add(lbl_bd1);
  add(lbl_bd2);
  add(lbl_bd3);
  add(lbl_bd4);
  add(lbl_bd5);
  add(lbl_bd6);
  add(lbl_bd7);
  add(lbl_bd8);
  add(lbl_bd9);
  add(lbl_bd0);
  add(lbl_score);
  add(lbl_level);
  repaint();
    }


 public static void main(String[] args) {
  mainFrm mf=new mainFrm();
  Thread t1=new Thread(mf);
  t1.start(); 
  
 }

 public int funT(int x){
  return x*x/50;
 }
 int r=1;
 int t=0;
 int bd_base[]=new int[10];
 
 public void run() { 
  for(int i=0;i<10;i++){
   bd_base[i]=bd[i].y;
  }
  int score_dr=10000;
  lbl_level.setText("level:"+level);
  
  while(true){
   if(isStart==true)
   {
   dis();
   ifJump();
   t+=r;
   if(kp==true){//按键则左右移动。
    x+=dr;
   }
   if(x<-30)
    x=300;
   if(x>300)
    x=-30;
   if(moveBg==false){//人物 跳跃
    y=base+funT(t);
    if(score>score_dr){
     level++;
     score_dr+=10000;
     lbl_level.setText("level:"+level);
    }
   }
   else{
    int aaa=200-(200+base-y)-funT(t);
    for(int i=0;i<10;i++){
     bd[i].y=bd_base[i]+aaa;
    score++;
    
    lbl_score.setText("Score:"+score/10);
    }
   }
   ifIsDead();
   lbl_img.setLocation(x, y);//刷新屏幕
   lbl_bd1.setLocation(bd[1].x, bd[1].y);
   lbl_bd2.setLocation(bd[2].x, bd[2].y);
   lbl_bd3.setLocation(bd[3].x, bd[3].y);
   lbl_bd4.setLocation(bd[4].x, bd[4].y);
   lbl_bd5.setLocation(bd[5].x, bd[5].y);
   lbl_bd6.setLocation(bd[6].x, bd[6].y);
   lbl_bd7.setLocation(bd[7].x, bd[7].y);
   lbl_bd8.setLocation(bd[8].x, bd[8].y);
   lbl_bd9.setLocation(bd[9].x, bd[9].y);
   lbl_bd0.setLocation(bd[0].x, bd[0].y);
   
   try {//停顿 20ms
    Thread.sleep(7);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   if(t<=-100){//t小于-100 t++
    r=-r;
    }
   if(t<0)moveDir=0;//t小于 0 跳棋状态 反之 下降状态。
   else {
    moveDir=1;
   }
   if(y<199&&moveDir==0&&moveBg==false){//y小于一定程度的时候背景开始动,任务则在y的位置停止
    moveBg=true;
   }
   else if(t==0&&moveBg==true)
    {
     moveBg=false;
     base=200;
     for(int i=0;i<10;i++){
      bd_base[i]=bd[i].y;
     }
    }
   }
  }
 }

 boolean kp = false;
 boolean isMove = false;
 
 
 public void keyPressed(KeyEvent e) {
  // TODO Auto-generated method stub 
  
  if(isMove==false){
   switch(e.getKeyCode())
   {
    case KeyEvent.VK_LEFT:{
     dr=-2;
       break;
    }
    case KeyEvent.VK_RIGHT:{
     dr=2;
       break;}
    case KeyEvent.VK_UP:{
     if(moveDir==1){
     dr=0;
     t=-100;
     r=-1; 
     btm=base+200-y;
     base=base-btm;
         }
     break;
    }
   }
  }
  kp=true;
  isMove=true;
 }

 public int findMix(){
  int min=bd[0].y;
  for(int i=1;i<10;i++){
   if(bd[i].y<min)
    min=bd[i].y;
  }
  System.out.println(min);
  return min;
 }
 public void dis(){
  for(int i=0;i<10;i++){
   if(bd[i].y>500)
   {
    bd[i].newPosition(findMix()-170-level);
    bd_base[i]=bd[i].y;
    System.out.println("-----------  "+i);
   }
  }
 }
 public void ifIsDead(){
  if(y>600&&isLive==true){
   isStart=false;
   System.out.print("dead");
   isLive=false;
   JOptionPane.showMessageDialog(null,"game over","结束",JOptionPane.ERROR_MESSAGE);
   bd[0]=new Board(100);
   bd[1]=new Board(120);
   bd[2]=new Board(170);
   bd[3]=new Board(230);
   bd[4]=new Board(280);
   bd[5]=new Board(330);
   bd[6]=new Board(370);
   bd[7]=new Board(400);
   bd[8]=new Board(440);
   bd[9]=new Board(480);
   bd[8].x=bd[9].x;
   for(int i=0;i<10;i++){
    bd_base[i]=bd[i].y;
   }
   x=bd[9].x;
   y=400;
   isStart=true;
   isLive=true;
   
  }
 }
 public void ifJump(){
  int width=45;
  int height=10;
  for(int i=0;i<10;i++){
   if(moveDir==1&&(x>bd[i].x-width-5&&x<bd[i].x+width-10&&y>bd[i].y-height-40&&y<bd[i].y+height-40)){
    moveDir=0;
    t=-100;
    r=1; 
    btm=base+200-y;
    base=base-btm;
   }
  }
 }
 
 public void keyReleased(KeyEvent e) {
  // TODO Auto-generated method stub
 // System.out.println(e.getKeyChar());    
  kp = false; 
  isMove=false;
  
 }
 @Override
 public void keyTyped(KeyEvent e) {
  // TODO Auto-generated method stub   
 }
}

游戏运行结果截图如下图:

技术分享

技术分享

PSP时间统计

步骤

耗时

百分比

需求分析

25min

8.2%

设计

80min

26.2%

代码实现

120min

39.3%

测试

50min

18%

分析总结

25min

8.2%

7.实验总结

本次实验较为复杂,考察动手能力、查阅资料能力、知识掌握程度等多方面内容。通过团队合作,我们不仅对游戏开发有了更深刻的认识,更对XP这一思想有了初步掌握,并且复习了TDD等内容。在研究代码的过程中,我对git的应用理解加深,熟练掌握这个工具后,对我们日后的编程学习大有裨益。同时,我们需要继续深入学习有关java开发的知识,不能仅仅满足于书本,也不能仅仅满足于看懂代码,更重要的是亲手编写代码,在亲身实践中收获更多。

结对同学blog地址:http://www.cnblogs.com/20135237zero/

Java课程实验报告 实验三 敏捷开发与XP实践

标签:

原文地址:http://www.cnblogs.com/lv-20135229/p/4553600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!