既存のフレームワークを使用して2048 AIをプログラムする


17

編集:最近、私の質問は2048ボットチャレンジの複製として提案されました。この質問はその質問とは異なり、回答をその質問とは異なる方法で考える必要があることを強調したいと思います。2048ボットチャレンジは、ユーザーにボットを作成するように要求し、ボットを1時間実行します。最高スコアはユーザーのスコアです。さらに、555バイトの制限がありました。私のチャレンジでは、コードの実行頻度ははるかに低く、3回だけです。スコアは、これらの3回の平均スコアを使用して、ゴルフコードの文字長で割ることによって計算されます。私の質問は、エントリが「スマート」であり、総当たりで最高のスコアを取得しようとしないことを奨励しています。

-

編集:getメソッドがgetTileに変更され、JSキーワードgetとの競合を回避しました。さらに、高得点セクションが追加されました。

最近、JavaScriptを使用して人気のあるゲーム2048を制御できるサイトを作成しました。私のサイトはここにリンクされています:

http://thatcoolidea.com/2048

どうやって:

Ace Editorはボードの上にあります。コードを配置します。コードは250ミリ秒ごとに1回、または1秒間に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

ルール:

  • ランダム性はありません。ロジックを使用する必要があります。(はい、私はサンプルコードがランダムを使用することを知っています。)
  • ゲーム機能へのフックや他の方法での不正行為はありません
  • 通常、サイクルごとに1つのmoveメソッドのみを呼び出してください。さらに使用しても問題ありませんが、アニメーションにねじ込みます
  • ボードはランダムな状態で開始する必要があり、ゲーム前の状態を変更しないでください
  • 投稿には、コードの非圧縮バージョンとゴルフバージョンの両方を提供する必要があります。
  • PasteBinを介して提供されるコードの非圧縮バージョンを既に読み込むサイトへのリンクを提供する必要があります(たとえば、... thatcoolidea.com/2048?i=pH18GWtuはサンプルコードを読み込みます)。

得点:

  • あなたのコードは私によって採点されます。
  • スコアのパートAは、コードの平均3回の実行であり、切り捨てられています。
  • スコアのパートBは、ゴルフコードの文字の長さです。
  • 最終スコアはパートAをパートBで割ったものです

勝者は、選択した場合、サイト上のサンプルコードとしてコードを不滅化し、コード内のコメントで承認します。

幸運を!チャレンジをお楽しみください。

現在のハイスコア 225.22-フリーザー-user3217109


10
2048用のフレームワークを作成したという事実は、このタイプのチャレンジにとっては非常に素晴らしく、非常に便利ですが、既存の2048 AIチャレンジですでに見つかった戦略に実際にどのように影響するかはわかりません。
マーティンエンダー14

3
私は、実行ごとに同じコードベースを1つ使用する必要があるという理由だけで、私のものは異なると言います。これははるかにユーザーフレンドリーであり、重複するとは思わない。
サムウィーバー14

2
他の質問はかなり死んでいるようです。答えは4つだけで、時間制限は1時間でしたので、これは本当にクールに見えるので答えます。
krs013

@samweaverは、質問の上部にメモを追加して、他の質問からの回答があなたの質問に対して有効/競合的でない理由を説明し、精査のためのメタ投稿を作成します。
ルダン14

あなたがそれを行うカント場合、あなたはおそらくそれが再オープンなどのルール/スコアリング/制限を得るためにあなたの挑戦を変更する必要があります
rdans

回答:


6

シンカー/シェーカー、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)

それは、下、右、下、左などを繰り返し、スタックした場合に一度ヒットするだけです。常にうまくいくとは限りませんが、ときどき512を取得します。テスト中の私のハイスコアは7520でした。


現在、採点プロセスを開始しています!最初のエントリーをありがとう!
サムウィーバー14

最終スコア:67.6!実行1:3980実行2:4080実行3:5128私はこれが本当に好きで、このような小さなボットでこんなに高いスコアを得ることができるとは思いませんでした。
サムウィーバー14

設定していただきありがとうございます!かなりクールだと思います。これまで人々がこのように反応してきたのは悲しいことです。SOユーザーは、通常、正当な理由により、重複した質問に対して非常に否定的な傾向があります。
krs013 14

それはどうもありがとう!サポートに感謝します!このプロジェクトは、友人と私が仕事で夜遅くまで泊まり、誰がより良いボットを作ることができるかを知りたいと思ったときに始まりました。コードを検索しましたが、うまくやる方法が見つかりませんでした。これをヘルパーメソッドで構築して、非常に簡単にしました!
サムウィーバー14

3

信号機-23 21バイト

move(frozen&2|eother)

これがリンクです。

これは、ボードが最後の2つの動きの間静止したままである場合を除き、上下に交互に移動します。その場合、ボードはそれぞれ下と左に移動します。

私のオリジナルの機能的に同等の提出は23バイト長で、182.72を記録しました。

move((frozen&2)+eother)

これは、実際にボードを見ずに素早くプレイするときとほぼ同じです。
私と私の猫14

素晴らしい仕事。実行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);
  }
}

オプティマイザーは、復号化されたコードをゴルフする必要がありました。これは#Optimizedでした。


実際に定義する必要aもあります。そのため、コード長に追加する必要があります。
オプティマイザー14

残念ながら、バックエンドはリセットを通じて変数を保持するため、a一度定義/初期化してそれを忘れることができますが、タブ/ウィンドウを閉じて戻った場合、もう機能しないと思います。これが、私がif(startup)ビットを追加しなければならなかった理由です。
krs013 14

1
使用できるvar a=a|0;move(a++%4)-21バイト
オプティマイザー14

ありがとうございました!私はそのようなミスをしますので、私は...、前にJavaScriptを使用したことがない
Zylviij

実際には、Aを定義する必要はありません。あなただけ使用して、それを参照できるようにAは、バックエンドで定義されているaことなしvar a
サム・ウィーバー

1

ハンガー-20バイト

公式スコア:224.87-0.35ポイントで2位

このボットは、下、左、下、右のアプローチを使用しますが、決して上に移動しないという珍しい機能を備えています。ハングして完了しないケースをスコアリングする方法、またはそれが発生したという事実が違法となるかどうかはわかりません。ただし、次のとおりです。

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

@Optimizerによる初期化パターン。

私の3回のテストで、平均4956、4284、6352、および4232を記録しました。公式のテストが実行されたら更新します。


ハングから抜け出す代替バージョン(27バイト):

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

ハングアップする必要はありません。ゲームが終了したかのようにスコアが測定されます。
サムウィーバー14年

最後の1つはどのようにハングアップしますか?
krs013 14年

@ krs013最後のものは4 * 997サイクルごとに1回上に移動するため、上が移動する唯一の方法である場合は上に移動します。
isaacg 14年

わかった。私はそれがそのようなものであるかどうか疑問に思いました。長く待たなかっただけだと思う​​。
krs013 14年

最終スコア:224.87、すばらしい仕事です!
サムウィーバー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.