มันคือชีวิตจิม แต่ไม่ใช่อย่างที่เรารู้


58

คุณอาจรู้จักเกมแห่งชีวิตของ Conwayหุ่นยนต์เซลลูล่าร์ชื่อดังที่ประดิษฐ์โดย John Conway นักคณิตศาสตร์ Lifeเป็นชุดของกฎที่ช่วยให้คุณสามารถจำลองกระดานสองมิติได้ กฎจะตัดสินว่าเซลล์ใดบนกระดานอยู่และเซลล์ใดจะตาย ด้วยจินตนาการคุณสามารถพูดได้ว่าLifeเป็นเกมที่ไม่มีผู้เล่นคนหนึ่ง: เกมที่มีวัตถุประสงค์เพื่อค้นหารูปแบบที่มีพฤติกรรมที่น่าสนใจเช่นเครื่องร่อนที่มีชื่อเสียง

เครื่องร่อน

เกมที่ไม่มีผู้เล่น ... จนถึงทุกวันนี้ คุณต้องเขียนโปรแกรมที่เล่น Game of Life - และเล่นเพื่อให้ชนะ King of the Hill-style แน่นอนว่าคู่ต่อสู้ของคุณพยายามทำเช่นเดียวกัน ผู้ชนะคือทั้งบ็อตสุดท้ายที่มีเซลล์ใด ๆ สดหรือผู้เล่นที่มีเซลล์สดมากที่สุดหลังจาก 10,000 รุ่น

กฎของเกม

กฎนั้นใกล้เคียงกับชีวิตปกติ (B3 / S23):

  • เซลล์มีชีวิตที่มีเพื่อนบ้านที่เป็นมิตรน้อยกว่าสองคนเสียชีวิตจากความอดอยาก
  • เซลล์ที่มีชีวิตซึ่งมีเพื่อนบ้านที่เป็นมิตรสองหรือสามคนยังมีชีวิตอยู่
  • เซลล์ที่มีชีวิตซึ่งมีเพื่อนบ้านที่เป็นมิตรมากกว่าสามคนเสียชีวิตเนื่องจากมีประชากรมากเกินไป
  • เซลล์ที่ตายแล้วตรงกับสามเพื่อนบ้านของผู้เล่นคนเดียวกันมามีชีวิตอยู่เพื่อต่อสู้กับผู้เล่นที่มีให้ไม่มีเพื่อนบ้านศัตรู

... แต่หลังจากแต่ละรุ่นทั้งคุณและคู่ต่อสู้จะมีโอกาสเข้าแทรกแซง คุณสามารถตื่นได้มากถึง 30 เซลล์เพื่อต่อสู้เพื่อคุณ (ผู้ที่ไปก่อนจะถูกตัดสินใจโดยเซิร์ฟเวอร์)

กระดานเป็นเซลล์สี่เหลี่ยมจัตุรัส (x, y) ช่องสี่เหลี่ยมทั้งหมดจะเริ่มตาย เส้นขอบไม่พันกัน (นี่ไม่ใช่โลกที่มีรูปทรงพรู) และตายอย่างถาวร

นี่คือคือการประกวดในจิตวิญญาณของBattleBotsและคอร์วอร์ส มีเซิร์ฟเวอร์กลางที่จะเรียกใช้บอทและสามารถพบได้ที่นี่

โปรโตคอล

เซิร์ฟเวอร์ arena พูดถึงโพรโทคอล JSON แบบธรรมดาที่สื่อสารผ่าน argv

โดยที่ Values ​​คือสตริงที่เข้ารหัสของ JSON

  • y_size: จำนวน y สูงสุดของไพ่ก่อนที่พวกเขาจะหายไป
  • x_size: สูงสุด x coords ของแผ่นก่อนที่จะหายไป
  • tick_id: หมายเลขติ๊กปัจจุบัน
  • board: พจนานุกรมที่มีคีย์ในรูปแบบ '(y, x)' และค่าในรูปแบบbot_id(int)
  • bot_id: ไทล์ในบอร์ดที่มี ID นี้เป็นของคุณ

ตัวอย่าง:

 {"y_size":2000,"x_size":2000,"board":{},"bot_id":1,"tick_id":1}

บอกเซิร์ฟเวอร์ที่คุณเลือก:

  • ส่งรายการของไพ่ให้เซิร์ฟเวอร์เพื่อเปลี่ยนเป็นสีของคุณ
  • เฉพาะผู้ที่ว่างเปล่าเท่านั้นที่จะถูกเปลี่ยน
  • รูปแบบรายการ coords ที่ซ้อนกัน
    • [[0,0], [0,1], [100,22]...]

หมายเหตุ: บ็อตของคุณไม่จำเป็นต้องอัปเดตไทล์เลยเซิร์ฟเวอร์จะทำการอัปเดตเอง

กฎการแข่งขัน

  • หากการนำไปปฏิบัติของคุณไม่สามารถปฏิบัติตามโปรโตคอลได้การเปลี่ยนแปลงนั้นจะถูกริบคืน เซิร์ฟเวอร์จะถือว่าไม่มีการเปลี่ยนแปลงในสถานะ
  • คุณไม่ได้รับอนุญาตให้ใช้ความได้เปรียบจากความผิดพลาดในเซิร์ฟเวอร์เวที
  • ให้ AI ของคุณตัดสินใจเกี่ยวกับการเคลื่อนไหวในเวลาที่มีสติ โปรดส่งการย้ายครั้งต่อไปของคุณโดยเร็วที่สุดเท่าที่จะทำได้
  • สุดท้ายนี้โปรดทำดีกับเซิร์ฟเวอร์ มันมีไว้เพื่อความบันเทิงของคุณ
  • การไม่ปฏิบัติตามกฎเหล่านี้อาจนำไปสู่การถูกตัดสิทธิ์
  • ในกรณีที่เสมอกันผู้เล่นทั้งสองจะมี 1 ชัยชนะที่เพิ่มเข้ามาทั้งหมด

ใช้งานคอนโทรลเลอร์ด้วยตัวเอง

แหล่งสำหรับการควบคุมที่สามารถพบได้ที่นี่ การรันคอนโทรลเลอร์มี 2 วิธี:

  • โหมดการแข่งขัน (เทอร์มินัล)
    • ติดตั้งด้วย python3 get_answers.py
    • เรียกใช้การแข่งขันทั้งหมดโดยใช้บอทที่มีการแข่งขันกัน
  • โหมดการทดสอบ (GUI)
    • วิ่ง python3 nice_gui.py
    • คลิก Pull Answers
    • หากคุณต้องการเพิ่มคำตอบของคุณเองก่อนที่จะโพสต์ให้คลิกFile -> Add manual answerและค้นหาไฟล์และเลือกภาษาที่เขียน
    • หากภาษาของคุณไม่มี ping me และฉันจะลองติดตั้งบนเซิร์ฟเวอร์ฉันจะใช้งาน (คำแนะนำในการติดตั้งและใช้งานจะดีเช่นกัน!)
    • เลือก 2 บอทเพื่อเจาะเข้าหากัน
    • คลิก Run
    • ดูเกม ...
  • การติดตั้ง
    • ต้องการ python3
    • get_answers ต้องการ bs4 และ html5lib
    • คอนโทรลเลอร์ต้องการวิธีการเรียกใช้ไฟล์. sh (MinGW บน windows)

ตัวอย่างภาพแอพ

เกณฑ์การให้คะแนน

บอทที่ชนะมากที่สุดเริ่มต้นจาก12/07/2016(12 กรกฎาคม) 14/07/2016 (14 กรกฎาคมไม่สามารถหาวิธีเรียกใช้บอท) ชนะ


สามารถขอความช่วยเหลือเกี่ยวกับคอนโทรลเลอร์ / กุยได้ในห้องสนทนานี้


คำถามนี้ได้รับการพัฒนาตั้งแต่ปี 2014 และเป็นคำถามที่ถูกโหวตมากที่สุดในกล่องทราย ขอขอบคุณเป็นพิเศษไปที่Wander Nauta (ผู้แต่งและแนวคิดดั้งเดิม), PPCG Chat (ความคิดเห็นและความช่วยเหลือ) และทุกคนที่แสดงความคิดเห็นในโพสต์แซนด์บ็อกซ์ (ความคิดเห็นเพิ่มเติม)


25
ฉันคิดว่านี่คงไม่ทำให้มันหลุดออกจากกล่องทราย ที่ดี!
Luis Mendo

Typo: 12/06/2016 (12 กรกฎาคม)
Luis Mendo

4
+1 คุณสมควรได้รับรางวัล AED ในการนำคำถามที่ยอดเยี่ยมนี้ออกจากกล่องทราย!
ตลอดไป

1
@ KevinLau-notKenny โอ้ไม่เป็นไร คุณสามารถเรียกใช้คำสั่งในไฟล์ได้หรือไม่?
Rɪᴋᴇʀ

1
@Magenta เมื่อฉันได้รับพวกเขา (ฉันลืมไปอย่างสมบูรณ์เกี่ยวกับเรื่องนี้แม้ว่ามันจะอยู่ในแท็บที่เปิดตลอดเวลา) ฉันกำลังใช้งานอยู่ตอนนี้
สีน้ำเงิน

คำตอบ:


4

Python 3, Exploder

วางระเบิดขนาดเล็กรอบ ๆ สถานที่โดยไม่คำนึงว่ามีบล็อกอยู่ที่นั่นหรือไม่

from random import randint
import sys,json,copy
q=json.loads(sys.argv[1])
x=q["x_size"];y=q["y_size"];F=[[0,1],[1,0],[1,1],[1,2],[2,0],[2,2]];D=[]
for g in [0]*5:
 X=randint(0,x);Y=randint(0,y);A=copy.deepcopy(F)
 for C in A:C[0]+=Y;C[1]+=X
 D+=A
print(D)

1
ฉันไม่อยากจะเชื่อเลยว่าหลังจากที่งานของฉันตั้งค่าสวิตช์การบล็อกเพื่อการเติบโตที่ไม่ จำกัด และระบบที่สร้างขึ้นมาเพื่อทำลายโครงสร้างการเจริญเติบโตระบบที่ใช้ exploder แบบง่าย ๆ ก็เอาชนะการสู้รบ: o
Value Ink

ฉันไม่รู้ว่ามันจะทำอย่างไรเพราะฉันไม่สามารถเรียกใช้คอนโทรลเลอร์ได้ไม่ว่าด้วยเหตุผลใด
Magenta

8

ทับทิมขัดจังหวะ BlockMaker

แทนที่จะเริ่มการทำงานของเครื่องร่อนอย่าง TrainingBot มันก็พยายามที่จะสร้างสวิทช์บล็อกทำ 5x5 ตามที่กล่าวไว้ใน Wikipediaที่จุดสุ่มในเขาวงกต จากนั้นด้วยการเปิดใช้งานที่เหลืออยู่เพียงแค่หาจุดศัตรูและพยายามพริกไทยพื้นที่ใกล้เคียงกับเซลล์ของคุณในความพยายามที่จะขัดขวางพวกเขาจากการเจริญเติบโตและอาจทำให้รูปแบบของพวกเขายุ่งเหยิง เซลล์ของคุณจะตายในรุ่นต่อไป แต่บางทีพวกมันอาจหยุดการเติบโตเพื่อชะลอคู่ต่อสู้ของคุณ!

v2: ปรับให้เหมาะสมเล็กน้อย (?) เพื่อพยายามลดการหมดเวลา

v3: โค้ดขัดจังหวะที่ดีที่สุดเพื่อสุ่มตัวอย่างชุดย่อยของบล็อกที่ใช้งานอยู่ก่อนที่จะปฏิเสธที่ตั้งของเซลล์ของเราเองเพื่อป้องกันการหมดเวลาต่อไปในราคาที่มีประสิทธิภาพในการโจมตีเซลล์ขัดจังหวะ

require 'json'

class Range
  def product range2
    self.to_a.product range2.to_a
  end
end

args = JSON.parse(ARGV[0])
bot_id = args["bot_id"]
width  = args["x_size"]
height = args["y_size"]
board  = args["board"]

generator = [[2,2], [2,3], [2,6], [3,2], [3,5], [4,2], [4,5], [4,6], [5,4], [6,2], [6,4], [6,5], [6,6]]

targets = []

iterations = 50
gen_location = nil
while !gen_location && iterations > 0
  y = rand height - 9
  x = rand width  - 9
  temp = (0...9).product(0...9).map{|_y, _x| [y + _y, x + _x]}
  if temp.all?{|_y,_x| !board["(#{y},#{x})"]}
    gen_location = temp
    targets += generator.map{|_y, _x| [y + _y, x + _x]}
  end

  iterations -= 1
end

enemies = board.keys.sample(100).reject {|k| board[k] == bot_id}
interrupts = []
enemies.each do |location|
  y, x = location.scan(/\d+/).map &:to_i
  interrupts |= ((y-1)..(y+1)).product((x-1)..(x+1)).reject{|y, x| gen_location.include?([y,x]) || board["(#{y},#{x})"]}
end

targets += interrupts.sample(30 - targets.size)

puts JSON.dump(targets)

@ muddyfish ขอบคุณที่แก้ไขมัน! ตอนนี้ปัญหาเดียวก็คือว่าคำสั่งบรรทัดคำสั่งของ Windows มีขีด จำกัด ฮาร์ดโค้ดที่ 8191 ซึ่งหมายความว่า ณ จุดหนึ่งในการจำลองบอตจะผิดพลาดจากการไม่สามารถแยกสตริง JSON ที่ถูกตัดทอน มันเป็นปัญหาของระบบปฏิบัติการดังนั้นฉันคิดว่าฉันต้องมองเข้าไปในกล่องคลาวด์บนคลาวด์หรืออะไรบางอย่างเพื่อทดสอบบอทของฉัน ~
Value Ink

@muddyfish ฉันได้กล่าวแล้วว่า Windows มีปัญหาเนื่องจากข้อ จำกัด ของบรรทัดคำสั่งข้อผิดพลาดครั้งสุดท้ายคือบน Cloud9 ซึ่งเป็นกล่อง Linux อย่างเห็นได้ชัด บ็อตค่าโดยสารของฉันเป็นอย่างไรในกล่อง Linux ของคุณ (เนื่องจากคุณบอกเป็นนัยว่าคุณมี)
หมึกมูลค่า

ปรากฎว่าฉันไม่ได้ทำมัน แต่ตัวเลขในการbot_scoreแสดงจำนวนชนะแต่ละบอทมีต่อบอทอื่น ๆ
Blue

เอาล่ะขอบคุณ! น่าเสียดายที่ Cloud9 ไม่มี GUI และ Windows ยังคงไม่สามารถรันการจำลองได้โดยไม่ทำลายขีด จำกัด คำสั่งในที่สุด แต่อย่างน้อยฉันก็ได้ดูว่าบอทมีค่าต่อกันอย่างไร นอกจากนี้ฉันจะเห็นบอตของฉันต่อสู้กับตัวเองจนจบบางครั้งเพราะพวกเขาโจมตีซึ่งกันและกันและป้องกันไม่ให้เติบโตพอที่จะทำลายขีด จำกัด ของตัวละครถึงแม้ว่ามันจะหมดเวลาเป็นครั้งคราว ...
มูลค่าหมึก

4

Python 2, TrainingBot

เพราะทุกคนต้องการหนึ่งในนั้น!

import random, copy
import sys, json

args = json.loads(sys.argv[1])
bot_id = args["bot_id"]
x_size = args["x_size"]
y_size = args["y_size"]
cur_tick = args["tick_id"]
board = args["board"]

glider = [[1,2],[2,1],[0,0],[0,1],[0,2]]

x_add = random.randrange(x_size)
y_add = random.randrange(y_size)
new_glider = copy.deepcopy(glider)
for coord in new_glider:
    coord[0]+=y_add
    coord[1]+=x_add
move = new_glider
print json.dumps(move)

4

Java, Troll Bot

Troll Bot ได้คิดเกี่ยวกับมันและเขาตระหนักว่าเขาไม่สนใจเกี่ยวกับศัตรู ในความเป็นจริงเขาแค่พ่นโรงงานเหล่านี้เพื่อผลิตพวกของเขาแบบสุ่มทั่วแผนที่ หลังจากนั้นไม่นานเขาก็ตระหนักว่ามีเซลล์เพิ่มเติมใด ๆ ที่ใช้ดีที่สุดในกลุ่ม บล็อกสี่เซลล์เหล่านี้จะติดกันและหยุดเครื่องร่อนในเส้นทางของพวกเขา! เขาไม่คิดว่าเขาจะต่อสู้ นอกจากนี้เขายังเป็นผู้สนับสนุนที่สำคัญของการเขียนโปรแกรมเชิงวัตถุแบบละเอียด โทรลล์ยังถือว่า coords อยู่ในรูปแบบ y, x และเขากำลังขอให้ทดสอบ เพียงแค่ใส่เขาในไฟล์ชื่อ "TrollBot.java" และเขาจะถูกตั้งค่า!

package trollbot;

/**
 *
 * @author Rohans
 */
public class TrollBot{
public static class coord{
    public int x;
    public int y;
    public coord(int inX,int inY){
        x = inX;
        y = inY;
    }
    @Override
    public String toString(){
        return"["+x+","+y+"]";
    }
}
    /**
     * Input the JSON as the first cla
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       String JSON="{\"bot_id\":1,\"y_size\":1000,\"x_size\":1000,\"board\":{}}";
    String[] JArray=args[0].split(",");
       int botId=Integer.parseInt(JSON.charAt(10)+"");
    int xSize=Integer.parseInt(JArray[2].substring(JArray[2].indexOf(":")+1));
    int ySize=Integer.parseInt(JArray[1].substring(JArray[1].indexOf(":")+1));
    int[][] board = new int[xSize][ySize];//0 indexed
//todo: parse the board to get an idea of state
    String soldiers="[";    
//for now just ignore whats on the board and put some troll cells on
    //Attempts to create 3 10 cells factories of cells, hoping it does not place it on top of allies
    //Then puts random 2/2 blocks
  boolean[][] blockspam=new boolean[10][8];
  blockspam[7][1]=true;
  blockspam[5][2]=true;
  blockspam[7][2]=true;
  blockspam[8][2]=true;
  blockspam[5][3]=true;
  blockspam[7][3]=true;
  blockspam[5][4]=true;
  blockspam[3][5]=true;
  blockspam[1][6]=true;
  blockspam[3][6]=true;
  for(int z=0;z<3;z++){
     int xOffSet=(int) (Math.random()*(xSize-11));
     int yOffSet=(int) (Math.random()*(ySize-9));
     //stay away from edges to avoid odd interactions
     for(int i=0;i<blockspam.length;i++){
         for(int j=0;j<blockspam[i].length;j++){
             if(blockspam[i][j])
             soldiers+=new coord(j+yOffSet,i+xOffSet).toString()+",";
         }
     }
  }
  soldiers=soldiers.substring(0,soldiers.length()-1);
  for(int i=0;i<8;i++){
            int y=(int ) (Math.random()*(ySize-1));
            int x = (int) (Math.random()*(xSize-1));
      soldiers+=new coord(y,x).toString()+",";
                          soldiers+=new coord(y+1,x).toString()+",";
                          soldiers+=new coord(y,x+1).toString()+",";
                          soldiers+=new coord(y+1,x).toString()+",";

  }
  soldiers+="\b]";

  System.out.println(soldiers);
  //GO GO GO! Lets rule the board
    }

}

3

Python 3, RandomBot

บอทนี้มีปัญหาในการตัดสินใจอย่างชาญฉลาด แต่อย่างน้อยก็ไม่รู้ที่จะลองวางสิ่งอื่นใด มันจะสร้างเครื่องร่อนสุ่มตัวอย่างเรือC / 2 Orthagonal s และบล็อก 2x2 ที่มีทิศทางต่าง ๆ เพื่อให้แน่ใจว่าเมื่อวางมันจะไม่ทับซ้อนกับสิ่งอื่นพันธมิตรหรือศัตรู

บอทนี้ไม่ได้ทดสอบเพราะฉันได้รับข้อผิดพลาดทุกประเภทเมื่อฉันพยายามเรียกใช้ GUI นอกจากนี้ฉันใช้ TrainingBot เป็นพื้นฐานและเพิ่งแก้ไขดังนั้นความคล้ายคลึงกันในโค้ดอาจเป็นเพราะสิ่งนั้น

import random, copy
import sys, json
args = json.loads(sys.argv[1])
bot_id = args["bot_id"]
x_size = args["x_size"]
y_size = args["y_size"]
board = args["board"]
occupied = [tuple(key) for key,value in iter(board.items())]
cellsleft=30
move=[]
choices = [[[1,2],[2,1],[0,0],[0,1],[0,2]],
           [[0,0],[0,1],[1,1],[1,0]],
           [[0,1],[1,0],[0,2],[0,3],[1,3],[2,3],[3,3],[4,3],[5,2],[5,0]],
           [[0,0],[1,0],[0,1],[2,1],[2,2]]]
while cellsleft>0:
    x_add = random.randrange(x_size)
    y_add = random.randrange(y_size)
    new_glider = copy.deepcopy(random.choice(choices))
    randomdirection = random.choice([[1,1],[1,-1],[-1,1],[-1,-1]])
    maxy=max([y[0] for y in new_glider])
    maxx=max([x[1] for x in new_glider])
    for coord in new_glider:
        coord[0]=coord[0]*randomdirection[0]+y_add
        coord[1]=coord[1]*randomdirection[1]+x_add
        cellsleft-=1
    set([tuple(x) for x in new_glider]) 
    if not set([tuple(x) for x in new_glider]) & (set(occupied)|set([tuple(x) for x in move])) and cellsleft>0:
        if min(y[0] for y in new_glider)<0: new_glider = [[y[0]+maxy,y[1]] for y in new_glider]
        if min(y[1] for y in new_glider)<0: new_glider = [[y[0],y[1]+maxx] for y in new_glider]
        move += new_glider
    elif set([tuple(x) for x in new_glider]) & (set(occupied)|set([tuple(x) for x in move])):
        cellsleft+=len(new_glider)

print(json.dumps(move))

1
GUI มีแนวโน้มที่จะล้มเหลวเนื่องจากคุณprint(sys.argv[1])อยู่ในบรรทัดที่ 3 ซึ่งยุ่งกับเอาต์พุต นอกจากนี้บรรทัดสุดท้ายของโปรแกรมของคุณไม่มีพาเรนปิด
หมึกมูลค่า

@ KevinLau-notKenny GUI ล้มเหลวในการฝึกบอทและทับทิมบอทด้วย แม้ว่าฉันจะลบบรรทัดนั้นและเพิ่มกลับเข้าไปใน paren การปิด (ฉันคิดว่าอันหลังเป็นข้อผิดพลาดการคัดลอกวาง)
สตีเวนเอช.

คุณใช้ระบบปฏิบัติการใดและมีข้อผิดพลาดใดปรากฏในบรรทัดคำสั่งเมื่อคุณเรียกใช้ ในปัจจุบันเป็นข้อผิดพลาดที่ทราบกันดีว่า Windows ไม่สามารถเรียกใช้ซิมได้เนื่องจากอาร์กิวเมนต์ที่ส่งผ่านบรรทัดคำสั่งจะถูกตัดทอนเมื่อเกินขีด จำกัด อักขระบรรทัดคำสั่งประมาณ 8000
หมึกมูลค่า

@ KevinLau-notKenny ฉันใช้ Windows 10 และฉันได้รับ ... เอาละมีข้อผิดพลาดมากมาย สิ่งแรกคือ BeautifulSoup ไม่ต้องการค้นหาhtml5libจากนั้นไม่พบโฟลเดอร์ที่มีบอตทั้งหมด (ฉันต้องเปลี่ยนรหัสสำหรับทั้งสองอย่าง) และตั้งแต่นั้นการเรียกใช้งานของ ธ ​​อท ธ ไพ ธ อนก็ทำให้รหัสที่ไม่ใช่ 0 กลับมา 1.
Steven H.

Windows ยังไม่สามารถเรียกใช้รหัสได้หากมีเซลล์ที่ใช้งานมากเกินไปบนหน้าจอ ... แต่สำหรับข้อผิดพลาดอื่น ๆ ของคุณอาจเป็นเพราะ TrainingBot ต้องการ Python 2 หรือไม่
หมึกมูลค่า

3

Python, GuyWithAGun

เขาเป็นผู้ชายเขามีปืน เขาเป็นบ้า เขาทิ้งปืนเครื่องร่อนทุกที่โดยไม่สนใจว่าใครทำอะไรอยู่

import random, copy
import sys, json

args = json.loads(sys.argv[1])
bot_id = args["bot_id"]
x_size = args["x_size"]
y_size = args["y_size"]
tick_id = args["tick_id"]
board = args["board"]

start_squares = [[0,5],[2,5],[1,6],[2,6],
                 [35,3],[36,3],[35,4],[36,4]]
gun = [[11,5],[11,6],[11,7],
       [12,4],[12,8],
       [13,3],[13,9],
       [14,3],[14,9],
       [15,6],
       [16,4],[16,8],
       [17,5],[17,6],[17,7],
       [18,6],
       [21,3],[21,4],[21,5],
       [22,3],[22,4],[22,5],
       [23,2],[23,6],
       [25,1],[25,2],[25,6],[25,7]]

templates = [start_squares, gun]

def add_squares(pos, coords):
    new_squares = copy.deepcopy(coords)
    for coord in new_squares:
        coord[0]+=pos[0]
        coord[1]+=pos[1]
    return new_squares

def get_latest_pos():
    seed, template_id = divmod(tick_id, 2)
    random.seed(seed)
    cur_pos = [random.randrange(y_size),
               random.randrange(x_size)]
    cur_template = templates[template_id]
    try:
        return add_squares(cur_pos, cur_template)
    except IndexError:
        return []

move = get_latest_pos()

print json.dumps(move)

2

Python 3, SquareBot

ทำให้สี่เหลี่ยมทุกที่ - อาจ

สแควร์สเป็นวัตถุคงที่ในชีวิต - พวกมันไม่ขยับ ดังนั้นถ้าฉันวางวัตถุเฉื่อยไว้รอบ ๆ ที่เพียงพอเครื่องร่อนและการระเบิดที่คนอื่นสร้างจะถูกบล็อกหรืออย่างน้อยก็ทำให้ชื้น

- ดัดแปลงจาก TrainingBot

from random import randint
import sys,json,copy
args=json.loads(sys.argv[1])
x=args["x_size"];y=args["y_size"]
square=[[0,0],[0,1],[1,0],[1,1]];D=[]
for g in range(7):
 X=randint(0,x);Y=randint(0,y)
 A=copy.deepcopy(square)
 for C in A:C[0]+=Y;C[1]+=X
 D+=A
print(D)

แม้ว่าฉันจะมีปัญหาในการทดสอบ



ฉันสามารถยืนยันได้ว่าบอตนี้จริง ๆ แล้วทำในสิ่งที่มันต้องการ - และมันช่วยให้ฉันค้นหาและแก้ไขข้อผิดพลาดในคอนโทรลเลอร์
Blue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.