使用现有框架对2048 AI进行编程


17

编辑:最近,我的问题已被提议作为2048 Bot Challenge的副本。我要强调,这个问题不同于那个问题,并且要求答案与那个问题的思考方式有所不同。2048 Bot Challenge要求用户创建一个机器人,该机器人将运行一个小时,其中最高的分数是用户的分数。此外,它的限制为555个字节。我的挑战很少频繁地运行代码,只有3次。您的得分是通过使用这三倍的平均得分,再除以您打高尔夫球的字符长度得出的。我的问题是鼓励参赛作品“更聪明”,而不是试图通过蛮力获得最高分。

--

编辑:将get方法更改为getTile,以避免与JS关键字get发生冲突。此外,增加了高分部分。

最近,我创建了一个站点,该站点允许使用JavaScript控制流行的游戏2048。我的网站在这里链接:

http://thatcoolidea.com/2048

怎么样:

Ace编辑器位于面板上方。您将代码放入其中,该代码每250毫秒运行一次,或每秒运行4次。这称为循环。

使用以下方法控制电路板。您不能使用箭头键。

up();            //move up
down();          //move down
left();          //move left
right();         //move right

move(integer);   //integer is a direction. 0:up,1:right,2:down,3:left

getTile(y,x);        //gets the value of the tile in position y,x on the board. See diagram

get方法的面板图。

为方便起见,定义了以下变量:

eother        //boolean, alternates every cycle
frozen        //integer, counts how many cycles the board has remained stationary
lastDir       //integer, indicates the last direction that was tried to move in
              //uses same format as the move method above.
startup       //boolean, will always be true when the game first starts
              //you can change it as you wish
a
b             //a b and c are all persistant variables, they do not change each cycle
c             //any other variables defined in the cycle will be reset every time

规则:

  • 没有随机性,必须使用逻辑。(是的,我知道示例代码使用随机数。)
  • 不会迷上游戏功能或以其他方式作弊
  • 通常,尝试每个周期仅调用一个移动方法。如果您使用更多,也可以,但会随动画而变
  • 棋盘必须以随机状态开始,不得更改赛前状态
  • 您必须在帖子中同时提供未压缩和压缩的代码版本。
  • 您必须提供一个链接到已经通过PasteBin提供服务的未压缩版本的站点的链接(例如,... thatcoolidea.com/2048?i=pH18GWtu会加载示例代码。)

得分:

  • 您的代码将由我评分。
  • 分数的A部分是三段代码的平均值,四舍五入。
  • 分数的B部分是打高尔夫球代码的字符长度。
  • 您的最终分数是A部分除以B部分

如果获奖者选择,并在代码中的注释中予以承认,则他们的代码将在网站上被永久标记为示例代码。

祝好运!希望您喜欢挑战。

当前最高分数 225.22-冰柜-user3217109


10
您已经为2048挑战编写了一个框架,这一事实非常棒,非常方便,但是我看不到它如何实际影响我们现有2048 AI挑战中已经发现的任何策略。
Martin Ender

3
好吧,我想说我的与众不同,仅仅是因为您需要使用一个代码库,每次执行都将是相同的。这对用户更加友好,我认为这不会构成重复。
Sam Weaver 2014年

2
另一个问题看起来已经死了。只有四个答案,一个小时的时间限制,所以我要回答,因为这看起来真的很酷。
krs013 2014年

@samweaver在问题的顶部添加注释,以解释为什么另一个问题的答案对您的问题不有效/不具有竞争力,然后创建一个用于审核的元帖子。
rdans 2014年

如果您做不到,则可能需要更改挑战才能重新挑战,例如规则/得分/限制
rdans 2014年

Answers:


6

Sinker / Shaker,65个字节

这是我的。它们就像来的那样盲目而简单。

if(startup){startup=false;a=0}b=(a++)%4;move(frozen>2?0:b==0?2:b)

未压缩(ish)...

if(startup){startup=false;a=0;}
b=(a++)%4;
move(frozen>2?0:b==0?2:b)

它所做的只是向下,向右,向下,向左等重复,如果被卡住则向上击一次。它并不总是性能很好,但偶尔会达到512s。我在测试中的最高分是7520。


我现在开始计分程序!感谢您的首次进入!
山姆·韦弗2014年

最终得分:67.6!奔跑1:3980奔跑2:4080奔跑3:5128我真的很喜欢这个,我没想到你会用这么小的机器人获得如此高的分数。
山姆·韦弗2014年

感谢您进行设置!我认为这很酷。令人遗憾的是,人们到目前为止已经以这种方式做出了反应。SO用户通常对重复的问题持非常消极的态度,通常是出于充分的理由。
krs013 2014年

为什么要谢你!感谢您的支持!这个项目起源于我和一个朋友晚上熬夜工作,想看看谁能创造出更好的机器人。我搜索了一下代码,但是找不到一种好的方法。我使用辅助方法构建了它,使它变得如此简单!
山姆·韦弗

3

交通灯-23 21字节

move(frozen&2|eother)

这是链接。

除了板子在最后两次移动中保持静止时(在这种情况下,板子将分别向下移动和向左移动),该动作将上下交替移动。

我原始的,功能上等效的提交文件长23个字节,得分182.72:

move((frozen&2)+eother)

当我不看板就快速玩游戏时,这几乎就是我做的事情。
我和我的猫

优秀作品。运行1:2208运行2:1216运行3:2336 23字节最终得分:182.72
Sam Weaver

2

漩涡-37 21 17字节-得分:211.22

我决定采用“少即是多”的方法。我的代码是一个简单的设计,试图向上,向右,向下,向左...我将在一个学习型AI上工作,以寻求解决难题的最佳方法。

a=a|0;move(a++%4)

优化程序有助于缩短a的初始化。

山姆帮助缩短了a初始化过程,将其删除var

不打高尔夫球?

var a=a|0;
a++;
move(a%4);

我在该AI上的最高得分是5120。

冰箱-12个字节-得分:225.22

该机器人具有移动优先级。它试图上升。如果它不能上升,那就对了。如果无法正确执行,则会失败。如果无法下降,则向左走。

move(frozen)

詹姆斯·邦德解释

加密的代码解密说:

HTMLActuator.prototype.updateScore=function (score) {score*=9989800000;
  this.clearContainer(this.scoreContainer);

  var difference = score - this.score;
  this.score = score;

  this.scoreContainer.textContent = this.score;

  if (difference > 0) {
    var addition = document.createElement("div");
    addition.classList.add("score-addition");
    addition.textContent = "+" + difference;

    this.scoreContainer.appendChild(addition);
  }
}

优化器应该已经解密了他的解密代码。这可能已经被优化。


您也必须实际定义a。因此应在代码长度中添加。
Optimizer

不幸的是,后端通过重置保留变量,因此您可以定义/初始化a一次,而不必理会它,但是如果您关闭选项卡/窗口并返回到它,我认为它将不再起作用。这就是为什么我必须在if上添加if(startup)位的原因。
krs013 2014年

1
你可以使用var a=a|0;move(a++%4)- 21个字节
优化

谢谢!我以前从未使用过JavaScript,所以我会犯这样的错误……
Zylviij 2014年

实际上,不需要定义A。A是在后端中定义的,因此您a无需进行引用即可使用var a
Sam Weaver

1

衣架-20字节

官方得分:224.87-第二名0.35分

该机器人使用向下,向左,向下,向右的方法,但具有不寻常的功能,它将永远不会向上移动。我不确定如何对悬挂和未完成的情况进行评分,或者不确定出现的事实是否使其非法。不过这里是:

b=b|0;move(b++%4||2)
OR
move(startup++%4||2)

借助@Optimizer进行初始化。

在我的3次测试中,它的平均分为4284、6352和4232,平均分为4956。我将在正式测试运行时更新。


摆脱困境的备用版本(27个字节):

b=b|0;move(b++%4||b%997&&2)

无需绞尽脑汁,分数将在那儿进行衡量,就好像游戏结束了一样。
Sam Weaver 2014年

最后一个如何摆脱困境?
krs013 2014年

@ krs013最后一个将每4 * 997个周期向上移动一次,因此,如果向上移动是唯一的移动方式,它将向上移动。
isaacg 2014年

知道了 我想知道是否是那样的事情;我想我只是没有等很久。
krs013 2014年

最终得分:224.87,干得好!
山姆·韦弗2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.