Herbert

参加2006年的Imagine cup的预选赛时,时间已经不多了,第一轮结束就不能再登陆Herbert了,非常遗憾没有解决掉所有的关,不过当时留了个心眼,把Herbert登陆时与服务器通讯的原始tcp包抓了下来,一直想分析一下,然后让herbert直接读取包中的内容来启动。花了三天时间,终于整完了:Herbert

我破解完的Herbert有几个小bug

1.  每个小关我以前写的解决方案都在,但是换行符变成了“..”,得把..去掉并回车才能运行。

2.  每个小关机器人的初始位置不对,必须按一下开始(Ctrl+G)才能显示正确的位置。

3.  暂时不能保存写的解决方案。

4.  计分好像有差错。

 

破解过程:

1.  分析tcp包,过滤掉无用的,错误的包,把错位的包根据seqacklen码排好顺序。

2.  提取出Data,发现是个xml

3.  原先Herbert通过webservices获得一个dataset,现在“override”这个过程,直接从xml得到dataset

 

想法:

1.  做成web版本的,加上AJAX,注册了以后直接在网页上玩,然后来个积分榜……,注册用户还可以自己建关让大家玩

 

Note

1.  用户密码随意。

2.  Dotnet framework1.1

3.  玩的时候把下方的speed调到最高比较舒服,要不然Herbert走得太慢。

4.  开始的loadingdata过程较长,是正常的。

5.  一定要注意herbert的初始位置可能不对,按一下开始(Ctrl+G)才能显示正确的位置。

第一关的解决方案是:

a(A):rArAa(Ass)

a()

>>

 

Herbert 玩法:

官方规则(英语),翻译了几条主要部分:

1.     使用h语言对机器人进行编程

2.     目标是机器人按到所有的“button”(白色),并且需要避让开灰色的“button”和“wall

3.     按到灰色按钮将重置所有已经被按到的白色按钮,“wall”将阻挡机器人的前进。

4.     h语言:

a)       有着一般高级语言的元素:statements, procedures, parameters, arguments, and recursion

b)      h语言的指令只有三个:s(前进一步), r (右转), l (左转)

c)       过程的定义:x[(P1,P2,...,Pk)]:y1y2y3...yn x 是除了srl的任何小写字母, Pi 是参数, yi 是任何指令, 0 <=k <=15, and n >= 0. If k = 0 说明该过程没有参数。

d)      参数可以是数字,也可以是指令组合

e)       多说也说不清楚,看几个例子,可以在Herbert客户端的level0里面练习练习:

                        i.              a(a):sa(A-1)
a

                      ii.              b:sssrb
b

                    iii.              a:ssssra
sssa

                   iv.              a(A,B):f(B)ra(A-1,B)
f(A):sf(A-1)
a(4,5)

                     v.              a(A,B,C):f(B)Ca(A-1,B,C)
f(A):sf(A-1)
a(4,5,r)

f)        每个字母和数字算1byte,符号不算

5.     计分规则:

设:

Points:根据难度设置的关卡分值

TotalButtons :每关的白色按钮

Buttons按到的白色按钮

MaxBytes :每关的最大允许bytes

Bytes :实际使用的bytes

a)       If Buttons = TotalButtons and Bytes <= MaxBytes
score = (Points*MaxBytes)/Bytes.

b)      If Buttons < TotalButtons or Bytes > MaxBytes, you have not solved the level. Score = Buttons*PointsPerButton
PointsPerButton is determined as follows:

                        i.              If Bytes <= MaxBytes, PointsPerButton = (Points/(2*TotalButtons)).

                      ii.              If MaxBytes < Bytes <= 2*MaxBytes, PointsPerButton = (Points*(2*MaxBytes -Bytes)/(2*MaxBytes*TotalButtons)).

                    iii.              If 2*MaxBytes < Bytes, PointsPerButton = 0

 



Ecogiser's Blog
posted on 2006-07-02 11:29  Binary Race  阅读(899)  评论(5编辑  收藏  举报