算术游戏

辽宁师范大学 • 张大为@https://daweizh.github.io/noip/

我们日常生活中经常用到算术运算中的+/-法,比如去市场买菜。在任何工作中+/-运算都是重要的数字处理手段,对于我们学生而言,更是如此,没有计算精度和效率,很难取得好的成绩。

那么怎样提高我们计算+/-法的精度和效率呢?小明想设计一款计算机游戏程序来完成这项工作,他的设想如下:

  1. 该款游戏可以设定从任意级别开始玩,规定游戏级别对应数字的最大位数,如游戏级别level=5,则需要计算的两个数字中最大位数为5,同时规定游戏的最高级别为18(C++能装下的最多整数位)。如果不选择级别,默认为1级(即1位数)。
  2. 可以在游戏开始时选择+法或-法,如果不选择,默认为+法。
  3. 可以自由设定游戏难度,规定难度级别hard对应(61-hard)秒超时。比如你设定hard=30,但你做题用了32秒,则判你为超时,如果超时题数超过50%,难度hard减1。
  4. 每局游戏默认情况下要完成10道题,如果每局正确率不足50%,题数num自动加1。如果正确率≥90%,游戏晋级level+1。
  5. 如果题目正确率在50%和90%之间,且计算超时题目<50%,游戏难度hard自动加1。
  6. 小明想给每局游戏结果通过计算得分的方式冠名,计算方式是score=(correct+overtime*.5)*100/num;
    1. score=100,冠名为king
    2. 90 ≤ score < 100,冠名为excellent
    3. 80 ≤ score < 90,冠名为prefect
    4. 70 ≤ score < 80,冠名为ok
    5. 60 ≤ score < 70,冠名为low
    6. score < 60,冠名为bad
  7. 每局所有题目都做完了,游戏会问你是否继续,默认为y(是),输入n(否)。下一局的级别leve,难度hard和题数num由本局游戏成绩确定。
  8. 目前游戏还不能保存游戏状态,等小明竞赛获奖后,增加该部分功能。

下面通过玩这款游戏感知一下小明的理想。

> arith.exe

Please select level([1]-18):
Please select operator([+],-):
Please select Hard([1]-60):
Level=1,Operator=+,Hard=1,Disaplay=h,Number=10
4+2=6
Time used = 4.12        =>Right.

3+9=12
Time used = 4.15        =>Right.

6+2=8
Time used = 2.54        =>Right.

2+8=10
Time used = 1.71        =>Right.

3+9=12
Time used = 1.59        =>Right.

1+3=4
Time used = 1.52        =>Right.

2+3=5
Time used = 1.38        =>Right.

2+3=5
Time used = 1.27        =>Right.

3+3=6
Time used = 1.39        =>Right.

8+8=16
Time used = 2.66        =>Right.

right   wrong   overtime
---------------------------------
10      0       0

score=100       king

Continue this game?([y]/n)n

游戏做好了,小明玩了几天以后,发现这款游戏存在很大问题如:

  1. 游戏默认设定10道题太古板了,如果想从一开始就刷20到题,很难办到,通过积累战绩要很长时间才行。小明想在游戏开始运行时直接设定每局游戏的默认题数。
  2. 小明发现随着游戏级别level的增长,通过横式计算难度超大(记不住位数,好几次宝宝都难哭了),而大位数计算我们一般会用竖式。于是,小明想增加用竖式出题的功能。

大概是下面这个样子:

> arith --disp v --numb 2

Please select level([1]-18):3
Please select operator([+],-):-
Please select Hard([1]-60):3
Level=3,Operator=-,Hard=3,Disaplay=v,Number=2
                      637
-                     296
-------------------------
=341
Time used = 13.81       =>Right.

                      971
-                     137
-------------------------
=834
Time used = 15.85       =>Right.

right   wrong   overtime
---------------------------------
2       0       0

score=100       king

Continue this game?([y]/n)n

现在是竖式出题了,而且每局只有2道题。

可是,小明总记不住设定出题格式和设定默认题数的方法,于是小明想对游戏程序增加帮助功能,大概是下面这个样子的:

F:\a.steam\dreamx\wedo\code\arith>arith --help

Usage: game.exe [--help]|[--disp h|v]|[--numb 20]

--help :display help
--disp :show model of question. You can select h(horizontal)  or v(vertical)
--numb :question number

好了,现在小明可以舒舒服服地通过该游戏练习计算精度和速度了。

理想和和实现目标都有了,现在需要编程序了,小明想让你来做!!!