Python-《原神》荒海雷立方机关破解一
Posted 小狐狸FM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-《原神》荒海雷立方机关破解一相关的知识,希望对你有一定的参考价值。
前言
- 在玩《原神》的时候遇到了一个机关破解的问题,弄了很久没弄出来,最后写了一个python脚本跑出来了。
- 只想要得到结果的小伙伴直接复制代码并运行即可,算法思路仅供参考
相关介绍
一、问题
雷立方机关在下方地图的位置
中间的那个雷立方是不可击打,当剩余四个角的机关和中间机关的方向一致时就能完成解谜
先设一下四个角的机关名称,方便思考
经过测试发现,击打一个机关,将会让三个机关同时顺时针旋转(包括击打的那个机关)
击打的机关 | 顺时针旋转的机关 |
---|---|
pos1 | pos1 pos2 pos3 |
pos2 | pos1 pos2 pos4 |
pos3 | pos1 pos3 pos4 |
pos4 | pos2 pos3 pos4 |
然后规定一下方向,顺时针走向
正确的方向开始为a
,剩下的依次是b
、c
和d
二、算法思路
[1]. 模拟机关旋转
用一个列表来存储四个方向对应的字母
direction = ["a", "b", "c", "d"] # 机关的方向标记,a为正确的方向
- 我们需要机关顺时针旋转时,就让下标往右移动一位,就能获取对应的方向
- 但是对于最后一个元素
d
会越界,所以需要对列表的个数求余数
d
的下标为3
,当下标+1
时变为4
,然后对列表个数4
求余数4%4=0
,而0
就是a
对应的下标了- Python index()方法 | 菜鸟教程
direction = ["a", "b", "c", "d"] # 机关的方向标记,a为正确的方向
print(direction[(dirction.index("d") + 1) % len(dirction)]) #测试
然后用一个列表
lis_now
存储当前机关的方向,列表answer
存储各个机关击打的次数
lis_now = ["d","a","c","c"] #机关当前的方向
direction = ["a", "b", "c", "d"] # 机关的方向标记,a为正确的方向
answer = [0,0,0,0] #正确的答案
- 因为击打不同机关,会让不同的机关发生旋转
- 所以可以写
4
个函数,当需要某个机关旋转时就调用对应的函数,改变对应3
个机关的方向
击打的机关 | 顺时针旋转的机关 |
---|---|
pos1 | pos1 pos2 pos3 |
pos2 | pos1 pos2 pos4 |
pos3 | pos1 pos3 pos4 |
pos4 | pos2 pos3 pos4 |
lis_now = ["d","a","c","c"] #机关当前的方向
direction = ["a", "b", "c", "d"] # 机关的方向标记,a为正确的方向
answer = [0,0,0,0] #正确的答案
def Move1(lis_now,direction):
'''移动左上角的机关,将会让pos1、pos2、pos3顺时针旋转'''
lis_now[0] = direction[(direction.index(lis_now[0]) + 1)% len(direction)] #移动pos1
lis_now[1] = direction[(direction.index(lis_now[1]) + 1)% len(direction)] #移动pos2
lis_now[2] = direction[(direction.index(lis_now[2]) + 1)% len(direction)] #移动pos3
return lis_now
def Move2(lis_now,direction):
'''移动右上角的机关,将会让pos1、pos2、pos4顺时针旋转'''
lis_now[0] = direction[(direction.index(lis_now[0]) + 1)% len(direction)] #移动pos1
lis_now[1] = direction[(direction.index(lis_now[1]) + 1)% len(direction)] #移动pos2
lis_now[3] = direction[(direction.index(lis_now[3]) + 1)% len(direction)] #移动pos4
return lis_now
def Move3(lis_now,dircetion):
'''移动左下角的机关,将会让pos1、pos3、pos4顺时针旋转'''
lis_now[0] = direction[(direction.index(lis_now[0]) + 1)% len(direction)] #移动pos1
lis_now[2] = direction[(direction.index(lis_now[2]) + 1)% len(direction)] #移动pos3
lis_now[3] = direction[(direction.index(lis_now[3]) + 1) % len(direction)] # 移动pos4
return lis_now
def Move4(lis_now,direction):
'''移动右下角的机关,将会让pos2、pos3、pos4顺时针旋转'''
lis_now[1] = direction[(direction.index(lis_now[1]) + 1)% len(direction)] #移动pos2
lis_now[2] = direction[(direction.index(lis_now[2]) + 1)% len(direction)] #移动pos3
lis_now[3] = direction[(direction.index(lis_now[3]) + 1) % len(direction)] # 移动pos4
return lis_now
[2]. 遍历求解
- 多次击打同一个机关可以发现,每击打
4
次之后就会还原到最开始没有击打的状态,所以每个循环只需要遍历4次即可- 一共有
4
个机关,就写四个循环
当符合方向都为a
时就打印结果,结束程序- 每次击打机关之后,都将击打的次数记录到列表
answer
中
每4
次一循环,击打的次数超过4
次时,需要对4
求余数
lis_now = ["d","a","c","c"] #机关当前的方向
direction = ["a", "b", "c", "d"] # 机关的方向标记,a为正确的方向
answer = [0,0,0,0] #正确的答案
for i in range(4): # 循环1
answer = [0, 0, 0, 0] # 重置
Move1(lis_now, direction) # 触发pos1
answer[0] = (answer[0] + 1) % 4 # 记录pos1击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
for j in range(4): # 循环2
Move2(lis_now, direction) # 触发pos2
answer[1] = (answer[1] + 1) % 4 # 记录pos2击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
for k in range(4): # 循环3
Move3(lis_now, direction) # 触发pos3
answer[2] = (answer[2] + 1) % 4 # 记录pos3击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
for g in range(4): # 循环4
Move4(lis_now, direction) # 触发pos4
answer[3] = (answer[3] + 1) % 4 # 记录pos4击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
三、代码
- 当前我的机关方向为
d a c c
,遍历得到的结果为1 1 3 2
,之后分别对对应机关击打相应的次数即可- 我的击打顺序是
pos1
击打1
次,pos2
击打1
次,pos3
击打3
次,pos4
击打2
次
# 作者:小狐狸FM
def Move1(lis_now,dirction):
'''移动左上角的机关,将会让pos1、pos2、pos3顺时针旋转'''
lis_now[0] = dirction[(dirction.index(lis_now[0]) + 1)% len(dirction)] #移动pos1
lis_now[1] = dirction[(dirction.index(lis_now[1]) + 1)% len(dirction)] #移动pos2
lis_now[2] = dirction[(dirction.index(lis_now[2]) + 1)% len(dirction)] #移动pos3
return lis_now
def Move2(lis_now,dirction):
'''移动右上角的机关,将会让pos1、pos2、pos4顺时针旋转'''
lis_now[0] = dirction[(dirction.index(lis_now[0]) + 1)% len(dirction)] #移动pos1
lis_now[1] = dirction[(dirction.index(lis_now[1]) + 1)% len(dirction)] #移动pos2
lis_now[3] = dirction[(dirction.index(lis_now[3]) + 1)% len(dirction)] #移动pos4
return lis_now
def Move3(lis_now,dirction):
'''移动左下角的机关,将会让pos1、pos3、pos4顺时针旋转'''
lis_now[0] = dirction[(dirction.index(lis_now[0]) + 1)% len(dirction)] #移动pos1
lis_now[2] = dirction[(dirction.index(lis_now[2]) + 1)% len(dirction)] #移动pos3
lis_now[3] = dirction[(dirction.index(lis_now[3]) + 1) % len(dirction)] # 移动pos4
return lis_now
def Move4(lis_now,dirction):
'''移动右下角的机关,将会让pos2、pos3、pos4顺时针旋转'''
lis_now[1] = dirction[(dirction.index(lis_now[1]) + 1)% len(dirction)] #移动pos2
lis_now[2] = dirction[(dirction.index(lis_now[2]) + 1)% len(dirction)] #移动pos3
lis_now[3] = dirction[(dirction.index(lis_now[3]) + 1) % len(dirction)] # 移动pos4
return lis_now
if __name__=="__main__": #主函数
lis_now = ["d", "a", "c", "c"] # 机关当前的方向
dirction = ["a", "b", "c", "d"] # 机关的方向标记,a为正确的方向
answer = [0,0,0,0] #正确的答案
# pos1 = "d" # 左上角的机关方向,击打pos1将会使pos1、pos2、pos3顺时针旋转
# pos2 = "a" # 右上角的机关方向,击打pos2将会使pos1、pos2、pos4顺时针旋转
# pos3 = "c" # 左下角的机关方向,击打pos3将会使pos1、pos3、pos4顺时针旋转
# pos4 = "c" # 右下角的机关方向,击打pos4将会使pos2、pos3、pos4顺时针旋转
# print(dirction[(dirction.index("d") + 1) % len(dirction)]) #测试
for i in range(4): #循环1
answer = [0,0,0,0] #重置
Move1(lis_now,dirction) #触发pos1
answer[0] = (answer[0] + 1)%4 #记录pos1击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
for j in range(4): #循环2
Move2(lis_now,dirction) #触发pos2
answer[1] = (answer[1] + 1)%4 #记录pos2击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
for k in range(4): #循环3
Move3(lis_now, dirction) # 触发pos3
answer[2] = (answer[2] + 1)%4 #记录pos3击打的次数
if lis_now == ["a", "a", "a", "a"]: # 找到答案时
print(answer)
exit
for g in range(4): #循环4
Move4(lis_now, dirction) # 触发pos4
answer[3] = (answer[3] + 1)%4 #记录pos4击打的次数
if lis_now == ["a","a","a","a"]: #找到答案时
print(answer)
exit
以上是关于Python-《原神》荒海雷立方机关破解一的主要内容,如果未能解决你的问题,请参考以下文章