Skip to content

Instantly share code, notes, and snippets.

@Muratam
Last active August 8, 2019 18:40
Show Gist options
  • Save Muratam/eeb6367d789cb9bdd0284b7638c7be90 to your computer and use it in GitHub Desktop.
Save Muratam/eeb6367d789cb9bdd0284b7638c7be90 to your computer and use it in GitHub Desktop.
不思議の城のヘレンの痺れの人をロングボウ・サンダー・ヒールで倒すスクリプト
import deques,sets
# outputs
# CLEAR!!
# HHTHBHTBBBBB
# (myHP: 2, eneHP: -3, myCmd: 0, eneCmd: 3, myLeftTurn: 5, eneLeftTurn: 1)
# HP:71 -> 78
# bow:21/2/5 (0)
# thu:35/0/10(1)
# hea:60/0/15(2)
# s1:20/4/10 (0)
# s2:22/6/5 (1)
# s3:24/8/5 (2)
# dr:35/0/17 (3)
type State = tuple[myHP,eneHP,myCmd,eneCmd,myLeftTurn,eneLeftTurn:int]
type StateWithMsg = tuple[state:State,msg:string]
type Cmd = tuple[damage,guard,turn:int,msg:string]
let myCmds : seq[Cmd] = @[
(21,2,5,"B"), (35,0,10,"T"), (60,0,15,"H")
]
let eneCmds : seq[Cmd] = @[
(20,4,10,""),(22,6,5,""),(24,8,5,""),(35,0,17,"")
]
const maxMyHP = 78
const maxEneHP = 150
var already = initHashSet[State]()
var minEneHP = maxEneHP
proc getNextStates(sm:StateWithMsg):seq[StateWithMsg] =
var s = sm.state
var msg = sm.msg
for turn in 0..100:
if s.myLeftTurn - turn == 0:
var guard = eneCmds[s.eneCmd].guard
var damage = myCmds[s.myCmd].damage
s.eneLeftTurn -= turn
if s.myCmd == 0: # Bow
s.eneHP -= damage - guard
elif s.myCmd == 1: # Thu
s.eneHP -= damage
elif s.myCmd == 2: # Heal
s.myHP = maxMyHP.min(s.myHP + damage)
msg &= myCmds[s.myCmd].msg
if s.eneHP <= 0:
echo "CLEAR!!"
echo msg
echo s
quit 0
minEneHP = minEneHP.min(s.eneHP)
result = @[]
for cmd in 0..2:
var s2 = s
s2.myCmd = cmd
s2.myLeftTurn = myCmds[cmd].turn
result &= (s2,msg) # (s2,msg & $s2 & "\n")
return result
elif s.eneLeftTurn - turn == 0:
var guard = myCmds[s.myCmd].guard
var damage = eneCmds[s.eneCmd].damage
s.myLeftTurn -= turn
s.myHP -= damage - guard
if s.eneCmd == 3 : # ドレイン
s.myHP -= guard
s.eneHP += damage
s.eneHP = maxEneHP.min(s.eneHP)
if s.myHP <= 0 : return @[]
s.eneCmd = (s.eneCmd + 1) mod eneCmds.len
s.eneLeftTurn = eneCmds[s.eneCmd].turn
return @[(s,msg)]
var q = initDeque[StateWithMsg]()
for i,cmd in myCmds:
var s : State = (maxMyHP,maxEneHP,i,0,cmd.turn,eneCmds[0].turn)
q.addLast (s,"") #& $s & "\n")
while q.len > 0:
var s = q.popFirst()
for (ns,msg) in s.getNextStates():
if ns in already: continue
q.addLast((ns,msg))
already.incl ns
echo "NO"
echo minEneHP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment