一次不一样的“结对”编程(带UI+能发验证码注册+根据难度生成试题的小程序)感想

  这次结对编程,在国庆前就公布了需求,让我们的假期无比充实。我们队和大多数队伍可能不一样,我和队友是一人做一个项目,然后选择好的一方。

  队友的个人项目很有先见之明,一开始就打算好要算出答案。所以他用QT做了UI以后,再调用之前写好的C++代码,另外写了一个java程序发送验证码,然后同样在QT里调用java,估计是因为现学现卖,感觉做出来的UI效果没有发挥出QT的水平。

  我的个人项目没有实现算出答案的功能,但是我生成算式的机制让我可以很方便的改进。由于我写的是C++的代码,考虑到需要发送验证码,就没有想这么多,直接把C++代码改成了java,好在C++改成java不算特别麻烦,花了个把小时就翻译过来了。然后我先大致做了UI(java写UI是真的麻烦),再结合上之前翻译过来的java代码就完成了除了验证码以外的其他功能。最后我才开始去看验证码的部分,根据老师给的网站,发送验证码最主要的就是申请到阿里云的签名和模板,开始两次都没成功,第三次我问了助教,才知道签名要和项目名一样,改了以后很快就弄到了签名,然后顺利实现了发验证码的功能,这下所有的功能都实现了。

  这次结对编程很明显有这三个关键。除去验证码这一项之前讲过,还有两项。

  第一个是个人项目的复用。

  由于个人项目只需要我们根据难度随机生成算式,所以不算特别难,但是如果之前写的太直接,之后复用就会出现难题。有很多队生成算式用的是插入括号什么的,这样之后需要算答案,就只能对整个字符串进行解析,虽然可以导入一些包来解决大部分问题,但是还是三角运算之类的就得另想办法(好像有解析那些函数的包,没了解过),然后还得先转换成后缀表达式,然后根据后缀表达式算。

  我用的方法是把每个操作数当成一个对象,然后把他们放到一个容器里;然后每一次从这个容器里拿出一些对象用+-*/符号连接,连接好了以后,把这个组合体当做一个新的对象,并且对这个对象随机添加括号和操作符,然后放到另一个袋子里,然后重复这个操作,直到原来的袋子没有对象了;接着从新的袋子每次拿出一些对象继续组合......最后一个袋子里只剩下一个对象,这个对象就是生成的算式;这个方法可以通过添加一个记录对象运算以后的结果的参数来求最终算式的值,这样很方便就可以解决了求答案的问题。

  求出了答案,这个问题还没有结束,因为我们需要生成除了真正答案以外的三个错误答案,也许有的人直接在原本答案的基础上加上一个随机数,最后只需要保证四个答案不同就行了,但是这样生成的答案会让做题的人很容易就排除掉那些错误的答案,举个例子,如果你看出一个算式的结果一定是个整数,那你一定不会去选那些不是整数的选项,又如,你知道一个算式的答案是个整数,你就不会去选负数的选项......很多人也想到了这一点,所以对于生成答案这个部分也需要一些思考。

  我采用的方法是先实现对某个实数的某个位进行随机修改的方法,这很容易,只需要先找到那个位,然后把它换成0-9随机的数字就行了。对于一个答案进行修改的时候,为了让其他三个选项的值距离真的答案不是特别远,我只修改答案的十位还有小数位,除非这个答案是一个个位数。由于我保留了小数点后三位,所以我在修改的时候对那些不是整数的答案的小数点后三位随机的修改。最后保证这四个选项不相同即可。

  第二个是UI的制作。

  结对项目里写UI用的语言大致分成了两大阵营,一个是java,另一个是python。我感觉用java写UI特别不方便(不知道python怎么样,没用过),我的jdk版本不是特别高所以用的是java的swing包,swing是很基础很老的包了,在java入门的书籍里都有介绍,初学者一般都接触过。一开始我做出来的UI界面特别古老,感觉颇有学校机考的风格(难道学校机考就是用swing写的...),后面颓废了几天,代码没怎么动,刷空间看到其他队的界面各种骚,决定还是优化一下界面。

  在百度一下后面输入java界面优化以后,意外发现还有substance界面风格包这种东西,二三十种风格任你挑选,然后就像打开了新世界的大门,发现还有很多地方可以改进。先是选了个看的还比较顺眼的浅灰色风格,之后觉得还是不够劲,打算弄弄背景和半透明组件这种骚东西。

  先说说背景这个东西,添加背景有很多方法,一种就是通过JLabel来装载图片,弄一个JLabel对象装背景图片,之后把它放到JFrame分层面板的最底层,由于JFrame还有个ContentPane这个东西会盖住背景,所以要把它设置成透明;还有一种方法就是通过重写paint方法来把背景绘制出来(这个方法会导致闪屏,不记得怎么解决了),这两个都不是我用的方法,我用的就是最直接的重写了一下JPanel的paintComponent方法,然后把背景装载到他上面,最后只需要把组件添加到上面就行了。添加合适的背景后,感觉整个界面都上来一个档次。

  最后来说说半透明组件这个骚东西,百度了很久都没有找到满意的答案,最后发现自定义组件背景色里面可以new一个自定义的颜色,关键是这个颜色还是可以设置透明度的;立马用一个文本框试了一下,果然出现了半透明组件,但是出现了另一个不能忍的情况,就是这个文本框刷新的速度太慢了,打一行字都会出现残影,还会把其他的组件显示在上面,一直找不到问题。后面决定暴力解决,于是搞了一个后台线程,每隔1ms刷新一次界面,然后问题就基本解决了。这个后台线程让我想到似乎可以在刷新的同时来更新背景,从而达到显示动态背景的功能,由于时间关系,没去试。以下是我的界面大致演变过程:

  

    

   

 

  我和队友的项目都完成了以后,互相看了一下效果,感觉我的界面比他的好一点,然后他的界面功能比我多,比如记住密码,自动登录这种功能,还有在答题的时候有计时器,并且可以前后翻阅题目,然后可以全部做完以后再提交。交项目前一天,我们把两个项目的程序综合了一下,在我界面里把他的大部分功能添加进去了,然后结对编程就这么结束了。

  这一次结对编程项目,让我收获很多,主要是java方面,其实之前我没怎么写过java,只会些基础的,通过这次项目,学到了很多java的知识;感觉几天写项目的经验,比之前水一学期的java课要收获多得多。

  最后完成的效果:

  

  

  \\

  

  

猜你喜欢

转载自www.cnblogs.com/hglbyg/p/9752133.html
今日推荐