Cave Rangers - สำรวจความมืด


9

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

ตอนนี้ลงไปที่ nitty-gritty เซ็นเซอร์ส่งข้อมูลไปยังโปรแกรมของคุณเป็นอักขระ ASCII นี่คือรายการความหมายของตัวละครแต่ละตัวและคำอธิบายสำหรับสิ่งที่บอตอาจพบในถ้ำ:

Code    Name/Description

Y       Your bot
        You do things

@       Other bots
        They do other things

-       Ground
        This doesn't do things

C       Centipede
        These will bite you and leave a poison effect
        The bite will cost 1 health
        The poison effect will last for 3 turns, costing 2 health each turn

B       Bats
        If bats end up in the same space you are, your bot runs in a random direction during its turn rather than what you told it to do

L       Lion (because reasons)
        Lions deal heavy damage, 10 health, each time they attack

F       Food
        Eating this will give you 5 health
        Can only be used once

W       Water
        Drinking this will cure poison effects early
        Can only be used once

R       Revealer
        This will increase the range of your visibility to an 11x11 grid
        The extra range will only be 75% correct, but the original range won't be effected

K       Knife
        You do twice as much damage to other bots if you have a knife

G       Gold
        The whole reason you're doing this in the first place

N       Nurse Nina
        She mend you good
        Restores your health by 10 while you occupy the same space as her

}       Boulder
        You can't walk over boulders, and neither can anything else

P       Pit
        If you fall in a pit, you will be stuck for 3 turns

ขนาดของถ้ำโตขึ้นตามจำนวนบอตที่เข้าร่วม มันเริ่มต้นเป็น 30x30 และจะได้รับ 10x10 พิเศษสำหรับบอททุกคน ดังนั้น 2 บอทจะสำรวจถ้ำขนาด 50x50

บอตเริ่มต้นที่ 20 พลังชีวิต แต่ไม่มีขีด จำกัด สูงสุดต่อสุขภาพ

การป้อนข้อมูล:

คุณจะได้รับอินพุตผ่าน STDIN ในรูปแบบต่อไปนี้:

20,5,10,1,0,True,False    <-health, number gold pieces, number of turns your bot has lasted, number of until the poison wears off, number of turns until you are no longer stuck in a pit, if you have a revealer, if you have a knife
-----
-G}--
--Y-L
-C---
---B-

บรรทัดแรกมีข้อมูลเกี่ยวกับบอตของคุณและที่เหลือคือตารางที่บอทของคุณมองเห็น หากบอทของคุณติดกับหนึ่งใน 4 กำแพงของถ้ำคุณจะได้รับกริดที่มีลักษณะเช่นนี้มากขึ้น (ในกรณีที่ไปทางตะวันตก):

---
}--
Y--
---
---

ถ้ำไม่ได้ห่อหุ้มและไม่มีวิสัยทัศน์ของคุณ กำแพงถ้ำไม่ได้ถูกทำเครื่องหมายสิ่งเดียวที่บ่งบอกว่าบอทของคุณได้รับว่ามันอยู่ใกล้กับกำแพงก็คือมุมมองของมันจะลดลง ด้วย Revealer คุณอาจได้รับสิ่งนี้:

--------C--
LW--------B
---K-N-----
--------BR-
-F---------
--B--Y---@N
-W@---F----
------K-F--
----@-}----
R@---G}--}-
--------G-R

เอาท์พุท:

คุณได้รับสองการเคลื่อนไหวต่อเทิร์นซึ่งคุณส่งออกในรูปแบบต่อไปนี้:

MNNANW    <- Moves are groups of 3 characters representing the action and the direction

การกระทำที่เป็นไปได้มีดังนี้:

M    Move - Move your bot in the specified direction
A    Attack - Attack the square in the specified direction
H    Hold - Do nothing

ทิศทางที่เป็นไปได้มีดังต่อไปนี้:

NN - North (up)
NE - Northeast (up-right)
EE - East (right)
SE - Southeast (down-right)
SS - South
SW - Southwest
WW - West
NW - Northwest

การเคลื่อนไหวจะใช้จากซ้ายไปขวา

ย้อนกลับ:

เปลี่ยนความคืบหน้าในแบบต่อไปนี้:

  1. เอฟเฟกต์พิษจะถูกนำไปใช้กับผู้เล่นที่ถูกวางยาพิษ

  2. ปลอดบอทเคลื่อนที่และโจมตี

    2a สิงโตตะขาบและค้างคาวเคลื่อนไหวแบบสุ่ม

    2b ไลออนส์และตะขาบจะโจมตีทุกอย่างที่ติดกับมันโดยตรง (รวมถึงแนวทแยงมุม)

    2c เอฟเฟกต์แบ็ตจะถูกนำไปใช้กับบอทหากอยู่ในพื้นที่เดียวกับแบ็ต

    2d พยาบาลนีน่าจะอยู่ในที่ตั้ง 3 รอบจากนั้นข้ามไปที่ตำแหน่งสุ่ม

  3. บอทเคลื่อนที่

    3a หากบอทของคุณให้ผลลัพธ์ที่ไม่ถูกต้องมันจะไม่ย้าย

    3b บอทของคุณจะพยายามเข้าใกล้พื้นที่ที่กำหนดโดยเอาท์พุทให้มากที่สุด (ดูรายละเอียดเพิ่มเติมที่ด้านล่าง)

    3c การโจมตีหนึ่งครั้งกับ Centipede, Lion หรือ Bat จะฆ่ามัน

    3d โจมตีบอทอื่นที่ไม่มีมีดจะทำดาเมจ 5 ดาเมจและ 10 ด้วยมีด

กฎ:

  1. ยึดติดกับภาษาทั่วไปที่สามารถเรียกใช้บน OS X หรือ Linux

  2. คุณสามารถเลือกเขียนได้สูงสุดและไม่เกิน 1kb ข้อมูลไปยังไฟล์

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

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

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

นี่คือรหัสสำหรับบอทแบบสุ่มบางส่วน:

#!/usr/bin/python
import random as r

a = ['M','A','H']
d = ['NN','NE','EE','SE','SS','SW','WW','NW']

print(a[r.randint(0,2)]+d[r.randint(0,7)]+a[r.randint(0,2)]+d[r.randint(0,7)])

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

---
}--
Y--
---
---

และผลลัพธ์ของคุณคือ

MNWMSW

บอทของคุณจะเลื่อนหนึ่งช่องว่างลง มันไม่สามารถเคลื่อนที่ไปทางเหนือหรือตะวันตกดังนั้นการเคลื่อนไหวนั้นจึงไม่มีผลกระทบ มันสามารถเคลื่อนย้ายไปทางใต้ได้ (และทำได้) แต่ไม่สามารถเคลื่อนที่ไปทางตะวันตกได้ อย่างไรก็ตามถ้าบอทของคุณพยายามที่จะย้ายภาคตะวันออกเฉียงเหนือมันจะตรงไปยังพื้นที่นั้น (การเคลื่อนไหวในแนวทแยงเป็นแนวทแยงไม่ใช่ขั้นตอน)

ลีดเดอร์บอร์ด

เหล่านี้เป็นคะแนนเฉลี่ยของ 4 เกม

The bot of Survival:    54.75
Coward:                 52.25
Pufferfish:             50.00
Randombot:              50.00
Indiana Jones:          47.50
TheoremBot:             46.50

แต่ละบอทมีสุขภาพเท่าไหร่? และขอบของถ้ำจะเป็นอย่างไร?
Conor O'Brien

พวกเขาเริ่มต้นด้วย 20 และสามารถรวบรวมได้มากเท่าที่ต้องการ เพิ่มข้อมูลนี้ด้านบน
The Beanstalk

ขอบถ้ำไม่ได้ถูกทำเครื่องหมายโปรแกรมของคุณจะได้รับบิตที่คุณสามารถเดินได้
ฝักถั่ว

คุณไม่รู้สุขภาพของคุณจริงๆหรือ?
pppery

คุณสามารถป้อนความยาวและความกว้างของวิสัยทัศน์ของบอทได้หรือไม่?
LegionMammal978

คำตอบ:


4

Indiana Jones, Python 2

บอทนี้ไม่กลัวอะไรเลย มันจะพยายามรับทองคำ และถ้าหาไม่เจอก็จะพยายามแทงฝ่ายตรงข้ามด้วยมีด

#!/usr/bin/env python
import sys
import random
data = sys.stdin.readlines()
health, gold, turns, poison_remaining, pit_remaining, revealer, knife = eval(data[0])
lines = data[1:]

myloc = [-1, -1]

width, height = len(lines[0]), len(lines)

for y, line in enumerate(lines):
    if line.find('Y')>-1:
        myloc = [line.index('Y'), y]
if myloc[0]<width/2:
    padding = int(width/2-myloc[0])
    lines = ['-'*padding+line for line in lines]
    myloc[0]+=padding
elif myloc[0]>width/2+1:
    padding = int(myloc[0]-width/2-1)
    lines = [line+'-'*padding for line in lines]

if myloc[1]<height/2:
    padding = int(height/2-myloc[1])
    lines = ['-'*width]*padding + lines
    myloc[1]+=padding
elif myloc[1]>height/2+1:
    padding = int(myloc[1]-height/2-1)
    lines = lines + ['-'*width]*padding

uddirections = {1:'N',0:'',-1:'S'}
lrdirections = {1:'E',0:'',-1:'W'}

golds = {}
for y, line in enumerate(lines):
    if 'G' in line:
        x = line.index('G')
        direction = ((uddirections[max(min(myloc[1]-y,1),-1)]+lrdirections[max(min(x-myloc[0],1),-1)])*2)[:2]
        distance = max(abs(myloc[0]-x), abs(myloc[1]-y))
        golds[distance] = direction

bots = {}
for y, line in enumerate(lines):
    if '@' in line:
        x = line.index('@')
        direction = ((uddirections[max(min(myloc[1]-y,1),-1)]+lrdirections[max(min(x-myloc[0],1),-1)])*2)[:2]
        distance = max(abs(myloc[0]-x), abs(myloc[1]-y))
        bots[distance] = direction

foods = {}
for y, line in enumerate(lines):
    if 'F' in line:
        x = line.index('F')
        direction = ((uddirections[max(min(myloc[1]-y,1),-1)]+lrdirections[max(min(x-myloc[0],1),-1)])*2)[:2]
        distance = max(abs(myloc[0]-x), abs(myloc[1]-y))
        foods[distance] = direction

knives = {}
for y, line in enumerate(lines):
    if 'K' in line:
        x = line.index('K')
        direction = ((uddirections[max(min(myloc[1]-y,1),-1)]+lrdirections[max(min(x-myloc[0],1),-1)])*2)[:2]
        distance = max(abs(myloc[0]-x), abs(myloc[1]-y))
        knives[distance] = direction

if golds:
    direction = golds[min(golds.keys())]
elif not knife and knives:
    direction = knives[min(knives.keys())]
elif health<20 and foods:
    direction = foods[min(foods.keys())]
elif bots and knife:
    direction = bots[min(bots.keys())]
    if min(bots.keys())==1:
        print ('A'+direction)*2
        sys.exit(0)
    elif min(bots.keys())==2:
        print 'M'+direction+'A'+direction
        sys.exit(0)
else:
    print ('M'+random.choice('NS')+random.choice('NEWS'))*2
    sys.exit(0)
print ('M'+direction)*2

เพียงแค่ต้องเปลี่ยนสิ่งหนึ่งเพื่อให้ได้งานนี้ - line.index('Y')จะโยนข้อผิดพลาดหาก "Y" ไม่อยู่ในบรรทัด แต่line.find('Y')จะส่งกลับ -1 ถ้า "Y" ไม่อยู่ในบรรทัด ไม่งั้นมันเยี่ยมมาก!
ฝักถั่ว

ธ ปท. บางครั้งคุณออกอ้อยMSNMSNซึ่งไม่ถูกต้อง
pppery

3

คนขี้ขลาด python3

คนขี้ขลาดมักหนีจากภัยคุกคามที่อาจเกิดขึ้น

อย่างไรก็ตามหากเขารู้สึกแข็งแกร่งเป็นพิเศษเขาจะวิ่งอาละวาดและแทงทุกอย่างที่อยู่ใกล้เขา

ปัญหาเกี่ยวกับการใช้งานในปัจจุบันคือคำสั่งการย้ายจะถูกใช้โดยไม่มีความรู้ไม่ว่าจะเป็นการย้ายครั้งแรกหรือครั้งที่สอง

#!/usr/bin/env python3.4

import sys, random


class Coward():
  """
  A coward always runs from potential threats.

  However, if he feels super strong, he will suddenly run amok 
  and stab everything near him.  
  """
  def __init__(self, hp, gold, turn, poison, pit, revealer, knife):
    self.hp=int(hp)
    self.gold=int(gold)
    if knife=="True": self.knife=True
    else: self.knife=False    
    self.pit=int(pit)
    self.poison=int(poison)

  def readGrid(self, grid):
    self.grid=grid.split("\n")
  @property
  def _confidence(self):
    return self.hp+5*self.knife-2*self.poison
  @property
  def _lineOfY(self):
    for i, line in enumerate(self.grid):
      if "Y" in line:
        return i
  @property
  def _colOfY(self):
    return self.grid[self._lineOfY].index("Y")
  @property
  def _maxX(self):
    return len(self.grid)-1
  @property
  def _maxY(self):
    return len(self.grid[0])-1
  def move(self, step):
    d = {'NN':(0,-1),'NE':(1,-1),'EE':(1,0),'SE':(1,1),'SS':(0,1),'SW':(-1,1),'WW':(-1,0),'NW':(-1,-1)}
    c2d={(0,-1):'NN',(1,-1):'NE',(1,0):"EE",(1,1):"SE",(0,1):"SS",(-1,1):"SW",(-1,0):"WW",(-1,-1):"NW"}
    #Don't move into wall/ boulder/ pit
    #print(d, file=sys.stderr)
    for k,v in list(d.items()):
      x=self._lineOfY+v[0]
      y=self._colOfY+v[1]
      #print (k, v ,x , y, file=sys.stderr)
      if x<0 or y<0 or x>self._maxX or y>self._maxY:
        #print ("Out of bounds: ", k, file=sys.stderr)
        del d[k]
      elif self.grid[x][y]=="}" or self.grid[x][y]=="P":
        del d[k]
    #Always avoid bats, and enemys
    for dx in range(-2,3):
      for dy in range(-2,3):
        x=self._lineOfY+dx
        y=self._colOfY+dy
        if x<0 or y<0 or x>self._maxX or y>self._maxY:
          continue;
        if self.grid[x][y] in ["B", "L", "C", "@"]:
          for k in self._toDirection(dx, dy):
            if k in d: del d[k] #Too many threats from all sides can paralyze the Coward: nowhere to go...
    #print(d, file=sys.stderr)
    tomove=[]
    #Neighboring fields
    for dx in [-1,1]:
      for dy in [-1,1]:
        x=self._lineOfY+dx
        y=self._colOfY+dy
        if x<0 or y<0 or x>self._maxX or y>self._maxY:
          continue
        if self.poison>0 and self.grid[x][y]=="W":
          for k,v in d.items():
            if v==(dx,dy):
              tomove.append(k)
        if self.grid[x][y]=="N": #Always go to nurse, even if dangerous
          tomove.append(c2d[(x,y)])
        if self.grid[x][y] in ["F","K","G"]: #Go to Food, Knife or Gold, if save
          for k,v in d.items():
            if v==(dx,dy):
              tomove.append(k)
    #Further away: Go towards food, knife and gold and Nina if save.
    for target in ["N", "F", "G", "K"]:
      for dx in [-2,2]:
        for dy in [-2,2]:
          x=self._lineOfY+dx
          y=self._colOfY+dy
          if x<0 or y<0 or x>self._maxX or y>self._maxY:
            continue
          if self.grid[x][y]==target:
            l=[ k for k in self._toDirection(dx,dy) if k in d]
            if l: tomove.append(random.choice(l))
    s=list(d.keys())
    random.shuffle(s)
    tomove+=s
    try:
      return "M"+tomove[step-1]
    except IndexError:
      return ""
  def attack(self, step):    
    c2d={(0,-1):'NN',(1,-1):'NE',(1,0):"EE",(1,1):"SE",(0,1):"SS",(-1,1):"SW",(-1,0):"WW",(-1,-1):"NW"}
    #If Bot next to you: always attack
    for k,v in c2d.items():
      x=self._lineOfY+k[0]
      y=self._colOfY+k[1]
      if x<0 or y<0 or x>self._maxX or y>self._maxY:
        continue
      if self.grid[x][y]=="@":
        return "A"+v
    #If Bot or monster could come closer: attack potential new position
    attDir={(-2,-2):["NW"], (-2,-1):["NW","WW"], (-2,0):["WW","NW","SW"], (-2,1):["WW","SW"], (-2,2):["SW"],(-1,-2):["NW","NN"], (-1,2):["SW","SS"], (0,2):["SW","SS","SE"],(0,-2):["NW","NN","NE"],(1,-2):["NN","NE"],(1,2):["SS","SE"],(2,-2):["NE"],(2,-1):["NE","EE"], (2,0):["NE","EE","SE"], (2,1):["EE","SE"], (2,2):["SE"]}
    for k,v in attDir.items():
      x=self._lineOfY+k[0]
      y=self._colOfY+k[1]
      if x<0 or y<0 or x>self._maxX or y>self._maxY:
        continue
      if self.grid[x][y] in ["@","L","C","B"]:
        return "A"+random.choice(v)
    return ""
  def _toDirection(self,dx,dy):
    if dx<0:
      if dy<0:
        return ["WW","NW","NN"]
      elif dy==0:
        return ["WW","NW","SW"]
      elif dy>0:
        return ["WW","SW","SS"]
    elif dx>0:
      if dy<0:
        return ["EE","NE","NN"]
      elif dy==0:
        return ["EE","NE","SE"]
      elif dy>0:
        return ["EE","SE","SS"]
    elif dx==0:
      if dy<0:
        return ["NN","NE","NW"]
      elif dy==0:
        return []
      elif dy>0:
        return ["SS","SE","SW"]
  def _nearBat(self):
    for dx in range(-2,3):
      for dy in range(-2,3):
        x=self._lineOfY+dx
        y=self._colOfY+dy
        if x<0 or y<0:
          continue;
        if self.grid[x][y]=="B":
          return True
    return False
  def makeTurn(self):
    try:
      command=""
      #If stuck, just attack
      if self.pit:
        command+=self.attack(1)+self.attack(2)
      #Always run from bats
      if self._nearBat:
        command+=self.move(1)+self.move(2)
      #If high-confidence: attack
      if self._confidence>30:
        command+=self.attack(1)+self.attack(2)
      #Else: Move somewhere
      command+=self.move(1)+self.move(2)
      #Just in case, two random attacks
      d = ['NN','NE','EE','SE','SS','SW','WW','NW']
      a=random.choice(d)
      b=random.choice([ x for x in d if x!=a])
      command+="A"+a+"A"+b
      return command[:6]
    except Exception as e:
      #print (e, file=sys.stderr)
      #Attacking is better than nothing
      d = ['NN','NE','EE','SE','SS','SW','WW','NW']
      a=random.choice(d)
      b=random.choice([ x for x in d if x!=a])
      return "A"+a+"A"+b


info=sys.stdin.readline()
grid=sys.stdin.read()
info=info.split(",")
bot=Coward(*info)
bot.readGrid(grid)
t=bot.makeTurn()
#print(t, file=sys.stderr)
print(t)

3

ธ ปทแห่งความอยู่รอด - Python 2

from __future__ import print_function
health,gold,survived,poison,pit,revealer,knife = input()
if pit:
    exit()
#Yes, this is python 2, despite the use of input()
lines = []
try:
    while True:
        lines.append(raw_input())
except EOFError:
    pass
CMOVES={"NW":(-1,-1),"NN":(-1,+0),"NE":(-1,+1),
        "WW":(+0,-1),             "EE":(-0,+1),
    "SW":(+1,-1),"SS":(+1,+0),"SE":(+1,+1),
}
MOVES={v:k for k,v in CMOVES.iteritems()}
import sys
def get_your_pos():
    for row,line in enumerate(lines):
        for col,square in enumerate(line):
            if square == "Y":
                return row,col
    raise ValueError("Your bot is not present.")
def isnearby(thing,p=None):
    your_pos = p or get_your_pos()
    for move in MOVES:
        yp = your_pos[0]+move[0],your_pos[1]+move[1]
        try:
            if yp[0] >= 0 and yp[1] >= 0 and lines[yp[0]][yp[1]] == thing:
                return move
        except IndexError:
            #Edge of cavern
            pass
for turn in range(2):
    import random
    nprio = .5
    if health > 25:
        nprio -= .2
    elif health < 10:
        nprio += .3
    if poison:
        nprio += .18
    #heal
    motive = how = None
    if random.random() < nprio:
        nurse = isnearby("N")
        if nurse:
            motive = "M"
            how = MOVES[nurse]
        elif random.random() < nprio:
            food = isnearby("F")
            if food:
                motive = "M"
                how = MOVES[food]
    #cure poison
    if poison and not motive:
        water = isnearby("W")
        if water:
            motive = "M"
            how = MOVES[water]
    if not motive:
        #Kill lions, bats, and centipedes
        for animal in ("L","B","C"):
            animal = isnearby(animal)
            if animal:
                motive = "A"
                how = MOVES[animal]
                y = get_your_pos()
                y = y[0]+animal[0],y[1]+animal[1]
                lines = map(list,lines)
                lines[y[0]][y[1]] = "-"
                break
        else:
            #Pick up knives
            if not knife:
                knife = isnearby("K")
                if knife:
                    motive = "M"
                    how = MOVES[knife]
            #Attack other bots
            else:
                prey = isnearby("@")
                if prey:
                    motive = "A"
                    how = MOVES[prey]
    #Get gold
    gold = isnearby("G")
    if gold and not motive:
        motive = "M"
        how = MOVES[gold]
    def isvalidmove(c):
        c = CMOVES[c]
        y = get_your_pos()
        y=(y[0]+c[0],y[1]+c[1])
        if y[0] >= 0 and y[1] >= 0:
            try:
                lines[y[0]][y[1]]
            except LookupError:
                pass
            else:
                return True
    if turn and not motive:
        motive = "M"
        while not (how and how not in (isnearby("}"),isnearby("P"),isnearby("@"))\
              and isvalidmove(how)):
            how = random.choice(CMOVES.keys())
    if not motive:break
    if not turn and motive == "M":
        lines = map(list,lines)
        yp = get_your_pos()
        lines[yp[0]][yp[1]] = "-"
        yp=[yp[0]+CMOVES[how][0],yp[1]+CMOVES[how][1]]
        lines[yp[0]][yp[1]] = "Y"
    print(motive+how,end="")
else:
    exit()
#Nothing found on first move
def isvaguelynearby(thing):
    your_pos = get_your_pos()
    for move in MOVES:
        yp = your_pos[0]+move[0],your_pos[1]+move[1]
        try:
            if yp[0] >= 0 and yp[1] >= 0 and board[yp[0]][yp[1]] != "P":
                dest = isnearby(thing,yp)
                if dest:
                    return move,dest
        except IndexError:
            #Edge of cavern
            pass
if random.random() < nprio:
    dests = isvaguelynearby("N")
    if not dests and random.random() < nprio:
        dests = isvaguelynearby("F")
    if dests:
        m1,m2 = MOVES[dests[0]],MOVES[dests[1]]
        print("M" + m1 + "M" + m2)
        exit()
dests = (poison and isvaguelynearby("W")) or (not knife and isvaguelynearby("K"))\
    or isvaguelynearby("G")
prey = isvaguelynearby("L") or isvaguelynearby("B") or isvaguelynearby("C") or \
       (knife and isvaguelynearby("@"))
if dests:
    m1,m2 = MOVES[dests[0]],MOVES[dests[1]]
    print("M" + m1 + "M" + m2)
elif prey:
    m1,m2 = MOVES[prey[0]],MOVES[prey[1]]
    print("M" + m1 + "A" + m2)
else:
    how = None
    while not (how and how not in     (isnearby("}"),isnearby("P"),isnearby("@"))\
          and isvalidmove(how)):
        how = random.choice(CMOVES.keys())
    print("M"+how,end="")
    lines = map(list,lines)
    yp = get_your_pos()
    lines[yp[0]][yp[1]] = "-"
    yp=[yp[0]+CMOVES[how][0],yp[1]+CMOVES[how][1]]
    lines[yp[0]][yp[1]] = "Y"
    while not (how and how not in (isnearby("}"),isnearby("P"),isnearby("@"))\
          and isvalidmove(how)):
            how = random.choice(CMOVES.keys())
    print("M"+how)

แก้ไข: เพิ่มการหลีกเลี่ยงหลุมที่ดีขึ้น


2

ปลาปักเป้า Python 3+

ฉันแค่เป็นคน ๆ นั้น

#!/usr/bin/env python3.4
import random
def select():
 return "A"+["NN","NE","EE","SE","SS","SW","WW","NW"][random.randint(0,7)]
print(select()+select())

บอทนี้มีวัตถุประสงค์เพื่อการยังชีพ ฉันอาจเพิ่มการค้นหากอล์ฟในภายหลังถ้าฉันมีเวลา
Conor O'Brien

มันจะทำให้โค้ดของคุณยาวขึ้นเล็กน้อย แต่ Pufferfish สามารถโจมตีสองครั้งในเทิร์นเดียวกันถ้ามันต้องการที่จะเป็นอันตรายยิ่งกว่า
The Beanstalk

@TheBeanstalk โอ้โหหวาน!
Conor O'Brien

คุณรู้ว่าบอทนี้จะไม่ได้รับทองคำเลยและบอทอื่น ๆ ทั้งหมดจะไม่เดินเข้าไปใน "kill aura" ของมัน
pppery

@ pperry ฉันตระหนักถึงสิ่งนี้; นี่คือหลักที่จะทำให้ลูกบอลกลิ้ง; มันไม่ได้ตั้งใจที่จะชนะ แต่จะทำให้ชีวิตยากขึ้นเล็กน้อย เช่นเดียวกับBlack Hat Man
Conor O'Brien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.