aBOTkalipkan Sekarang

8

aBOTcalypse

Desain bot untuk bersaing dalam tantangan King-of-the-Hill! Berikut ini ulangan dari game bot default.

Papan permainan ini 2D, seperti gim video gulir samping (tetapi tanpa gulir).

Bot yang valid harus menerima representasi string multiline dari wilayah papan yang dapat dilihatnya, dan menampilkan gerakan untuk bot tersebut.

Mekanika

Ini adalah game bertahan hidup. Kiamat telah tiba, dan hanya bot (dan persediaan batu yang tak ada habisnya disimpan di hammerspace ) tetap. Setiap bot diberi lokasi awal yang acak, pada ketinggian 0. Dalam gerakan tertentu, bot dapat beristirahat, bergerak, melempar batu, atau menjatuhkan batu. Bot dapat berbagi ruang dengan batu yang tidak bergerak, tetapi bot yang bertabrakan dengan bot lain atau meteor terbunuh, seperti bot yang terkena lemparan batu.

  • Gravitasi: bot dan batu harus diletakkan di atas lantai papan atau di atas batu lain; bersandar pada sesuatu yang lain (udara, meteor, bot, dll.) meninggalkan satu "tidak didukung". Bot atau batu yang tidak didukung akan jatuh sampai mereka didukung; jatuhnya lebih dari satu ruang akan membunuh bot, dan bot di bawah batu atau bot yang jatuh juga terbunuh. Ini berarti bahwa mencoba untuk memindahkan atau drop up hanya akan berfungsi jika bot saat ini berbagi ruang dengan batu (jika tidak bot / batu akan jatuh kembali ke bawah 1 ruang). Sebuah ruang dapat menjadi "tidak didukung" jika batu di bawahnya jatuh atau dihancurkan oleh meteor atau proyektil .
  • Meteor: Setiap belokan meteor memasuki papan dari atas. Meteor memiliki kecepatan magnitudo 2, dengan sudut acak yang dipilih secara seragam dalam kisaran [-180,0], dan posisi awal x acak. Meteor jatuh dalam garis lurus sepanjang lintasan yang diberikan sampai mereka menabrak sesuatu, pada titik mana mereka menghilang. Perhatikan bahwa pembulatan dalam gerakan meteor mengarah ke 0 (sesuai python int()).
  • Proyektil: Bot dapat memilih untuk melempar batu sejauh apa pun hingga ketinggiannya. Sebuah batu yang dilemparkan bergerak dalam garis lurus hingga menyentuh sesuatu (semua dalam satu belokan, tidak seperti meteor; batu yang dilemparkan tidak muncul di papan), pada kemiringan - elevation / max distance. Perhatikan bahwa batu yang dilempar memulai lintasannya di x + - 1 persegi. Misalnya, jika bot berada pada ketinggian 5, dan melempar ke kiri sejauh 1, batu akan mulai pada (x-1,5)dan berakhir pada (x-2,0). Tabrakan hanya diperiksa dalam langkah-langkah dx=1, dan dydibulatkan ke 0 (sesuai python int()).

Memasukkan

Setiap bot dapat melihat 20 piksel persegi di setiap arah (jarak Chebyshev = 20), hingga batas papan. Ada 8 karakter berbeda di setiap string input:

  • '#' (batas papan)
  • '.' (udara)
  • '@'(meteor)
  • '&' (batu)
  • 'e'/'s' (bot musuh, atau dirinya sendiri)
  • 'E'/ 'S'(bot musuh, atau dirinya sendiri, berbagi ruang dengan batu)

Berikut ini contoh input (akan ada jeda baris \n):

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

Keluaran

Ada empat tindakan yang bisa dilakukan setiap bot.

  • rest (secara harfiah duduk dan tidak melakukan apa-apa)
  • move <direction>bergerak bot satu ruang di salah satu dari empat arah, up, down, left, atau right. Gerakan menyebabkan bot jatuh jika ruang baru tidak didukung oleh lantai atau batu (fall > 1 = bot.kill() ).
  • drop <direction>menempatkan ("menjatuhkan") batu ke arah yang ditunjukkan. Menjatuhkan batu ke atas (yaitu, menempatkan batu di bujur sangkar [bot_x, bot_y+1]) atau ke samping menyebabkannya jatuh sampai tertopang (mungkin jatuh ke bot selama drop up).drop downmenempatkan batu di posisi yang sama dengan bot, jika belum ada batu di sana.
  • throw <direction> <distance>melempar batu sesuai mekanika "proyektil" di atas, dengan jarak maks yang ditunjukkan. Max jarak tidak relevan untuk melempar ke atas atau ke bawah - proyektil bertabrakan dengan kotak di bawah (untuk down), atau upaya untuk bertabrakan dengan kotak di atas (untuk up) dan kemudian dengan kotak bot jika tidak mengenai apa pun (membunuh bot) .

Bot dalam kontes harus menampilkan string skalar dengan aksinya setelah menerima string input.

Antarmuka

Bot harus terdiri dari satu program yang dapat dipanggil melalui python 2 subprocess. Perintah apa pun harus ditunjukkan, dan akan disimpan dalam file bernama command.txt; sebelum permainan dimulai, pengontrol akan mengeksekusi setiap perintahcommand.txt berurutan, dan kemudian perintah terakhir akan digunakan untuk meneruskan input ke bot sejak saat itu.

Bot mungkin memiliki satu file penyimpanan yang disebut storage.txtdi foldernya; bot "Default Thrower" menunjukkan contoh implementasi, menggunakan json untuk menyimpan kondisinya selama berbagai belokan. Selain itu, jangan ragu untuk menyertakan hasil debugging dalam penulisan sajaerrlog.txt , yang akan saya sampaikan seandainya bot Anda gagal selama proses. Saya akan memastikan untuk menjalankan beberapa tes dengan setiap bot, untuk mencoba dan menemukan kesalahan sebelumnya.

Mencetak gol

Skor total bot sama dengan jumlah putaran yang bertahan, diakumulasikan pada X game dengan panjang maksimum Y. Saat ini, X,Y = 10, 500 ,; jika bot bertahan lama, saya akan meningkatkan Y, dan jika mereka bertahan lama, saya akan meningkatkan X.

Kode pengontrol ditemukan di controller.py ; banyak terima kasih kepada @Nathan Merrill untuk koth DDOS-nya dari mana saya mengadaptasi kode Communicator.

Sirpercival
sumber
Apa yang mencegah bot membuat struktur seperti itu &&&\n&S&\n###? Mereka akan kebal terhadap meteor jatuh.
LegionMammal978
tidak ada sama sekali. Namun, mereka harus membangun kembali sebagian struktur jika terkena apa pun (yang melibatkan terpapar pada salah satu lapisan luar selama proses pemeliharaan), dan mereka masih harus berurusan dengan bot lain.
sirpercival
Sejauh yang saya bisa lihat, tidak ada cara untuk menggali batu.
LegionMammal978
apa yang kamu maksud dengan "menggali"? setiap bot memiliki batu sebanyak yang diinginkan, disimpan di hammerspace (saya akan mengedit tautan itu ke pertanyaan). atau maksud Anda menghancurkan batu? jika itu yang terjadi, maka sebuah batu hancur ketika terkena proyektil apa pun, bukan hanya meteor. Sadari juga bahwa bot lain dapat melenggang langsung ke benteng Anda.
sirpercival
1
Anda harus menambahkan fakta bahwa meteor / proyektil menghancurkan batu.
LegionMammal978

Jawaban:

1

Python 2, Edgebot

Edgebot ingin bersembunyi di sudut dan membangun menara. Mereka akan berlari ke satu ujung, membangun sedikit, lalu mulai menjatuhkan batu untuk membangun dinding. Edgebot tidak suka pengunjung, dan akan melempari siapa pun yang terlalu dekat dengan menara. Jika semuanya salah dan edgebot mogok, itu akan menjatuhkan batu ke kepalanya sendiri

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])  

Maaf untuk semua suntingan, tidak menjalankan cukup kasus uji sebelum mengirim. Ada masalah kecil karena si kecil akan mencoba memanjat papan atas dengan waktu yang cukup, tetapi mudah-mudahan itu tidak akan menjadi masalah di sebagian besar pertandingan. Edgebot sekarang harus melempar batu dengan jarak acak begitu memanjat cukup tinggi

Sunting terakhir untuk saat ini. Edgebot sekarang akan melemparkan batu ke siapa pun yang cukup dekat antara itu dan dinding. Tidak masuk akal mengeluarkannya dengan berlari melalui seseorang

Ahli LogikaDenganat
sumber