一、实验目标
1)体验敏捷开发中的两人合作。
2)进一步提高个人编程技巧与实践。
二 、实验内容
1)根据以下问题描述,练习结对编程(pair programming)实践;
2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求。
3)要求在结对编程工作期间,两人的角色至少切换 4 次;
4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。
三、具体内容
1、代码规范
代码规范采用阿里规约,具体如下:
- 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。
- 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
- 注释的双斜线与注释内容之间有且仅有一个空格。
- Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
- 集合初始化时,指定集合初始值大小。
- 需要进行参数校验。
- 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式。
2、程序的总体设计(附图说明模块之间的关系)
3、程序结对编程过程(附图)及功能实现情况(附代码和图)
过程
功能
初始化界面
完成正确输入
完成错误输入
控制台版本
源代码
test.java(for console version)
package cy;
import java.util.Scanner;
public class test {
private static int score = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
// char[] operator = new char[5];
// operator[] = {'+', '-', '*', '/'};
int count = 1;
Scanner sc = new Scanner(System.in);
System.out.println("这是四则运算小游戏,你将得到十个题目,每个题目1分,满分10分,祝你好运");
while(count <= 10) {
String operator = getOperator();
int num1 = (int)(Math.random()*(100-1)+1);
int num2 = (int)(Math.random()*(100-1)+1);
if(judgeEquation(num1, num2)) {
System.out.println("第"+count+"题");
System.out.print(num1 + operator + num2 +"=");
int res = sc.nextInt();
judgeResult(num1, num2, operator, res);
System.out.println();
count ++;
}
}
System.out.println("游戏结束,你的得分是:"+score+"分");
}
//***获取符号***
public static String getOperator() {
char[] operator=new char[]{'+','-','*','/'};
int num = (int) (Math.random()*(4-0)+0);
// int s= random.nextInt(4);
return String.valueOf(operator[num]);
}
//***判断范围是否在要求范围内***
public static boolean judgeEquation(int num1, int num2) {
if(num1 + num2 >= 100 || num1 * num2 >= 100) {
return false;
}
if(num1 - num2 < 0) {
return false;
}
if(num1 % num2 != 0) {
return false;
}
return true;
}
//***判断运算结果***
public static boolean judgeResult(int num1, int num2, String operator, int res) {
int result = 0;
switch(operator) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
}
if(res == result) {
System.out.println("√");
score ++;
return true;
}
else {
System.out.println("×");
return false;
}
}
}
equationExe.java(for getting random numbers and operators and calculating results)
package cy;
//***获得算式***
public class equationExe {
private static String equation;
public static int res1 = 0;
public static String getEquation() {
do {
int num1 = (int)(Math.random()*(100-1)+1);
int num2 = (int)(Math.random()*(100-1)+1);
String operator = test.getOperator();
String equation = num1 + operator + num2 +"="; //方便后续调用
if(test.judgeEquation(num1, num2)) {
res1 = getResult(num1, num2, operator);
return equation;
}
}while(equation == null);
return null;
}
public static int getResult(int num1, int num2, String operator) {
int result = 0;
switch(operator) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
}
return result;
// if(res == result) {
// System.out.println("√");
// score ++;
// return true;
// }
// else {
// System.out.println("×");
// return false;
// }
}
}
view.java(GUI)
package cy;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class view extends JFrame{
//创建窗口
public view() {
System.out.println(equationExe.getEquation());
setTitle("四则运算小游戏");
setBounds(100, 100, 500, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(null);
c.setBackground(Color.WHITE);
//生成组件
JLabel jl1 = new JLabel("请计算:");
JLabel jl2 = new JLabel(equationExe.getEquation());
// JLabel jl3 = new JLabel("*");
// JLabel jl4 = new JLabel("100");
JLabel jl5 = new JLabel("");
JTextField jt = new JTextField();
//添加提示
jl1.setBounds(20, 20, 150, 50);
jl1.setFont(new Font("黑体",Font.PLAIN,20));
c.add(jl1);
//设置算式
jl2.setBounds(20, 50, 100, 100);
jl2.setFont(new Font("黑体",Font.PLAIN,20));
c.add(jl2);
//添加输入框
jt.setBounds(90, 90, 50, 25);
jt.setFont(new Font("黑体",Font.PLAIN,20));
c.add(jt);
//添加确认按钮,绑定事件,定义分数
JButton btn1 = new JButton("Confirmed!");
btn1.setBounds(20, 125, 100, 25);
btn1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(jt.getText());
int res = Integer.valueOf(jt.getText());
if(res == equationExe.res1) {
System.out.println("√");
jl5.setText("√");
}
else {
System.out.println("×");
jl5.setText("×");
}
jl5.setFont(new Font("黑体",Font.PLAIN,20));
jl5.setBounds(150, 90, 25, 25);
c.add(jl5);
jl5.setVisible(true);
}
});
//添加取消按钮
JButton btn2 = new JButton("Cancelled!");
btn2.setBounds(150, 125, 100, 25);
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jt.setText("");
}
});
c.add(btn1);
c.add(btn2);
setVisible(true);
}
public static void main(String[] args) {
new view();
}
// public static boolean Judge() {
// int res = Integer.valueOf(view.jt.getText());
// if(res == equationExe.res1) {
// getScore();
// }
// }
}
5、实验总结
通过本次实验,让我对结对编程有了从简单认识到深入实战操作的体验,并且由于不在一起面对面编程,不能有什么问题都可以得到及时沟通,这为实验过程带来了许多不便,但好在GitHub远程仓库的使用以及QQ等软件的运用,让我和我的搭档有了职业程序员的结对编程的感觉,总的来说本次实验困难还是比较多的,但是克服这些困难的后的欣喜油然而生。同时,在使用Java制作图形界面的时候,遇到了一些困难,虽然程序的功能可以在控制台很好的表现和输出,但是想让各种运行结果,按照设想输出在图形界面上,遇到了一些挑战,但是在网络和同学的帮助下,我逐渐解决了这些问题。目前的图形版程序依然又不够完善的地方,但我们会在将来的版本中,逐渐完善这些功能。