aBOTcalypse Now


8

aBOTcalypse

キングオブザヒルチャレンジに参加するボットを設計してください!デフォルトのボットゲームの再生を次に示します。

ボードは、横スクロールビデオゲームのように2Dです(ただし、スクロールはありません)。

有効なボットは、ボードの見える領域の複数行の文字列表現を受け入れ、ボットの移動を出力する必要があります。

力学

これはサバイバルゲームです。黙示録が来て、ボット(そしてハンマースペースに保管されている岩の無限の供給)だけが残っています。各ボットには、標高0のランダムな開始位置が与えられます。特定の移動では、ボットは休息、移動、岩の投げ、または岩の落下を行うことができます。ボットは静止した岩とスペースを共有できますが、投げられた岩に当たったボットのように、別のボットや流星と衝突するボットは殺されます。

  • 重力:ボットと岩はボードの床または別の岩の上に置く必要があります。他の何か(空気、流星、ボットなど)で休むと、1つが「サポートされない」ままになります。サポートされていないボットやロックは、サポートされるまで落下します。1スペースを超える落下はボットを殺し、落下する岩またはボットの下のボットも殺されます。つまり、移動またはドロップアップの試行は、ボットが現在岩とスペースを共有している場合にのみ機能します(それ以外の場合、ボット/岩は1スペース下にフォールバックします)。スペースの下にある岩が落下したり、流星や発射物によって破壊されたりすると、スペースは「サポートされなくなり」ます。
  • 流星:流星は毎ターン上からボードに入ります。流星の速度は大きさが2で、[-180,0]の範囲でランダムに選択されたランダムな角度と、ランダムな開始x位置があります。流星は、何かにぶつかるまで、与えられた軌道に沿って一直線に落ちます。流星の動きの丸めは0に向かっていることに注意してください(Pythonのようにint())。
  • 発射物:ボットは、標高までの距離を問わず、岩を投げることを選択できます。スローされた岩は、何かにぶつかるまで直線的に移動します(流星とは異なり、すべて1ターンで、スローされた岩はボードに表示されません)- elevation / max distance投げられた岩はx +-1平方で軌道を開始することに注意してください。たとえば、ボットの高度が5で、左に1の距離を投げた場合、岩はで始まり、(x-1,5)で終わり(x-2,0)ます。衝突はのステップでのみチェックされdx=1dy(Pythonのようにint())0に向かって丸められます。

入力

各ボットは、ボードの境界まで、各方向に20ピクセルの正方形(チェビシェフ距離= 20)を見ることができます。各入力文字列には8つの異なる文字があります。

  • '#' (ボード境界)
  • '.' (空気)
  • '@'(流星)
  • '&' (岩)
  • 'e'/'s'(敵ボット、またはそれ自体)
  • 'E'/ 'S'(岩とスペースを共有する敵ボット、またはそれ自体)

以下は入力例です(改行はになります\n):

..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............................#
..............@...............#
.....................E........#
.....................&........#
.....................&........#
.....................&........#
.....................&........#
...........@.........&........#
....................s&........#
###############################

出力

ボットが各ターンで実行できるアクションは4つあります。

  • rest (文字通り座って何もしない)
  • move <direction>4つの方向のいずれかでボット1つのスペースを移動しupdownleft、またはright。新しいスペースが床や岩で支えられていない場合、動きによりボットが落下しfall > 1 = bot.kill()ます()。
  • drop <direction>指定された方向に岩を配置(「ドロップ」)します。岩を上に落とす(つまり、正方形に岩を置く[bot_x, bot_y+1])か、横に置くと、サポートされるまで(おそらく中にボットに落ちる)落下しdrop upます。drop down既に岩がない場合は、ボットと同じ位置に岩を配置します。
  • throw <direction> <distance>上記の「発射体」のメカニズムに従って、指定された最大距離で岩を投げます。最大距離は、上向きまたは下向きの投げには関係ありません-発射物は下の正方形downと衝突するか(の場合)、または上にある正方形と衝突しようとし(の場合up)、次に何もヒットしない場合はボットの正方形と衝突します(ボットを殺します) 。

コンテストのボットは、入力文字列を受け取ったときのアクションとともにスカラー文字列を出力する必要があります。

インターフェース

ボットは、Python 2を介して呼び出すことができる単一のプログラムで構成する必要がありますsubprocess。すべてのコマンドを指定する必要があり、と呼ばれるファイルに保存されますcommand.txt。ゲームが始まる前に、コントローラーはの各コマンドをcommand.txt順番に実行し、その後、最後のコマンドを使用して入力をボットに渡します。

ボットはstorage.txt、そのフォルダーに呼び出される単一のストレージファイルを持っている場合があります。「Default Thrower」ボットは、jsonを使用してさまざまなターン中にその状態を保存する実装例を示しています。さらにerrlog.txt、実行中にボットが失敗した場合に備えて、書き込み専用のデバッグ出力を含めることもできます。各ボットでいくつかのテストを実行して、事前にエラーを見つけてみます。

得点

ボットの合計スコアは、ボットが存続するターン数に等しく、最大長YのXゲームにわたって累積されX,Y = 10, 500ます。現時点では、ボットが長期間続く場合はYを増やし、ボットが短時間続く場合はXを増やします。

コントローラのコードはcontroller.pyにあります。Communicatorコードを適合させたDDOS kothについて@Nathan Merrillに感謝します。


ボットが次のような構造を作るのを妨げているものは何&&&\n&S&\n###ですか?彼らは流星の落下に対して無防備です。
LegionMammal978

何もありません。ただし、構造体の一部が再構築された場合(メンテナンスプロセス中に外層の1つが露出している場合)、他のボットに対処する必要があります。
sirpercival

私が見る限り、岩を掘る方法はありません。
LegionMammal978 2015年

「掘る」とはどういう意味ですか?各ボットには、ハンマースペースに保存されている岩がいくつでもあります(質問へのリンクを編集します)。それとも岩を破壊するつもりですか?その場合は、流星だけでなく、投射物に当たると岩が破壊されます。また、他のボットがあなたの拠点に侵入できることも理解してください。
sirpercival

1
流星/発射体が岩を破壊するという事実を追加する必要があります。
LegionMammal978 2015年

回答:


1

Python 2、Edgebot

Edgebotは隅に隠れてタワーを建てたいと考えています。彼らは一端まで走り、少し積み上げ、次に岩を落として壁を建てます。エッジボットは訪問者を好まないため、タワーに近づきすぎる人には岩を投げます。すべてがひどくうまくいかず、edgebotがクラッシュすると、自分の頭に岩が落ちます

import sys
from random import randint
class edgebot():    

    def playtime(self,board):
        try:   
            self.max_height = 5    
            board = board.splitlines()

            #find edgebot
            for y in xrange(0,len(board)):
                row = board[y]
                symbol = 's' if row.count('s') else 'S'
                x = row.find(symbol)
                if x >= 0:
                    self.height = 20 - y
                    break

            ground = board[len(board)-2]
            floor = board[len(board)-1]
            nasty_person = 'e' if ground.count('e') else 'E'
            bad_x = ground.find(nasty_person)
            side = ground.find('#')
            if abs(side - x) ==1:
                self.end_found = 1
            else:
                self.end_found = 0

            if side - x == -1:
                self.direction = 'right'
            else:
                self.direction = 'left'       


            #Bad edgebot! No climbing out of the game!           
            if floor[x] != '#':
                if board[self.height-1][x] == '&':
                    dist = randint(3,self.height)
                    return 'throw ' + self.direction + ' ' + `dist`
                elif symbol =='S':
                    return 'drop up'
                else:
                    return 'move down'

            #Edgebot will go through you to find a corner. You have been warned.    
            elif abs(x - bad_x) <=2:
                if x - bad_x >0:
                    return 'throw left 1'
                else:
                    return 'throw right 1'

            #edgebot wants to hide in a corner
            elif self.end_found ==0:
                if side == -1:
                    return 'move right'#edgebot is right-handed
                elif side - x < -1:
                    return 'move left'
                elif side - x > 1:
                    return 'move right'

            #Too close! Throw rocks at it!
            elif self.height+1>= abs(x-bad_x) and abs(x-bad_x) >=3:
                distance = abs(x - bad_x) - 2
                if distance < 1:
                    return 'throw ' + self.direction + ' 1'
                else:
                    return 'throw ' + self.direction + ' ' +`distance - 1`
                self.max_height += 2 #people came close, edgebot needs to be higher up!

            #edgebot wants a home in the corner        
            elif self.height <self.max_height :
                if symbol =='S':
                    return 'move up'
                else:
                    return 'drop down'

            #edgebot wants a wall. edgebot has, at best, a limited understanding of architecture        
            elif bad_x < 3 or self.height+1<abs(x-bad_x):
                if self.direction == 'right' and row[x+1] == '&':
                    self.max_height += 2
                    return 'drop down'
                elif self.direction == 'left' and row[x-1] == '&':
                    self.max_height += 2
                    return 'move down'
                else:
                    return 'drop ' + self.direction         

            else:
                return 'drop down' #Not sure? Hide under a rock!
        except:
            return 'drop up' #All gone horribly wrong? Squish.


print edgebot().playtime(sys.argv[1])  

すべての編集でごめんなさい、送信する前に十分なテストケースを実行しませんでした。小さな男が十分な時間を与えられてボードのトップから登ろうとするという小さな問題がありますが、うまくいけば、ほとんどの試合でそれが問題になることはありません。Edgebotは、十分に高く登ると、岩をランダムな距離だけ投げるようになりました

とりあえず最後の編集。Edgebotは、壁と壁の間に十分に近い人に岩を投げます。誰かを駆け抜けることで自分自身を取り除くのは無意味だ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.