プログラミングコンテスト:JSDash

更新:競争は完了しました。 結果



Holaは待望の夏のプログラミングコンテストを発表します! 受賞者には賞品が期待されます。



  1. 1位:3000 USD。
  2. 2位:2000米ドル。
  3. 3位:1000米ドル。
  4. CCに住所を入力してこのコンテストへのリンクを誰かに送信し、その人が賞品を受け取った場合、賞品の半分の金額を受け取ることになります(もちろん、受賞者の賞品を損なうものではありません)。 そのような報酬を受け取ることができるのは、最初にリンクを送信した人だけです。


興味深い決定の著者はインタビューに招待されます。







ルール





英語でのコンテストの条件はGitHubで入手できます 。 以下はロシア語への翻訳です。





Jsdash



テキストゲームをプレイしましょう! 間違いなく、1984年に最初に公開された古典的なビデオゲームのクローンを認識します。



あなたの目標は、人間ではなく意思決定を行い、このゲームをプレイする人工知能を書くことです。 ゲームはリアルタイムで行われ、スクリプトには人と同じくらいの意思決定の時間があります。



さらに読む前に、 game / jsdash.jsスクリプトを実行し、ゲームを数回プレイすることをお勧めします。 (注:Linuxでxtermを使用してゲームを開発およびテストしました。他のシステムでは動作する場合と動作しない場合があります。)



ゲーム



矢印キーは4つの方向にナビゲートできます。 緑の文字A



はあなたです。 空の空間または地球( :



を移動し、石( O



)を水平方向に空の空間に押し込み、ダイヤモンド( *



)を収集できます。 レンガ( +



)とスチール( #



)を通過することは不可能です。 石とダイアモンドは、サポートなしで放置されると落下し、横に転がり合ったり、レンガから転がります。 落下物はプレイヤーを殺します。 蝶(アニメーション/|\-



)は、落下オブジェクトにぶつかるだけでなく、プレーヤーと接触して爆発し、移動の可能性なしにロックされます。 蝶の爆発は鋼鉄以外の物質を吸収し、プレイヤーを殺す可能性があります。 爆発後、収集可能なダイヤモンドが形成されます。



ダイアモンドごとに、1ポイントが付与されます。 2秒未満の間隔で3つのダイヤモンドを収集すると、それぞれのポイントに加えて、3つの賞品ポイントが付与されます。 2秒以上の間隔を空けずにダイヤモンドをすばやく収集し続けると、各素数について、5番目のダイヤモンドの後5ポイント、7番目の後7ポイント(以前のすべてのボーナスに加えて)などが得られます。 殺された蝶の場合、プレイヤーが爆発で殺されなかった場合、10ポイントが付与されます。



ゲームの制限時間は2分です。 Q、Esc、またはCtrl-Cを押すと、ゲームをより早く中断できます。 得点は失われません。 Pキーを使用すると、ゲームを一時停止できます。



残りの時間、ポイント、および賞の流れ(ホットストリーク)に関するメッセージは、プレイフィールドの下のステータスバーに表示されます。



ゲーム全体の仕組みは、1984年モデル( ボールダーダッシュファンサイトで詳細に説明されています )に対応していますが、簡単にするために、すべてのタイプのオブジェクトを使用しないことにしました。 最大の違いは、上記のスコアリングシステムと、このレベルでは解決策がないという事実です。 ゲームの目的は、キャラクターが死亡するか、時間が経過した後にゲームが終了する前に、できるだけ多くのポイントを獲得することです。 ゲームの仕組みの詳細に興味がある場合は、 game.jsモジュールのソースコードを読んでください。



解決策



ソリューションは、依存関係のないNode.jsモジュールです。 モジュールは1つの関数をエクスポートする必要があります。

 play(screen)
      
      





ゲームはモジュールをロードし、 play



関数を1回呼び出して、 screen



パラメーターとしてゲームの初期状態を渡します。 これは、ステータスバーを含む画面の各行に対応する行の配列です。 行には、画面上に表示されているものだけが含まれ、ANSI色で色付けされていません( --no-color



パラメーターを指定して実行すると、コンソールでこのモードでゲームを見ることができます)。 play



機能はジェネレーターでなければなりません。 移動するには、ステップアップ、ダウン、右、または左にそれぞれ'u'



'd'



'r'



または'l'



の値を生成(生成)する必要があります。 'q'



生成するか、ジェネレーターをシャットダウンして(戻る)、スケジュールより早くゲームを終了することもできます(蓄積されたポイントは失われません)。 他の値を生成する場合、それは「その場にとどまる」ことを意味します。 移動が不可能な方向(壁など)に移動しようとすることは禁止されていません。キャラクターは単に所定の位置にとどまります。 各yieldの後、 screen



配列の内容が更新され、コードはそれをさらに分析してさらに決定することができます。



関数が例外を発生させた場合、ゲームは0ポイントのスコアで終了します。 これにより、プログラムが他のレベルでプレイしてポイントを獲得することを妨げることはありません。



スクリプトは別のプロセスで実行されます。 たとえフリーズしても、ゲームの速度が低下することはありません(キャラクターはそのまま残ります)。



ゲームの状態は100ミリ秒ごとに更新されます。 play



機能がコマンドをより速く生成する場合、キャラクターは毎秒10回移動します。 各コマンドの後、ジェネレーターは、100ミリ秒のラウンドの終わりまでyield



をロックします。 関数が100ミリ秒より長い動きを「考える」と、動きをスキップし始め、関数が動きを制御できなかった場合、キャラクターはそれらのラウンドでその場に留まります。 この場合、ジェネレーターには画面の中間状態も表示されません。 たとえば、スクリプトが2つのyield



間で250ミリ秒間「考える」場合、2つの画面状態は表示されませんが、2ラウンドの間キャラクターは動かないままです。 したがって、プログラムがより高速に動作する場合のように、移動を行う2つの機会が失われます。 その後、ジェネレータはラウンドの終了まで50ミリ秒間ブロックされ、それによって生成されたコマンドが実行されます。



動作する人工知能スクリプトの非常に簡単な例は、 game / example.jsファイルにあります。 ラウンドごとにすべての可能な動き(プレイヤーの位置の隣に空のスペース、地球、移動可能な石、またはダイヤモンドがある方向)を見つけて、それらの1つをランダムに選択します。 通常、このスクリプトはゲーム開始直後に殺されます。



テスト中



GitHubで提供するjsdash.jsスクリプトは、インタラクティブなゲームであるだけでなく、強力なテストツールでもあります。 --help



オプションを指定して実行し、すべての機能について学習します。



弊社に送信された各ソリューションは、少なくとも20の自動生成レベルで起動されます。 決定がすべてのレベルで最も多くのポイントを獲得する参加者が勝者として認識されます。 リーダー間の「引き分け」を除外するために、必要に応じて、(すべての参加者に対して)レベルの数を増やす権利を留保します。 これが役に立たない場合は、先に彼の決定を送信した人が勝ちます。



各ソリューションをテストするとき、すべての参加者のプログラムが同じレベルを受け取るように、同じ乱数セットが疑似乱数ジェネレーターに使用されます。 ソリューションを起動するとき、デフォルト設定を使用します。



 jsdash.js --ai=submission.js --log=log.json --seed=N
      
      





ただし、デバッグに役立つすべての使用可能なコマンドラインオプションに注意することをお勧めします。



競争の終わりに、各テストレベルでの各ソリューションのゲームの記録が公開されます。 これらのレコードは、次のコマンドで再生できます。



 jsdash.js --replay=log.json
      
      





すべてのソリューションのテストは、Ubuntu 14.04(amd64)を実行しているAmazon AWSのc3.large仮想サーバー(ここのハードウェア仕様を参照)で行われます。 ソリューションは、マシンに他の負荷がない状態で1つずつテストされます。



テストスクリプトのバグを修正し、参加者から報告されます。 ゲーム/CHANGELOG.mdファイルにご期待ください!



ソリューションの提出



決定を送信するには、 当社のWebサイトフォームを使用してください 。 メールで決定することはありません!



ソリューションコードは多くの場合、生成、最小化、または別の言語から翻訳されるため、フォームにはソーステストを含むアーカイブを送信するためのフィールドも含まれます。 コードが生成される場合、ジェネレーターをオンにします。 最小化されている場合は、元のバージョンを有効にします。 コードがCoffeeScriptまたは別の言語から翻訳されている場合は、コードが記述されている言語でコードを含めます。 また、ソリューションへのアプローチの簡単な説明(英語)とともに、アーカイブにREADMEファイルを含めることをお勧めします。 アーカイブは、tar.gz、tar.bz2、またはzip形式である必要があります。 アーカイブの内容は公開されますが、テストされません(アーカイブ外に送信したJSファイルのみをテストします)。



JSファイルの最大サイズは64 MiBに設定されています。 これは任意に選択された図で、主に誰かの「解決策」がすぐにディスクをいっぱいにしないようにするために存在します。 ソリューションが実際に64 MiBを超える場合は、弊社までご連絡ください。制限を引き上げます。



問題の状態や解決策の送信に関する問題について質問がある場合は、コメントまたは手紙を書いてください。



すべての参加者に幸運を!



All Articles