20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(及获小黄衫感想)
项目介绍
结对伙伴
舒尔特方格简介
- 舒尔特方格是一种帮助人们提高注意力的简单训练方法。
- 最早的舒尔特方格,是在一张方形卡片上画上 1cm × 1cm 的 25 个方格,格子内任意填写上阿拉伯数字 1 ~ 25 等共 25 个数字。训练时,要求被测者用手指按 1 ~ 25 的顺序依次指出其位置,同时诵读出声,施测者一旁记录所用时间。数完 25 个数字所用时间越短,注意力水平越高。
- 舒尔特方格是全世界范围内最简单,最有效也是最科学的注意力训练方法。寻找目标数字时,注意力是需要极度集中的,把这短暂的高强度的集中精力过程反复练习,大脑的集中注意力功能就会不断的加固、提高,注意水平越来越高。
项目相关地址
需求分析
- 实现舒尔特方格游戏的功能
- 在n排n列的n^2个方块中,使1~n共n个数字随机分布在方块中
- 用户按数字由小到大的顺序进行点击,当点击错误时弹出警告窗口,点击按钮后返回游戏。
- 当完成游戏后,弹出窗口提示游戏结束,点击按钮后返回主界面
- 拓展需求
- 增加一个介绍游戏内容和游戏方法的界面
- 有简单(3×3)、中等(5×5)、困难(7×7)三种模式可以选择
- 新增功能
相关过程及解释
- 其实在这个程序中,最主要也是最重要的部分就是舒尔特方格的游戏部分,如何生成排列布局,实现游戏功能等是其中最核心的过程
生成排列布局
- 首先要生成一个布局,在这个布局中,n^2个正方形按钮按每行n个、每列n个进行排列,形成一个更大的正方形。
- 在《Java和Android开发学习指南》的27章中提供了五种布局,依据我们所想生成的布局需求,有
LinearLayout
、RelativeLayout
和TableLayout
可以选择。而书上又说明了TableLayout类
其实是LinearLayout类
的一个子类,所以最后问题就归结为选择LinearLayout
还是RelativeLayout
。
- 在查了许多资料后,我们发现虽然RelativeLayout需要对其子View进行两次measure过程,而LinearLayout则只需一次measure过程,显然会快于RelativeLayout。但是在诸如ListView等控件中,使用LinearLayout容易产生多层嵌套的布局结构,这在性能上是不好的。而RelativeLayout因其原理上的灵活性,通常层级结构都比较扁平,很多使用LinearLayout的情况都可以用一个RelativeLayout来替代,以降低布局的嵌套层级,优化性能。 所以我们最终选择使用
RelativeLayout
来进行布局。
//批量随机生成按钮
private void findViews(RelativeLayout layout) {
for (int i = 0, j = 0; i < 25; i++) {
btn[i] = new Button(this);
int temp = getRandom();
btn[i].setText(temp + "");
btn[i].setId(temp);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
length, length);
if (i != 0 & i % 5 == 0) {
j++;
}
params.leftMargin = 40 + length * (i % 5) - (i % 5) * 10;
params.topMargin = 40 + length * j - j * 10;
layout.addView(btn[i], params);
}
}
随机生成数字来设置动态按钮的id和text
private Integer getRandom() {
Random random = new Random(System.currentTimeMillis());
int i = 0;
do {
i = random.nextInt(25) + 1; }
while (map.get(i) != null);
map.put(i, i + "");
return i;
}
- 为了防止产生重复的随机数,这里使用Map类来限定随机数不发生重复。
设定点击错误时和游戏结束时弹出的对话框
new AlertDialog.Builder(SecondActivity.this)
.setTitle("警告")
.setMessage("只能按顺序进行点击")
.setPositiveButton("返回游戏",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {}
}).show();
new AlertDialog.Builder(SecondActivity.this)
.setTitle("结束")
.setMessage("恭喜你完成游戏!")
.setPositiveButton("好的",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
}
}).show();
导出成apk文件
- 选择
Build
-> Generate Signed APK
- 弹出新窗口后选择
Create new…
- 设置好路径、密码等信息后选择
OK
- 然后一路
Next
最后选择Finish
即可
成员项目感想
- 范雯琪:其实我们的app现在实现的功能很简单,起初我们只做了5×5一个模式的,后来才加入了其他模式和游戏介绍,但整体而言还有很多提升的余地,也没有做到界面优化,但是在这个过程中也学到了很多,是个非常有趣而有意义的过程。
- 张昊然:在一开始编一个app比较难,但在过程中学习,发现是可以试验的。通过这次编写,在暑假中复习了课本知识,学习了相关技能,收获不小。另外还要感谢,项目中的另外一位成员,她的贡献比我大很多,我们一起合力完成了本次任务。
获小黄衫感想
- 很惭愧拖了整整两个月才写感想,获得小黄衫纯属是意外收获,因为我自认为在班里学习java不是最刻苦的,也不是最有天赋学得最好的。可能唯一的优点就是能够坚持,在学期期末大家把重心放到复习上的时候,依旧坚持好好写博客。学习方法什么的经过了一个学期大家各自自己的学习方法应该都已经成熟了,我唯一觉得自己比较好的习惯是老师上课时讲的一些知识点或者错题会用word文档记录下来,而不是干干地听着或者自己干什么其他事情。
- 我很喜欢王国维提出的“读书三境界”:古今之成大事业、大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'。此第一境也。'衣带渐宽终不悔,为伊消得人憔悴。'此第二境也。'众里寻他千百度,蓦然回首,那人却在灯火阑珊处'。此第三境也。我觉得不只是读书,换到学习任何一门课程上也应该是这样。
- 刚开始学习的时候,重要的是“望尽天涯路”,要看,要博览,不能只局限在课本上的内容和代码,要学会自己去上完查,自己去不断修改代码尝试新的东西。到了第二阶段就是要学会思考,学而不思则罔,思而不学则殆,就好像每周的学习都要让我们记录在看教材和运行过程中的问题,这其实就是一个引导我们去思考的过程,不能浮于知识的表面,一定要有自己深刻的理解,遇到问题时,不要做“伸手党”,直接去问老师,问助教或者问同学,那样对学习其实并没有多大的帮助。第三个阶段可以叫做“返璞归真”,我相信在上学期学习的过程中大家都有这样的经历,为了某一个程序修改了上百遍上千遍代码,不论怎么改都得不到满意的答案,但是在最后真正找到答案的时候,就会有一种恍然大悟的感觉,原来它其实并没有自己想象得那么难。
- 原本我觉得我已经足够努力了,但经历了开学的一些事情之后我发现,我还没有努力没有优秀到可以让人不用顾忌其他任何事地选择我,很遗憾我也没能做到我所期望的“珍惜天赋,保持悲悯”,未来还有很长的路要走,加油吧。
参考资料