Python-《原神》荒海雷立方机关破解一

Posted 小狐狸FM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-《原神》荒海雷立方机关破解一相关的知识,希望对你有一定的参考价值。

前言

  • 在玩《原神》的时候遇到了一个机关破解的问题,弄了很久没弄出来,最后写了一个python脚本跑出来了。
  • 只想要得到结果的小伙伴直接复制代码并运行即可,算法思路仅供参考

相关介绍

Python index()方法 | 菜鸟教程

Python-《原神》荒海雷立方机关破解二

一、问题

雷立方机关在下方地图的位置

中间的那个雷立方是不可击打,当剩余四个角的机关和中间机关的方向一致时就能完成解谜

先设一下四个角的机关名称,方便思考

经过测试发现,击打一个机关,将会让三个机关同时顺时针旋转(包括击打的那个机关)

击打的机关顺时针旋转的机关
pos1pos1 pos2 pos3
pos2pos1 pos2 pos4
pos3pos1 pos3 pos4
pos4pos2 pos3 pos4

然后规定一下方向,顺时针走向
正确的方向开始为a,剩下的依次是bcd

二、算法思路

[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个机关的方向
击打的机关顺时针旋转的机关
pos1pos1 pos2 pos3
pos2pos1 pos2 pos4
pos3pos1 pos3 pos4
pos4pos2 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-《原神》荒海雷立方机关破解一的主要内容,如果未能解决你的问题,请参考以下文章

Python-《原神》荒海雷立方机关破解一

Python-《原神》荒海雷立方机关破解一

原神为啥不全局渲染了

python+Selenium之自动滑块破解滑块验证码

译丨Yarn - Javascript 新一代套件管理

贴吧旋转验证码---python破解代码