第三次实验报告 敏捷开发与XP实践
一、 实验内容
(一)敏捷开发与XP
摘要:一项实践在XP环境中成功使用的依据通过XP的法则呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。
学习:XP是一种更加灵活的开发方式和理念,通过迅速的反应及时充分修改程序,保证所有团队成员对资源和责任的共享;适用于“小而精”的团队开发。同时,其所倡导的“倾听”也是实现了程序开发“需求至上”的终极目标。
(二)编码标准
编码是一个即主观又客观的过程,每个程序员都有他自己的编程风格,但是不管到底是怎么编程,都要有一个良好的编程风格,而这个风格,就是编程标准,让代码具有了良好的可读性。
实验过程记录如下:


(三)结对编程
结对编程是我和我之前的小组在三个人的情况下做的豌豆荚的小游戏,组员有马悦,郝智宇,益西拉姆三人。
在试验中,我们对于团队精神和合作有了新的认识,相互决策,相互帮助。
团队精神是好多地方都强调的一个精神,我们在这之中进行的团队协作很好。
(四)版本控制
XP的集体所有制意味着每个人都对所有的代码负责;这一点,反过来又意味着每个人都可以更改代码的任意部分。结对编程对这一实践贡献良多:借由在不同的结对中工作,所有的程序员都能看到完全的代码。集体所有制的一个主要优势是提升了开发程序的速度,因为一旦代码中出现错误,任何程序员都能修正它。 这意味着代码要放到一个大家都能方便获取的地方,我们叫代码仓库。这引出另外一个话题叫版本控制(Version Control)。
Git是Linus除了Linux操作系统外的另外一个重要发明。




(五)重构
我们先看看重构的概念:
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。
重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。如何保证不改变软件外部行为?重构后的代码要能通过单元测试。如何使其更加易于阅读、易于维护和易于变更?设计模式给出了重构的目标。
这个类,类名,方法名和方法的参数名都有问题,没有注释的话是无法理解代码的。我们可以使用Eclipse中的重构功能来改名。修改方法是,用鼠标单击要改的名字,选择Eclipse中菜单中的Refactor->Rename...:
重构完的效果如下:
重构完的效果如下:
比如要定义一个类Student,会出现这样的代码:
Eclipse中菜单中的Refactor->Encapsulate Field...,如下图:
比如要定义一个类Student,会出现这样的代码:
Eclipse中菜单中的Refactor->Encapsulate Field...,如下图:
(六)实践项目
1. 以结对编程的方式编写一个软件
,Blog中要给出结对同学的Blog网址,可以拍照展现结对编程情况,可以参考一下其他学校的作业
2.记录TDD和重构的过程,测试代码不要少于业务代码,Eclipse中refactor菜单下的重构技能不要少于5个
3.团队代码要使用git在实验楼中托管,要使用结对同学中的一个同学的账号托管。
4. 程序要有GUI界面,参考用户界面和用户体验
5.程序功能从豌豆荚游戏中选择一款用Java实现,注意:团队之间项目不能有重复,课代表协调一下。
6.实验报告中统计自己的PSP(Personal Software Process)时间
游戏:
package PT;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.*;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.*;
import javax.swing.JTextField;
public class Copy2048 extends JFrame{
private JPanel scoresPane;
private JPanel mainPane;
private JLabel labelMaxScores ;
private JLabel labelScores;
private JLabel tips;//提示操作标签
private JTextField textMaxScores;
private JLabel textScores;
private JLabel[][] texts;
private Icon icon2;
private int times = 16;//记录剩余空方块数目
private int scores = 0;//记录分数
private int l1,l2,l3,l4,l5;//用于判断游戏是否失败
Font font = new Font("", Font.BOLD,14);//设置字体类型和大小
Font font2 = new Font("", Font.BOLD,30);
Random random = new Random();
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
Copy2048 frame = new Copy2048();
frame.setVisible(true);
//Thread thread = new Thread(frame);
//thread.start();
}
catch(Exception e1){
e1.printStackTrace();
}
}
});
}
/**
* 构造方法
*/
public Copy2048(){
super();
setResizable(false);//禁止调整窗体大小
getContentPane().setLayout(null);//设置空布局
setBounds(500, 50, 500, 615);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("2048PC版");//设置窗体标题
scoresPane = new JPanel();//创建分数显示面板
scoresPane.setBackground(Color.green);//设置分数显示面板的背景色
scoresPane.setBounds(20, 20, 460, 40);
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));//设置得分面板的边框
getContentPane().add(scoresPane);//将得分面板添加到窗体
scoresPane.setLayout(null);//设置面板空布局
labelMaxScores = new JLabel("最高分:");//最高分标签
labelMaxScores.setFont(font);//设置字体类型和大小
labelMaxScores.setBounds(10, 5, 50, 30);//设置最懂啊分标签的位置尺寸
scoresPane.add(labelMaxScores);//将最高分标签添加到得分容器中
textMaxScores = new JTextField("暂不可用");//得分标签
textMaxScores.setBounds(60, 5, 150, 30);
textMaxScores.setFont(font);
textMaxScores.setEditable(false);
scoresPane.add(textMaxScores);//将得分标签添加到分数面板中
labelScores = new JLabel("得 分:");
labelScores.setFont(font);//设置字体类型和大小
labelScores.setBounds(240, 5, 50, 30);
scoresPane.add(labelScores);
textScores = new JLabel(String.valueOf(scores));
textScores.setFont(font);
textScores.setBounds(290, 5, 150, 30);
scoresPane.add(textScores);
mainPane = new JPanel();//创建游戏主面板
mainPane.setBounds(20, 70, 460, 500);//设置主面板位置尺寸
this.getContentPane().add(mainPane);
mainPane.setLayout(null);//设置空布局
texts = new JLabel[4][4];//创建文本框二维数组
for(int i = 0; i < 4; i++){//遍历数组
for(int j = 0; j < 4; j++){
texts[i][j] = new JLabel();//创建标签
texts[i][j].setFont(font2);
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);
texts[i][j].setText("");
texts[i][j].setBounds(120 * j, 120 * i, 100, 100);//设置方块的大小位置
setColor(i, j, "");
texts[i][j].setOpaque(true);
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色
mainPane.add(texts[i][j]);//将创建的文本框放在
}
}
tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");
tips.setFont(font);
tips.setBounds(60,480,400,20);
mainPane.add(tips);
textMaxScores.addKeyListener(new KeyAdapter(){//为最高分标签添加按键监听器
public void keyPressed( KeyEvent e){
do_label_keyPressed(e);//调用时间处理方法
}
});
Create2();
Create2();
}
/**
* 按键输入事件的处理方法
* @param e
*/
protected void do_label_keyPressed(final KeyEvent e){
int code = e.getKeyCode();//获取按键代码
int a ;//a 的引入是为了防止连加的情况出现
String str ;
String str1;
int num;
switch(code){
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A://如果按键代码是左方向键或者A键
for(int i = 0; i < 4; i++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 1; j < 4; j++){//遍历16个方块
str = texts[i][j].getText();//获取当前方块标签文本字符
str1 = texts[i][j-1].getText();//获取当前左1方块标签文本字符
if(str1.compareTo("") == 0){//如果左1方块文本为空字符
texts[i][j-1].setText(str);//字符左移
setColor(i, j-1,str);
texts[i][j].setText("");//当前方块字符置空
setColor(i, j, "");
}else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){//如果当前方块和左1方块文本字符相等
num = Integer.parseInt(str);
scores += num;
times ++;
str = String.valueOf(2 * num);
texts[i][j-1].setText(str);//左1方块文本字符变为两方块之和
setColor(i, j-1, str);
texts[i][j].setText("");//当前方块字符置空
setColor(i, j, "");
a = j;
}
}
}
}
l1 = 1;//用于判断游戏是否失败
Create2();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
for(int i = 0; i < 4; i ++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 2; j >= 0; j--){
str = texts[i][j].getText();
str1 = texts[i][j + 1].getText();
if(str1.compareTo("") == 0){
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
a = j;
}
}
}
}
l2 = 1;
Create2();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
for(int j = 0; j < 4; j++){
a = 5;
for(int k = 0; k < 3; k++){
for(int i = 1; i < 4; i++){
str = texts[i][j].getText();
str1 = texts[i - 1][j].getText();
if(str1.compareTo("") == 0){
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a -1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l3 =1;
Create2();
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
for(int j = 0; j < 4; j ++){
a = 5;
for(int k = 0; k < 5; k++){
for(int i = 2; i >= 0; i--){
str = texts[i][j].getText();
str1 = texts[i + 1][j].getText();
if(str1.compareTo("") == 0){
texts[i + 1][j].setText(str);
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a + 1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i + 1][j].setText(str );
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l4 = 1;
Create2();
break;
default:
break;
}
textScores.setText(String.valueOf(scores));
}
/**
* 在随机位置产生一个2号方块的方法
* @param i,j
*/
public void Create2(){
int i ,j;
boolean r = false;
String str;
if(times > 0){
while(!r){
i = random.nextInt(4);
j = random.nextInt(4);
str = texts[i][j].getText();
if((str.compareTo("") == 0)){
texts[i][j].setIcon(icon2);
texts[i][j].setText("2");
setColor(i, j, "2");
times --;
r = true;
l1 = l2 = l3 = l4 = 0;
}
}
}
else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){//l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
tips.setText(" GAME OVER !");
}
}
/**
* 设置标签颜色
* @param i , j ,str
*/
public void setColor(int i, int j, String str){
switch(str){
case "2":
texts[i][j].setBackground(Color.yellow);
break;
case "4":
texts[i][j].setBackground(Color.red);
break;
case "8":
texts[i][j].setBackground(Color.pink);
break;
case "16":
texts[i][j].setBackground(Color.orange);
break;
case "32":
texts[i][j].setBackground(Color.magenta);
break;
case "64":
texts[i][j].setBackground(Color.LIGHT_GRAY);
break;
case "128":
texts[i][j].setBackground(Color.green);
break;
case "256":
texts[i][j].setBackground(Color.gray);
break;
case "512":
texts[i][j].setBackground(Color.DARK_GRAY);
break;
case "1024":
texts[i][j].setBackground(Color.cyan);
break;
case "2048":
texts[i][j].setBackground(Color.blue);
break;
case "":
case "4096":
texts[i][j].setBackground(Color.white);
break;
default:
break;
}
}
}
一、 实验内容
(一)敏捷开发与XP
摘要:一项实践在XP环境中成功使用的依据通过XP的法则呈现,包括:快速反馈、假设简单性、递增更改、提倡更改、优质工作。XP软件开发的基石是XP的活动,包括:编码、测试、倾听、设计。
学习:XP是一种更加灵活的开发方式和理念,通过迅速的反应及时充分修改程序,保证所有团队成员对资源和责任的共享;适用于“小而精”的团队开发。同时,其所倡导的“倾听”也是实现了程序开发“需求至上”的终极目标。
(二)编码标准
编码是一个即主观又客观的过程,每个程序员都有他自己的编程风格,但是不管到底是怎么编程,都要有一个良好的编程风格,而这个风格,就是编程标准,让代码具有了良好的可读性。
实验过程记录如下:
(三)结对编程
结对编程是我和我之前的小组在三个人的情况下做的豌豆荚的小游戏,组员有马悦,郝智宇,益西拉姆三人。
在试验中,我们对于团队精神和合作有了新的认识,相互决策,相互帮助。
团队精神是好多地方都强调的一个精神,我们在这之中进行的团队协作很好。
(四)版本控制
XP的集体所有制意味着每个人都对所有的代码负责;这一点,反过来又意味着每个人都可以更改代码的任意部分。结对编程对这一实践贡献良多:借由在不同的结对中工作,所有的程序员都能看到完全的代码。集体所有制的一个主要优势是提升了开发程序的速度,因为一旦代码中出现错误,任何程序员都能修正它。 这意味着代码要放到一个大家都能方便获取的地方,我们叫代码仓库。这引出另外一个话题叫版本控制(Version Control)。
Git是Linus除了Linux操作系统外的另外一个重要发明。
(五)重构
我们先看看重构的概念:
重构(Refactor),就是在不改变软件外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。
重构中一个非常关键的前提就是“不改变软件外部行为”,它保证了我们在重构原有系统的同时,不会为原系统带来新的BUG,以确保重构的安全。如何保证不改变软件外部行为?重构后的代码要能通过单元测试。如何使其更加易于阅读、易于维护和易于变更?设计模式给出了重构的目标。
这个类,类名,方法名和方法的参数名都有问题,没有注释的话是无法理解代码的。我们可以使用Eclipse中的重构功能来改名。修改方法是,用鼠标单击要改的名字,选择Eclipse中菜单中的Refactor->Rename...:
重构完的效果如下:
重构完的效果如下:
比如要定义一个类Student,会出现这样的代码:
Eclipse中菜单中的Refactor->Encapsulate Field...,如下图:
比如要定义一个类Student,会出现这样的代码:
Eclipse中菜单中的Refactor->Encapsulate Field...,如下图:
(六)实践项目
1. 以结对编程的方式编写一个软件
,Blog中要给出结对同学的Blog网址,可以拍照展现结对编程情况,可以参考一下其他学校的作业
2.记录TDD和重构的过程,测试代码不要少于业务代码,Eclipse中refactor菜单下的重构技能不要少于5个
3.团队代码要使用git在实验楼中托管,要使用结对同学中的一个同学的账号托管。
4. 程序要有GUI界面,参考用户界面和用户体验
5.程序功能从豌豆荚游戏中选择一款用Java实现,注意:团队之间项目不能有重复,课代表协调一下。
6.实验报告中统计自己的PSP(Personal Software Process)时间
游戏:
package PT;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.*;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.*;
import javax.swing.JTextField;
public class Copy2048 extends JFrame{
private JPanel scoresPane;
private JPanel mainPane;
private JLabel labelMaxScores ;
private JLabel labelScores;
private JLabel tips;//提示操作标签
private JTextField textMaxScores;
private JLabel textScores;
private JLabel[][] texts;
private Icon icon2;
private int times = 16;//记录剩余空方块数目
private int scores = 0;//记录分数
private int l1,l2,l3,l4,l5;//用于判断游戏是否失败
Font font = new Font("", Font.BOLD,14);//设置字体类型和大小
Font font2 = new Font("", Font.BOLD,30);
Random random = new Random();
public static void main(String[] args){
EventQueue.invokeLater(new Runnable(){
public void run(){
try{
Copy2048 frame = new Copy2048();
frame.setVisible(true);
//Thread thread = new Thread(frame);
//thread.start();
}
catch(Exception e1){
e1.printStackTrace();
}
}
});
}
/**
* 构造方法
*/
public Copy2048(){
super();
setResizable(false);//禁止调整窗体大小
getContentPane().setLayout(null);//设置空布局
setBounds(500, 50, 500, 615);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("2048PC版");//设置窗体标题
scoresPane = new JPanel();//创建分数显示面板
scoresPane.setBackground(Color.green);//设置分数显示面板的背景色
scoresPane.setBounds(20, 20, 460, 40);
scoresPane.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.YELLOW));//设置得分面板的边框
getContentPane().add(scoresPane);//将得分面板添加到窗体
scoresPane.setLayout(null);//设置面板空布局
labelMaxScores = new JLabel("最高分:");//最高分标签
labelMaxScores.setFont(font);//设置字体类型和大小
labelMaxScores.setBounds(10, 5, 50, 30);//设置最懂啊分标签的位置尺寸
scoresPane.add(labelMaxScores);//将最高分标签添加到得分容器中
textMaxScores = new JTextField("暂不可用");//得分标签
textMaxScores.setBounds(60, 5, 150, 30);
textMaxScores.setFont(font);
textMaxScores.setEditable(false);
scoresPane.add(textMaxScores);//将得分标签添加到分数面板中
labelScores = new JLabel("得 分:");
labelScores.setFont(font);//设置字体类型和大小
labelScores.setBounds(240, 5, 50, 30);
scoresPane.add(labelScores);
textScores = new JLabel(String.valueOf(scores));
textScores.setFont(font);
textScores.setBounds(290, 5, 150, 30);
scoresPane.add(textScores);
mainPane = new JPanel();//创建游戏主面板
mainPane.setBounds(20, 70, 460, 500);//设置主面板位置尺寸
this.getContentPane().add(mainPane);
mainPane.setLayout(null);//设置空布局
texts = new JLabel[4][4];//创建文本框二维数组
for(int i = 0; i < 4; i++){//遍历数组
for(int j = 0; j < 4; j++){
texts[i][j] = new JLabel();//创建标签
texts[i][j].setFont(font2);
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);
texts[i][j].setText("");
texts[i][j].setBounds(120 * j, 120 * i, 100, 100);//设置方块的大小位置
setColor(i, j, "");
texts[i][j].setOpaque(true);
texts[i][j].setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.green));//设置方块边框颜色
mainPane.add(texts[i][j]);//将创建的文本框放在
}
}
tips = new JLabel("Tips:使用上、下、左、右键或者W、S、A、D键控制");
tips.setFont(font);
tips.setBounds(60,480,400,20);
mainPane.add(tips);
textMaxScores.addKeyListener(new KeyAdapter(){//为最高分标签添加按键监听器
public void keyPressed( KeyEvent e){
do_label_keyPressed(e);//调用时间处理方法
}
});
Create2();
Create2();
}
/**
* 按键输入事件的处理方法
* @param e
*/
protected void do_label_keyPressed(final KeyEvent e){
int code = e.getKeyCode();//获取按键代码
int a ;//a 的引入是为了防止连加的情况出现
String str ;
String str1;
int num;
switch(code){
case KeyEvent.VK_LEFT:
case KeyEvent.VK_A://如果按键代码是左方向键或者A键
for(int i = 0; i < 4; i++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 1; j < 4; j++){//遍历16个方块
str = texts[i][j].getText();//获取当前方块标签文本字符
str1 = texts[i][j-1].getText();//获取当前左1方块标签文本字符
if(str1.compareTo("") == 0){//如果左1方块文本为空字符
texts[i][j-1].setText(str);//字符左移
setColor(i, j-1,str);
texts[i][j].setText("");//当前方块字符置空
setColor(i, j, "");
}else if((str.compareTo(str1) == 0) && (j !=a) && (j != a-1)){//如果当前方块和左1方块文本字符相等
num = Integer.parseInt(str);
scores += num;
times ++;
str = String.valueOf(2 * num);
texts[i][j-1].setText(str);//左1方块文本字符变为两方块之和
setColor(i, j-1, str);
texts[i][j].setText("");//当前方块字符置空
setColor(i, j, "");
a = j;
}
}
}
}
l1 = 1;//用于判断游戏是否失败
Create2();
break;
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_D:
for(int i = 0; i < 4; i ++){
a = 5;
for(int k = 0; k < 3; k++){
for(int j = 2; j >= 0; j--){
str = texts[i][j].getText();
str1 = texts[i][j + 1].getText();
if(str1.compareTo("") == 0){
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && j !=a && j != a+ 1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i][j + 1].setText(str);
setColor(i, j+1, str);
texts[i][j].setText("");
setColor(i, j, "");
a = j;
}
}
}
}
l2 = 1;
Create2();
break;
case KeyEvent.VK_UP:
case KeyEvent.VK_W:
for(int j = 0; j < 4; j++){
a = 5;
for(int k = 0; k < 3; k++){
for(int i = 1; i < 4; i++){
str = texts[i][j].getText();
str1 = texts[i - 1][j].getText();
if(str1.compareTo("") == 0){
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a -1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i - 1][j].setText(str);
setColor(i-1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l3 =1;
Create2();
break;
case KeyEvent.VK_DOWN:
case KeyEvent.VK_S:
for(int j = 0; j < 4; j ++){
a = 5;
for(int k = 0; k < 5; k++){
for(int i = 2; i >= 0; i--){
str = texts[i][j].getText();
str1 = texts[i + 1][j].getText();
if(str1.compareTo("") == 0){
texts[i + 1][j].setText(str);
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
}
else if(str.compareTo(str1) == 0 && i != a && i != a + 1){
num = Integer.parseInt(str);
scores += num ;
times ++;
str = String.valueOf(2 * num);
texts[i + 1][j].setText(str );
setColor(i+1, j, str);
texts[i][j].setText("");
setColor(i, j, "");
a = i;
}
}
}
}
l4 = 1;
Create2();
break;
default:
break;
}
textScores.setText(String.valueOf(scores));
}
/**
* 在随机位置产生一个2号方块的方法
* @param i,j
*/
public void Create2(){
int i ,j;
boolean r = false;
String str;
if(times > 0){
while(!r){
i = random.nextInt(4);
j = random.nextInt(4);
str = texts[i][j].getText();
if((str.compareTo("") == 0)){
texts[i][j].setIcon(icon2);
texts[i][j].setText("2");
setColor(i, j, "2");
times --;
r = true;
l1 = l2 = l3 = l4 = 0;
}
}
}
else if(l1 >0 && l2 >0 && l3 > 0 && l4 > 0){//l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败
tips.setText(" GAME OVER !");
}
}
/**
* 设置标签颜色
* @param i , j ,str
*/
public void setColor(int i, int j, String str){
switch(str){
case "2":
texts[i][j].setBackground(Color.yellow);
break;
case "4":
texts[i][j].setBackground(Color.red);
break;
case "8":
texts[i][j].setBackground(Color.pink);
break;
case "16":
texts[i][j].setBackground(Color.orange);
break;
case "32":
texts[i][j].setBackground(Color.magenta);
break;
case "64":
texts[i][j].setBackground(Color.LIGHT_GRAY);
break;
case "128":
texts[i][j].setBackground(Color.green);
break;
case "256":
texts[i][j].setBackground(Color.gray);
break;
case "512":
texts[i][j].setBackground(Color.DARK_GRAY);
break;
case "1024":
texts[i][j].setBackground(Color.cyan);
break;
case "2048":
texts[i][j].setBackground(Color.blue);
break;
case "":
case "4096":
texts[i][j].setBackground(Color.white);
break;
default:
break;
}
}
}

小组成员:
益西拉姆:http://www.cnblogs.com/20135239-yxlm/
马悦:http://www.cnblogs.com/20135235my/
|
步骤 |
耗时 |
百分比 |
|
需求分析 |
30 |
15 |
|
设计 |
20 |
15 |
|
代码实现 |
30 |
17 |
|
测试 |
40 |
15 |
|
分析总结 |
13 |
12 |
第三次实验报告 敏捷开发与XP实践的更多相关文章
- 20145337实验三实验报告——敏捷开发与XP实践
20145337实验三实验报告--敏捷开发与XP实践 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 ** 实验步骤**### 敏捷开发与XP 软件工程包括下列领域:软件需求 ...
- 20145229实验三实验报告——敏捷开发与XP实践
20145229实验三实验报告--敏捷开发与XP实践 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 ** 实验步骤**### 敏捷开发与XP 软件工程包括下列领域:软件需求 ...
- 实验3 敏捷开发与XP实践实验报告
一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:高君天 学号:20165319 指导教师:娄嘉鹏 实验日期:2018年4月27日 实验时间:13:45 - 3:25 实验序号:实验三 ...
- 20165302 敏捷开发与XP实践作业
20165302 敏捷开发与XP实践实验报告 一.提交点一 1.实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD ...
- 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- 2017-2018-2 20165206 实验三 《敏捷开发与XP实践》实验报告
2017-2018-2 20165206 实验三 <敏捷开发与XP实践>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教师: ...
- 20155237 《JAVA程序设计》实验三(敏捷开发与XP实践)实验报告
20155237 <JAVA程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 敏捷开发与XP实践 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...
- 20155207王雪纯 《Java程序设计》实验三 敏捷开发与XP实践 实验报告
20155207王雪纯 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...
- 实验三 敏捷开发与XP实践实验报告
实验三 敏捷开发与XP实践实验报告 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vi ...
随机推荐
- 1360: Good Serial Inc.(不知道是什么类型的题)
1360: Good Serial Inc. Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Subm ...
- HDU 1754 I Hate It(线段树之单点更新 区间最值查询)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 新手搭建 x-boot 编译环境笔记
1.需要先搭建交叉编译环境,即制作交叉编译工具链,这个过程比较复杂,所以我在这里使用别人做好的交叉编译工具链. 2018年8月27日15:03:37 2.X-boot 源码github地址:htt ...
- 在用AJAX跨域请求时遇到的问题
刚刚接触ajax就遇到一个词--跨域. 在我百度了各种资料以后总结了一句话:“只要不是在一个协议.域.名端口下,都属于跨域(127.0.0.1本地也属于跨域)”. 在做ajax请求的时候,请求不到并且 ...
- uliweb的模版
uliweb模版的文件名是与函数名相同的 以test为例: ***@Android:~/ablog# vim apps/blog/templates/test.html 编辑test.html的内容 ...
- Gitlab+Jenkins学习之路(七)之发布PHP项目
使用git+jenkins实现持续集成 Step1:构建一个自由风格的php-deploy Step2:Gernal配置,丢弃旧的构建,防止jenkins构建较多之后变臃肿 Step3:源码管理:这里 ...
- CLR via C#读书笔记一:CLR的执行模型
CLR(Common Language Runtime)公共语言进行时是一个可由多种编程语言使用的“进行时”. 将源代码编译成托管模块 可用支持CLR的任何语言创建源代码文件,然后用对应的编译器检查语 ...
- 异常 java.lang.NullPointerException at org.apache.jsp.index_jsp._jspService(index_jsp.java:124)
这是jsp报的异常 jsp代码: <% String LoginUsername = ""; String LoginPassword = ""; try ...
- 巧用 Python 找工作(资料在文末)
前言 近年来 Python 之火大家都有感而知,那亲们知道北京的 Python 开发岗位.运维开发岗位招聘地域都是如何分布的吗?薪水如何?是否有前景等等,这些数据呢直接通过招聘信息来了解到企业用人是最 ...
- 取值:form表单取值、input框绑定取值
1. form表单取值1.1 方式一,通过<form bindsubmit="formSubmit">与<button formType="submit ...