一、  实验内容

(一)敏捷开发与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实践的更多相关文章

  1. 20145337实验三实验报告——敏捷开发与XP实践

    20145337实验三实验报告--敏捷开发与XP实践 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 ** 实验步骤**### 敏捷开发与XP 软件工程包括下列领域:软件需求 ...

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

    20145229实验三实验报告--敏捷开发与XP实践 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 ** 实验步骤**### 敏捷开发与XP 软件工程包括下列领域:软件需求 ...

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

    一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:高君天 学号:20165319 指导教师:娄嘉鹏 实验日期:2018年4月27日 实验时间:13:45 - 3:25 实验序号:实验三 ...

  4. 20165302 敏捷开发与XP实践作业

    20165302 敏捷开发与XP实践实验报告 一.提交点一 1.实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD ...

  5. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  6. 2017-2018-2 20165206 实验三 《敏捷开发与XP实践》实验报告

    2017-2018-2 20165206 实验三 <敏捷开发与XP实践>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教师: ...

  7. 20155237 《JAVA程序设计》实验三(敏捷开发与XP实践)实验报告

    20155237 <JAVA程序设计>实验三(敏捷开发与XP实践)实验报告 实验内容 敏捷开发与XP实践 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...

  8. 20155207王雪纯 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20155207王雪纯 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

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

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

随机推荐

  1. 12 Bit ADC与LSB的含义

    [转]12 Bit ADC与LSB的含义 LSB(Least Significant Bit),意为最低有效位:MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示 ...

  2. mysql/mariadb学习记录——创建删除数据库、表的基本命令

    查看已有的数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | inf ...

  3. rem布局简介

    移动端常见布局: 1.流式布局 高度固定,宽度自适应 2.响应式布局 能够用一套代码适应不同尺寸屏幕 3.rem布局 宽高自适应,能实现整个页面像一张图片一样缩放且不失真的效果. rem布局: em: ...

  4. python 标准库简介

    操作系统接口 os 模块提供了许多与操作系统交互的函数: >>> >>> import os >>> os.getcwd() # Return t ...

  5. Hibernate第一天——入门和基本操作

    第一个接触的框架就是这个Hibernate框架了,Hibernate本意是 冬眠 ,这里有必要引用CSDN上某位网友某个帖子的评论先引出框架的概念: 框架:一个软件半成品,帮你做了一些基础工作,你就可 ...

  6. updated stream stash changes

    处理的方式非常简单,主要是使用git stash命令进行处理,分成以下几个步骤进行处理. 1.先将本地修改存储起来 $ git stash 这样本地的所有修改就都被暂时存储起来 .是用git stas ...

  7. 排序算法:快速排序解析及Python实现

    关键词:分而治之.递归.计算速度.基准值 1. 什么是分而治之? 1.1 分而治之(divide and conquer)一种递归式方法 1.2 找出基线条件,这种条件必须尽可能简单 1.3 不断将问 ...

  8. 扩展gcd算法

    扩展gcd算法 神tm ×度搜索exgcd 打到exg的时候出来ex咖喱棒... 球方程\(ax+by=\gcd(a,b)\)的一个解 如果\(b=0\),那么\(\gcd(a,b)=a\),取\(x ...

  9. idea 和 WebStorm 配置 http代理 并更换主题

    proxy,http,socks5 当前 idea 主题为:(idea 自带) idea 编辑器的主题颜色字体为:(网上下载的 jar 包) 因为今天在安装下面这个主题时需要在 idea的 plugi ...

  10. Distributed3:SQL Server 分布式数据库性能测试

    我在三台安装SQL Server 2012的服务器上搭建分布式数据库,把产品环境中一年近1.4亿条数据大致均匀地存储在这三台服务器中,每台Server 存储4个月的数据,物理机的系统配置基本相同:内存 ...