标签:
北京电子科技学院(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是一种更加灵活的开发方式和理念,通过迅速的反应及时充分修改程序,保证所有团队成员对资源和责任的共享;适用于“小而精”的团队开发。同时,其所倡导的“倾听”也是实现了程序开发“需求至上”的终极目标。
(二)编码标准
摘要:编程标准包含:具有说明性的名字、清晰的表达式、直截了当的控制流、可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性。
操作:
学习:在团队操作中,格式规范是为提高效率扫清障碍的做法;命名规范则具有很强灵活性,根据各团队不同的情况和习惯进行,不仅是方便自己,更是方便团队其他成员。
(三)结对编程
摘要:结对编程中的角色分配——驾驶员(控制键盘输入),领航人(起到领航、提醒作用)
(四)版本控制
摘要:版本控制提供项目级的 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/
标签:
原文地址:http://www.cnblogs.com/lv-20135229/p/4553600.html