北京电子科技学院(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和重构的过程,测试代码不要少于业务代码,Eclipse中refactor菜单下的重构技能不要少于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/

转载于:https://www.cnblogs.com/lv-20135229/p/4553600.html

Java课程实验报告 实验三 敏捷开发与XP实践相关推荐

  1. 20155229实验三 《Java面向对象程序设计实验三 敏捷开发与XP实践 》实验报告

    实验题目 1.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能. 2.下载搭档实验二的Complex代 ...

  2. 20155220 实验三 敏捷开发与XP实践 实验报告

    20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  3. 20155226 实验三 敏捷开发与XP实践 实验报告

    20155226 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim ...

  4. 20165205 2017-2018-2 《Java程序设计》实验三 敏捷开发与XP实践

    20165205 2017-2018-2 <Java程序设计>实验三 敏捷开发与XP实践 20165205 2017-2018-2 <Java程序设计>实验三 敏捷开发与XP实 ...

  5. 20175212童皓桢 实验三敏捷开发与XP实践实验报告

    20175212童皓桢 实验三敏捷开发与XP实践实验报告 实验内容 XP基础 XP核心实践 相关工具 实验步骤 一.Code菜单功能的研究 Move Line/statement Down/Up:将某 ...

  6. 20155314 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践

    20155314 2016-2017-2 <Java程序设计>实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验知识点总结 (一)敏捷开发与XP 软件工程:把系统 ...

  7. 20175312 2018-2019-2 实验三 敏捷开发与XP实践 实验报告

    20175312 2018-2019-2 实验三 敏捷开发与XP实践 实验报告 码云博客链接 https://gitee.com/dky20175312/dky_20175312_warehouse_ ...

  8. 20155231 实验三 敏捷开发与XP实践

    20155231 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器&g ...

  9. 20145326蔡馨熠 实验三 敏捷开发与XP实践

    20145326蔡馨熠 实验三 "敏捷开发与XP实践" 程序设计过程 一.实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 1.git上传代码 首先我通 ...

  10. 实验三 敏捷开发与XP实践

    目录 实验三 敏捷开发与XP实践-1 实验步骤 实验截图 实验三 敏捷开发与XP实践-2 实验步骤 实验截图 代码链接 实验三 敏捷开发与XP实践-3 实验步骤 实验截图 代码链接 实验三 敏捷开发与 ...

最新文章

  1. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)
  2. 检索数据_13_从表中查询空值
  3. FCN网络的训练——以SIFT-Flow 数据集为例
  4. 踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”
  5. el-table 行背景颜色_使用HTML添加表格4(行颜色与表格嵌套)——零基础自学网页制作
  6. C++获取CPU信息应用经验分享
  7. wcf afterreceiverequest获取body数据_阿里面试官的灵魂拷问:究竟如何保证API接口数据安全?...
  8. yum update upgrade 区别_CentOS与RedHat的区别
  9. 【KG】知识图谱基本概念工程落地常见问题
  10. spring-boot配置文件中server.context-path不起作用
  11. python:查看某个数字类型的信息,比如最大有效值
  12. django-rest-framework二--权限(转载)
  13. 【Python办公自动化】根据excel中数据批量生成word文档(适用劳动合同、质检报告、通知书等应用场景)
  14. 天然气压缩因子计算软件_天然气压缩机组安全阀的设置
  15. 华为路由模拟器3.0参考实验7----直连路由无法ping通解决办法
  16. FYI | Brain-Art Competition 2018 开始投稿了
  17. Linux 磁盘管理 高级篇 -- quota,RAID,LVM
  18. 常见对称加密、解密、破解
  19. 马克飞象怎么转成html,马克飞象教程
  20. 大数据项目之电商分析平台(2)

热门文章

  1. 多任务学习中各loss权重应该如何设计?
  2. js实现电话号码部分隐藏
  3. 什么人合适学习利用自媒体淘客来赚钱
  4. 【强化学习论文合集】三十一.2021智能体和多智能体系统国际联合会议论文(AAMAS2021)
  5. 关于计算机的小故事英语作文,[关于学校的小故事英语作文]关于学校的小故事英语...
  6. 哪些公司用c语言开发工具,哪些IDE和工具可用于C语言开发?
  7. EasyExcel写入excel模板
  8. div+css静态网页设计 web网页设计实例作业 ——茶叶文化-适应响应(12页) 学生HTML个人网页作业作品下载
  9. EOS 智能合约 发行货币
  10. 分辨mqtt在线与离线_最全视频下载方案,100%下载所有在线视频!