第三次实验

北京电子科技学院(BESTI)

              

课程:Java程序设计   班级:1352       姓名:胡御风  学号:20135222

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

实验密级:         预习程度:             实验时间:

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

实验名称:                敏捷开发与XP实践

实验目的与要求:

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

实验仪器:


名称


型号


数量


Pc


1

重构:

一、一个完整的重构流程包括:

  1. 从版本控制系统代码库中Check out code
  2. 读懂代码(包括测试代码)
  3. 发现bad smell
  4. Refactoring
  5. 运行所有的Unit Tests
  6. 往代码库中Check in code

二、重构技能

三、何时需要重构

四、举例:

rename

move

TDD测试:

游戏: TankGame

游戏描述:控制己方tank击杀敌方坦克。方向键控制移动,ctrl发射子弹,shift发射超级子弹,F1复活。

代码如下:

package MyFrame;

import java.awt.Color;

public class Constant {
public static final int FX=400;
public static final int FY=100;
public static final int FWID=800;
public static final int FHEI=600;
public static final int TW=30;
public static final int TH=30;
public static final Color BACK=new Color(0,0,255);
public static final int TSPEED=7;
public static final int MissileW=10;
public static final int MissileH=10;
public static final int MSPEED=10;
public static final int WW=50;
public static final int WH=300;
}

package MyFrame;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

import Mygame.Explode;
import Mygame.Missile;
import Mygame.Tank;
import Mygame.Tank.Direction;
import Mygame.greatWall;

public class MyFrame extends Frame {
public Tank t1 = new Tank(Constant.FWID - Constant.TW, Constant.FHEI
- Constant.TH, true, Direction.STOP, this);
public List<Missile> missiles = new ArrayList<Missile>();
public List<Tank> enemyTanks = new ArrayList<Tank>();
public List<Explode> bongs = new ArrayList<Explode>();
public greatWall gw = new greatWall(500, 300);
public static int EnemyCount = 10;
public static int Times = 0;
Image offScreenImage = null;

public void launchFrame() {
addEmpty();
setTitle("TankWar");
setBounds(Constant.FX, Constant.FY, Constant.FWID, Constant.FHEI);
setVisible(true);
setBackground(Constant.BACK);
addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}

});
setResizable(false);
new Thread(new TThread()).start();
addKeyListener(new keyMonitor());

}

/**
* 双缓冲技术就是在屏幕背后再定义一张图 在图上画有相同的背景 在闪烁的时候把图画到前面
*/
@Override
public void update(Graphics g) {// 双缓冲消除闪烁
if (offScreenImage == null) {
offScreenImage = this.createImage(Constant.FWID, Constant.FHEI);
}
Graphics gOffScreen = offScreenImage.getGraphics();// 获得画屏幕后面场景的画笔
Color c = gOffScreen.getColor();
gOffScreen.setColor(Constant.BACK);
gOffScreen.fillRect(0, 0, Constant.FWID, Constant.FHEI);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);// 把图片画到前面

}

@Override
public void paint(Graphics g) {
if (enemyTanks.size() == 0) {
Times++;
EnemyCount += 5;
addEmpty();
}
g.drawString("子弹数:" + missiles.size(), 700, 50);
g.drawString("敌方坦克数:" + enemyTanks.size(), 700, 70);
g.drawString("关卡数:" + Times, 700, 90);
g.drawString("血量:" + t1.getLife(), 700, 100);
g.drawString("复活次数:" + t1.getTimes(), 700, 120);
gw.draw(g);
for (int i = 0; i < missiles.size(); i++) {
Missile missile = missiles.get(i);
if (missile.destroy(enemyTanks) || missile.destroy(t1)
|| missile.hitWall(gw)) {
missiles.remove(i);
}
if (missile.isLive()) {
missile.draw(g);
}
}
t1.draw(g);
for (int i = 0; i < enemyTanks.size(); i++) {
Tank tank = enemyTanks.get(i);
tank.hitWall(gw);
tank.pengTank(enemyTanks);
if (tank.isLive())
tank.draw(g);
}
for (int i = 0; i < bongs.size(); i++) {
Explode e = bongs.get(i);
if (e.isLive()) {
e.draw(g);
} else {
bongs.remove(i);
}
}

}

public void addEmpty() {
for (int i = 0; i < EnemyCount; i++) {
Tank tanki = new Tank(i * 50 + Constant.TW, 50, false, Direction.D,
this);
enemyTanks.add(tanki);
}
}

private class keyMonitor extends KeyAdapter {

@Override
public void keyPressed(KeyEvent e) {
t1.keypressed(e);

}

@Override
public void keyReleased(KeyEvent e) {
t1.keyReleased(e);
}

}

private class TThread implements Runnable {

public void run() {
while (true) {
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

}

package Mygame;

import java.awt.Color;
import java.awt.Graphics;

import MyFrame.MyFrame;

public class Explode {
private int x,y;
private boolean live=true;
int[] zhiJing={2,4,8,15,16,20,16,10,5,2};
private int step=0;
MyFrame mf=null;
public Explode(int x,int y,MyFrame mf) {
this.x = x;
this.y = y;
this.mf=mf;
}

public boolean isLive() {
return live;
}

public void setLive(boolean live) {
this.live = live;
}

public void draw(Graphics g){
if(!live)return;
if(step==zhiJing.length){
live=false;
step=0;
return;
}
Color c=g.getColor();
g.setColor(Color.BLACK);
g.fillOval(x, y, zhiJing[step], zhiJing[step]);
g.setColor(c);
step++;
}
}

package Mygame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import MyFrame.Constant;

public class greatWall {
private int x,y;
private int wid=Constant.WW;
private int hei=Constant.WH;
public greatWall(int x, int y) {
this.x = x;
this.y = y;
}
public void draw(Graphics g){
Color c=g.getColor();
g.setColor(Color.GRAY);
g.fillRect(x, y, wid, hei);
g.setColor(c);
}
public Rectangle getRect(){
return new Rectangle(x,y,wid,hei);
}
}

package Mygame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.List;

import MyFrame.Constant;
import MyFrame.MyFrame;
import Mygame.Tank.Direction;

public class Missile {
private int x, y;
private int missileW=Constant.MissileW;
private int missileH=Constant.MissileH;
private int Mspeed = Constant.MSPEED;
private boolean live = true;
private boolean good = true;
MyFrame mf;
Tank.Direction dir;

public Missile(int x, int y, Tank.Direction dir, boolean good ,MyFrame mf) {
this.x = x;
this.y = y;
this.mf=mf;
this.dir = dir;
this.good = good;
}

public void draw(Graphics g) {
if (live == true) {
Color c = g.getColor();
if(good)
g.setColor(Color.orange);
else
g.setColor(Color.BLACK);
g.fillOval(x, y, missileW, missileH);
g.setColor(c);
fly();
}
}
public boolean hitWall(greatWall gw){
if(this.isLive()&&this.getRect().intersects(gw.getRect())){
this.setLive(false);
Explode ex = new Explode(x,y,mf);
mf.bongs.add(ex);
return true;
}
return false;
}
public boolean isLive() {
return live;
}

public void setLive(boolean live) {
this.live = live;
}

public void fly() {
switch (dir) {
case L:
x -= Constant.MSPEED;
break;
case LU:
x -= Constant.MSPEED;
y -= Constant.MSPEED;
break;
case LD:
x -= Constant.MSPEED;
y += Constant.MSPEED;
break;
case R:
x += Constant.MSPEED;
break;
case RU:
x += Constant.MSPEED;
y -= Constant.MSPEED;
break;
case RD:
x += Constant.MSPEED;
y += Constant.MSPEED;
break;
case U:
y -= Constant.MSPEED;
break;
case D:
y += Constant.MSPEED;
break;
case STOP:
break;
}
if (x <= 25 || x >= Constant.FWID - Constant.MissileW || y <= 0
|| y >= Constant.FHEI - Constant.MissileH) {
live = false;
mf.missiles.remove(this);
}
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

public Rectangle getRect() {
Rectangle r = new Rectangle(x, y, Constant.MissileW, Constant.MissileH);
return r;
}

public boolean destroy(Tank t1) {
if (this.isLive() && this.getRect().intersects(t1.getRect())
&& t1.isLive() && this.good != t1.isGood()) {
Explode ex = new Explode(x,y,mf);
mf.bongs.add(ex);
if(t1.isGood()){
this.setLive(false);
if(t1.getLife()>0){
t1.setLife(t1.getLife()-20);
}
if(t1.getLife()==0){
t1.setLive(false);
}
}else{
t1.setLive(false);
this.setLive(false);
}
return true;
}
return false;
}

public boolean destroy(List<Tank> enemyTanks) {
for (int i = 0; i < enemyTanks.size(); i++) {
Tank enemyTank = enemyTanks.get(i);
if (destroy(enemyTank)) {
enemyTank.setLive(false);
enemyTanks.remove(i);
return true;
}
}
return false;
}
}

package Mygame;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import java.util.Random;

import MyFrame.Constant;
import MyFrame.MyFrame;

/**
* 如果想用MyFrame中的成员或者方法必须在构造成员方法的时候把值添加进去
*
* @author dell
*
*/

public class Tank {
private int x, y;
private int w = Constant.TW;
private int h = Constant.TH;
private int speed = Constant.TSPEED;
private boolean good = true;
private boolean tL = false, tR = false, tU = false, tD = false;
private boolean live = true;
private int life = 100;
private BloodBar bb=new BloodBar();
public int getTimes() {
return times;
}

public void setTimes(int times) {
this.times = times;
}

private int times=0;
public int getLife() {
return life;
}

public void setLife(int life) {
this.life = life;
}

private int oldX, oldY;
MyFrame mf;

public enum Direction {
L, LU, LD, R, RU, RD, U, D, STOP
};

private Direction ptDir = Direction.D;// 定义一个炮筒的方向,默认朝上
private Direction direction = Direction.STOP;
private static Random r = new Random();
private int step = r.nextInt(15) + 5;

public Tank(int x, int y, boolean good) {
this.x = x;
this.y = y;
this.oldX = x;
this.oldY = y;
this.good = good;
}

public Tank(int x, int y, boolean good, Direction direction, MyFrame mf) {
this(x, y, good);
this.direction = direction;
this.mf = mf;
}

public void draw(Graphics g) {
if (!live)
return;
if (good) {
Color c = g.getColor();
g.setColor(Color.white);
g.fillOval(x, y, Constant.TW, Constant.TH);
g.setColor(c);
bb.draw(g);
} else {
Color c = g.getColor();
g.setColor(Color.red);
g.fillOval(x, y, Constant.TW, Constant.TH);
g.setColor(c);
}
switch (ptDir) {
case L:
g.drawLine(x + w / 2, y + h / 2, x, y + h / 2);
break;
case LU:
g.drawLine(x + w / 2, y + h / 2, x, y);
break;
case LD:
g.drawLine(x + w / 2, y + h / 2, x, y + h);
break;
case R:
g.drawLine(x + w / 2, y + h / 2, x + w, y + h / 2);
break;
case RU:
g.drawLine(x + w / 2, y + h / 2, x + w, y);
break;
case RD:
g.drawLine(x + w / 2, y + h / 2, x + w, y + h);
break;
case U:
g.drawLine(x + w / 2, y + h / 2, x + w / 2, y);
break;
case D:
g.drawLine(x + w / 2, y + h / 2, x + w / 2, y + h);
break;
}
move();
}
public void reStart(){
while(!this.isLive()){
this.x=Constant.FWID - Constant.TW;
this.y=Constant.FHEI- Constant.TH;
this.setLive(true);
this.setLife(100);
times++;
}
}
public Missile fire() {
if (!this.live)
return null;
Missile m1 = null;
if (this.good) {
m1 = new Missile(x + w / 2 - Constant.MissileW / 2, y + h / 2
- Constant.MissileH / 2, ptDir, true, mf);
mf.missiles.add(m1);
} else {
m1 = new Missile(x + w / 2 - Constant.MissileW / 2, y + h / 2
- Constant.MissileH / 2, ptDir, false, mf);
mf.missiles.add(m1);
}
return m1;
}

public Missile fire(Direction dir) {// 在此方法中为子弹初始化
if (!this.isLive())
return null;
int x1 = this.x + Constant.TW / 2 - Constant.MissileW / 2;
int y1 = this.y + Constant.TH / 2 - Constant.MissileH / 2;
Missile m = new Missile(x1, y1, dir, this.good, this.mf);
mf.missiles.add(m);
return m;
}

public void superFire() {
Direction[] dirs = direction.values();
for (int i = 0; i < dirs.length - 1; i++) {
fire(dirs[i]);
}
}

public void keypressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
tL = true;
break;
case KeyEvent.VK_RIGHT:
tR = true;
break;
case KeyEvent.VK_UP:
tU = true;
break;
case KeyEvent.VK_DOWN:
tD = true;
break;
}
chooseDirection();
}

public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_CONTROL:
fire();
break;
case KeyEvent.VK_SHIFT:
superFire();
break;
case KeyEvent.VK_LEFT:
tL = false;
break;
case KeyEvent.VK_RIGHT:
tR = false;
break;
case KeyEvent.VK_UP:
tU = false;
break;
case KeyEvent.VK_DOWN:
tD = false;
break;
case KeyEvent.VK_F1:
reStart();
break;
}
chooseDirection();
}

// 判断坦克的方向
public void chooseDirection() {
if (tL && !tR && !tU && !tD)
direction = Direction.L;
if (tL && !tR && tU && !tD)
direction = Direction.LU;
if (tL && !tR && !tU && tD)
direction = Direction.LD;
if (!tL && tR && !tU && !tD)
direction = Direction.R;
if (!tL && tR && tU && !tD)
direction = Direction.RU;
if (!tL && tR && !tU && tD)
direction = Direction.RD;
if (!tL && !tR && tU && !tD)
direction = Direction.U;
if (!tL && !tR && !tU && tD)
direction = Direction.D;
if (!tL && !tR && !tU && !tD)
direction = Direction.STOP;
}

public void move() {
oldX = x;
oldY = y;
switch (direction) {
case L:
x = x - speed;
break;
case LU:
x = x - speed;
y = y - speed;
break;
case LD:
x = x - speed;
y = y + speed;
break;
case R:
x = x + speed;
break;
case RU:
x = x + speed;
y = y - speed;
break;
case RD:
x = x + speed;
y = y + speed;
break;
case U:
y = y - speed;
break;
case D:
y = y + speed;
break;
}
if (direction != Direction.STOP) {
ptDir = direction;
}
if (x < 0)
x = 0;// 使坦克不会出界
if (y < 25)
y = 25;
if (x > Constant.FWID - Constant.TW)
x = Constant.FWID - Constant.TW;
if (y > Constant.FHEI - Constant.TH)
y = Constant.FHEI - Constant.TH;
if (!good) {
Direction[] dir = Direction.values();
if (step == 0) {
step = r.nextInt(15) + 5;
int randomNum = r.nextInt(dir.length);// 在不超过数组长度的条件下产生随机数
direction = dir[randomNum];
fire();
}
step--;
}

}

public boolean hitWall(greatWall gw) {
if (this.isLive() && this.getRect().intersects(gw.getRect())) {
stay();
return true;
}
return false;
}

public Rectangle getRect() {
Rectangle rt = new Rectangle(x, y, Constant.TW, Constant.TH);
return rt;
}

public boolean pengTank(List<Tank> enemyTanks) {
for (int i = 0; i < enemyTanks.size(); i++) {
Tank enemyTank = enemyTanks.get(i);
if (this != enemyTank) {
if (this.isLive() && enemyTank.isLive()
&& this.getRect().intersects(enemyTank.getRect())) {
stay();
return true;
}
}
}
return false;
}

private class BloodBar {
public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(Color.green);
g.drawRect(x, y - 10, Constant.TW, 10);
g.fillRect(x, y - 10, Constant.TW * life / 100, 10);
}
}

private void stay() {
x = oldX;
y = oldY;
}

public boolean isLive() {
return live;
}

public boolean isGood() {
return good;
}

public void setGood(boolean good) {
this.good = good;
}

public void setLive(boolean live) {
this.live = live;
}

}

package Mygame;

import java.awt.Color;
import java.awt.Graphics;

import MyFrame.MyFrame;

public class TankGame extends MyFrame{

public static void main(String[] args) {
TankGame t=new TankGame();
t.launchFrame();
}
}

界面如下:

出现问题及解决办法:

问题:使用enum(枚举)类型时,eclipse无法识别,显示错误。

解决方法:窗口-->首选项-->java-->编译器

将编译器一致性级别调至1.5以上,如图:

结对同学:20135224陈实

blog地址:http://www.cnblogs.com/chuishi/

时间: 2024-10-10 00:11:32

第三次实验的相关文章

复利计算三次实验总结

前两次实验提交的代码情况 语言 工具 代码行 工作量(人时) JAVA Eclipse 约50 约3小时 第三次实验 估计时间 估计代码行 实际时间 实际代码行 3小时 100左右 约2.5小时 约130 总结:        这三次实验是一个由难到易的过程,我自己本人的编程能力不强,刚开始时无从下手,但是通过同学和网络的帮助,脑海中逐渐有了一个清晰的思路.框架去编写程序直至完成了作业.从这次实验中,我知道了孰能生巧的道理,编程需要多练习才能更快的敲出你需要的程序.

软件工程实验一 复利计算(第三次实验实验总结)

主题内容:复利计算器的第三次改进 追加题目: 4.利率这么低,复利计算收益都这么厉害了,如果拿100万元去买年报酬率10%的股票,若一切顺利,过多长时间,100万元就变成200万元呢? 5.如果我希望在十年内将100万元变成200万元,应该找到报酬率在多少的投资工具来帮助我达成目标?如果想在5年后本金翻倍,报酬率就应至少为多少才行呢? 附加题:6.如果每年都将积蓄的3万元进行投资,每年都能获得3%的回报,然后将这些本利之和连同年金再投入新一轮的投资,那么,30年后资产总值将变为多少?如果换成每月

1202实验三 进程调度实验

一.实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.实验内容和要求 1.要求:设计一个有 N(N不小于5)个进程并发执行的进程调度模拟程序. 进程调度算法:“时间片轮转法”调度算法对N个进程进行调度. 2.完成两个算法(简单时间片轮转法.多级反馈队列调度算法)的设计.编码和调试工作,完成实验报告. 1) 每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等等. 2) 每个进程的状

第三次实验草稿

Java第三次实验 : 实     验    报     告 学号:20135303 姓名:魏昊卿 指导教师:娄嘉鹏   实验名称:Java敏捷开发与xp实现 实验内容: 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(

第三次实验报告+160+曾元鹏

开发人员代码:http://www.cnblogs.com/linpanhuang/p/6790891.html 一.实验目的 掌握黑盒测试用例设计方法 二.实验要求 (1)对被测程序进行黑盒测试用例设计 (2)运用等价类.边界值.决策表.状态图法等进行测试用例设计. (3)对手机上任意一款音乐软件进行黑盒测试实践.(作业若雷同,后上传者判定0分) 三.实验内容 1.对被测程序运用不同的测试技巧进行测试用例设计,并执行测试,撰写测试小结. 要求写出测试用例表.执行情况和测试小结. 2.对手机上任

第三次实验报告+061+陈小兰

一.实验目的 掌握黑盒测试用例设计方法 二.实验要求 (1)对被测程序进行黑盒测试用例设计 (2)运用等价类.边界值.决策表.状态图法等进行测试用例设计. (3)对手机上任意一款音乐软件进行黑盒测试实践.(作业若雷同,后上传者判定0分) 三.实验内容 1.对被测程序运用不同的测试技巧进行测试用例设计,并执行测试,撰写测试小结. 要求写出测试用例表.执行情况和测试小结. 2.对手机上任意一款音乐软件进行黑盒测试. 要求:1)使用思维导图 2)根据场景法.状态图法 设计测试用例. 3)附加题:如有可

LINUX第三次实验报告

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础             班级:201353 姓名:刘世鹏 郝爽 学号:20135304 20135335 成绩:             指导教师:娄嘉鹏       实验日期:2015.11.24 实验密级:         预习程度:           实验时间:15:30-17:30 仪器组次:         必修/选修:必修          实验序号:3 实验名称:  实时系统的移植

20155301信息安全系统设计基础第三次实验

信息安全系统设计基础第三次实验 实验一 任务要求 1)学习使用Linux命令wc(1) 2)基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 3)客户端传一个文本文件给服务器 4)服务器返加文本文件中的单词数 实验步骤 首先要在Linux中查看wc命令 从中我们可以得知wc的命令是输出文章中的单词或者字符个数 然后wc中有很多命令参数,它们各自的作用如下 -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能与 -c 标志一起使用. -w

2017-2018-1 20155235 实验三 实时系统 实验内容

2017-2018-1 20155235 实验三 实时系统 实验内容 一.并发程序-1 二.并发程序-2 三.并发程序-3 实验步骤 一.并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 客户端传一个文本文件给服务器 服务器返加文本文件中的单词数 wc命令的学习 Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项

130242014059-陈敬龙-第三次实验

一.实验目的 1.理解不同体系结构风格的具体内涵. 2.学习体系结构风格的具体实践. 二.实验环境 硬件: (依据具体情况填写) 软件:Java或任何一种自己熟悉的语言 三.实验内容 "上下文关键字"KWIC(Key Word in Context,文本中的关键字)检索系统接受有序的行集合:每一行是单词的有序集合:每一个单词又是字母的有序集合.通过重复地删除航中第一个单词,并把它插入行尾,每一行可以被"循环地移动".KWIC检索系统以字母表的顺序输出一个所有行循环移