一、  实验内容

(一)敏捷开发与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. P1004 方格取数

    题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...

  2. 轻量级IOC容器:Ninject

    Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...

  3. koa2学习笔记02 - 给koa2添加系统日志 —— node日志管理模块log4js

    前言 没有日志系统的后台应用是没有灵魂的, 平时工作中每次我们遇到接口报错的时候, 都会叫后台的童鞋看下怎么回事, 这时后台的童鞋都会不慌不忙的打开一个骚骚的黑窗口. 一串噼里啪啦的命令输进去, 哐哐 ...

  4. 一、用Delphi10.3模拟读取百度网页,并读取相关头部信息

    一.读取网页的如下: uses TxHttp, Classes, TxCommon, Frm_WebTool, SysUtils; var m_Url: string; m_Http: TTxHttp ...

  5. C语言实现随机数

    最近在看<The C Programming Language>这本书,看到一个关于随机数的知识点,有种豁然开朗的感觉.以前总靠死记硬背,也不明白为啥是这样,而且总把srand()遗漏.相 ...

  6. Oracle Data Provider for .NET – Microsoft .NET Core and Entity Framework Core

    http://www.oracle.com/technetwork/topics/dotnet/tech-info/odpnet-dotnet-ef-core-sod-4395108.pdf Orac ...

  7. WCF知识点记录

    1:WCF有两种序列化器,XmlSerializer和DataContractSerializer,XmlSerializer能够直接对数据对象进行序列化输出,而DataContractSeriali ...

  8. [2016北京集训试题15]项链-[FFT]

    Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...

  9. Linux常用文件权限控制命令

    一,查看文件属主属组ls -l [root@localhost app]# ls -l total 302832 drwxr-xr-x. 4 lhc lhc 4096 Nov 18 16:05 apa ...

  10. HDU - 3874 Necklace (树状数组、离线处理)

    题目链接:Necklace 题意: 给出一串珠子,每个珠子有它的value,现在给出n(n<=5e4)个珠子的value(1<=value<=1e6),现在给出m(1<=m&l ...