Code Golf:2D平台游戏

Ivo*_*zel 26 language-agnostic code-golf rosetta-stone

挑战

  • 到达关卡的尽头!
  • 如果您恰好击中每个(C)oin块2次,则可获得奖励积分.

不允许

  • 以任何方式对命令序列进行硬编码.
  • 你最喜欢的"一种语言"碰巧只做一件事,就是解决这个问题.

如何

您的程序通过标准输入接收以下级别(没有换行符).
然后它必须打印出成功完成关卡所需的命令.

水平

  • S是你的起始位置.
  • E您需要完成关卡的位置.
  • C是一个有2个硬币的硬币块,你永远不必跳过其中一个以便能够完成关卡.
  • 无论 ç和_算作地面的话,只有脚踏实地没有浮动平台.
  • | 是一堵墙,为了完成水平,你需要跳起来的所有墙壁都是最高1墙高,所有更高的墙,你可以认为是一个你无法以任何方式摆脱的深渊.
  • x是尖峰,猜猜如果你触摸会发生什么.尖峰总是比它们周围的地面低一级.

所有级别都是4行高,每行63个字符宽.这使得每个级别总共252个字符.

>                       ______  ____       ________  ___        <
>    C            ______|    |  |  |  C  __|      |  | |   ____E<
>S______  __  ____|          |  |  |_____|        |__| |___|    <
>       xx  xx                xx                                <
Run Code Online (Sandbox Code Playgroud)

注意: > <仅用于说明边框,它们不包含在程序的输入中.还要注意你的文本编辑器,因为我多次搞乱了空白

命令

  • M =向右移动1,如果你下面没有地面,你会掉下来直到你击中它.你跌倒时不能移动.
  • J =跳跃,在接下来的3个命令中向上移动1或直到你击中(C)oin Block.在那之后,你会跌倒直到你到达地面.你只能在地面上跳跃.如果M让你与地面处于同一水平,则跳跃被取消.
  • O = NOP,会让你等待/什么也不做.这样你就可以跳出只有1个宽度的洞和尖刺(你不需要这个以上的等级,但如果你能解决需要它的等级,你将获得额外的分数).

解决方案(带硬币块)

连续命令堆叠在一起.
F表示你会摔倒的地方(记住你在跌倒时不能做任何事情),

                            MMMF                 MMMF            
    M                 MMMMMMJ  MMMMF M   MMMMMMMMJ  MMMF        
M   J MMMFMMMF  MMMMMMJ|    |  |  |F J MMJ|      |  | |F MMMMME
SMMMJMJ  MJ  MMMJ|          |  |  |MMJMJ|        |__| |MMJ|    
       xx  xx                xx                                
Run Code Online (Sandbox Code Playgroud)

产生的命令序列,长度为75个字符:

MMMMJJMMJMMMMJMMMMMMJMMMMMMJMMMMMMJMMMMMMMMMJJMMJMMJMMMMMMMMJMMMMMMMMJMMMMM
Run Code Online (Sandbox Code Playgroud)

希望这会产生一些有趣的结果......而不是大量的火焰:O

编辑

好吧,有比我最初想到的更多的可能性,我为所有的编辑道歉.

HoL*_*ieR 14

使用Javascript:

短版(334 280 256 240 238 236 233 223 207 205 196 184 182个字符)

a=prompt();j=i=0;while(a[++j*63]<(o="M"));while(++i<62){while(a[h=j*63+i]<"_")j++;if(a[h-63]>"B")o+="JJ";if(a[h+1]>"z")o+="J",j--;if(a[h+3]+a[h+1]=="_ ")o+="JMM",i+=2;o+="M"}alert(o)
Run Code Online (Sandbox Code Playgroud)

注意: Javascript方法提示符往往会删除某些浏览器上的空间(例如:Google Chrome).对于那些浏览器,它可能无法正常工作.在其他人(例如:Firefox)上,它会正常工作.

评论版

a=prompt(); // Read the input //
j=i=0;
while(a[++j*63]<(o="M")); // Place the cursor at the "S" //
while(++i<62){ // While we are not at the end point //
 while(a[h=j*63+i]<"_")j++; // If we are on a space, we fall //
 if(a[h-63]>"B")o+="JJ";// We jump for coins //
 if(a[h+1]>"z")o+="J",j--; // We jump when we reach a wall //
 if(a[h+3]+a[h+1]=="_ ")o+="JMM",i+=2; // We jump on gap //
 o+="M" // We add the movemment in the output
}
alert(o) // Output
Run Code Online (Sandbox Code Playgroud)


Chr*_*heD 10

Python 2.6 318 - 302 - 300 - 284 - 277 - 206 - 203 - 191 - 184个字符

基本上与HoLyVieR相同的方法(我想知道是否有很多完全不同的方向解决方案).从stdin读取.

更新1(318 - > 302):不检查E但假设它在63位(如评论中所述).
更新2(302 - > 300):改变range(0,252,63)到(0,63,126,189)(两个完整字符) 更新3(300 - > 284):似乎raw_input还获取stdin这样import sys等可以被丢弃. 更新4(284 - > 277):[y][x+3]=="_"and p[y][x+1]==" "到p[y][x:x+4]==list("_ _") 更新5(277 - > 206):去了字符串,而不是2维列表处理,大救...
更新6(206 - > 203):实施建议的评论HoLyVieR的答案(由Nabb提供) 更新7(203 - > 191):通过使用布尔字符串构建来打破200字符限制...
更新8(191 - > 184):小调整

欢迎所有意见或建议!

注意:我添加了一个(不需要的)\并newline在下面的代码中(EOL 5-> 6)(以避免滚动条在这里)

l=raw_input()
x,y,o=0,l.index('S')//63,''
while x<62:
 while l[y*63+x]==" ":y+=1
 b=y*63+x;g=l[b+1]>"z";h=l[b:b+4]=="_  _";o+=(l[b-63]>"A")*"JJ"+g*"J"+h*"JMM"+\
"M";y-=g;x+=1+h*2
print o
Run Code Online (Sandbox Code Playgroud)

用法: python 2dplatform.py < level.txt