通过python解决原神解密

最近楼主玩原神世界任务做到稻妻了,在稻妻有很多解密游戏,但是博主最头疼的就是稻妻的石头解密QAQ(如图)

就在昨晚,楼主又碰到了石头解密,瞎打,半天解不出来。于是就想,有没有什么严谨的方法可以100%解出这种谜题呢?

答案是有的,而且方法还有很多种,当然,将游戏内容转化成问题的时候必然要经历抽象的过程。

楼主在这里先给没玩过原神的小伙伴们科普一下,原神中这种石头解密存在两种石头,一种是提示石,另一种是交互石,两种石头上都有紫色的图腾指示石头的朝向。每次使用角色攻击交互石,交互石会转动90°,当所有交互石的朝向均与提示石相同时,解密成功。乍一听很简单,但是解密的难点接在于,不同的交互石可能会连锁若干其他交互石,当该交互石受到攻击时,该交互石会转动90°,同时,与之连锁的交互石也会转动90°!这就使得解出这种谜题需要动一点脑筋。

抽象

以楼主昨晚遇到的解密为例吧。

如图所示,提示石(中心)朝向我们,我们暂且将提示石的朝向定义为向前。由图可知,交互石1与交互石4均朝前,交互石2与交互石3均朝后。

我们可以将交互石的四种状态(朝前、朝左、朝后、朝右)定义为0,1,2,3。接着,我们将四块交互石想象成矩阵中的元素,即交互石初始状态的矩阵表示为[[0, 2], [2, 0]]。然后将攻击交互操作抽象为交互石对应的矩阵元素+1。设矩阵元素为x,每次完成交互后,该元素变为x mod 4。当矩阵元素均为0时,解密成功。

至于连锁关系则是:当矩阵中某一元素加一时,与其同行以及同列的元素均加一

到此,抽象完毕!正式介绍我们的方法:

方法一 注意到

我们注意到将矩阵中两个元素'2'都进行两次加一操作,就可以完成解密。当然了,用这个方法是有条件的,条件就是你拥有惊人的注意力。(当然,可能是楼主熬夜熬得比较累,一时间注意不到)

方法二 python解决

python 复制代码
import random


class resolve_puzzle:
    def __init__(self):  # 初始化定义矩阵
        self.matrix = [[0, 2], [2, 0]]
        # 将方法都放入实例的列表,方便下面操作
        self.method_list = [self.revolve1, self.revolve2, self.revolve3, self.revolve4]

    def revolve1(self):  # 用来与交互石1完成交互的方法
        self.matrix[0][0] = (self.matrix[0][0] + 1) % 4
        self.matrix[0][1] = (self.matrix[0][1] + 1) % 4
        self.matrix[1][0] = (self.matrix[1][0] + 1) % 4
        print('移动交互石1')

    def revolve2(self):  # 用来与交互石2完成交互的方法
        self.matrix[0][0] = (self.matrix[0][0] + 1) % 4
        self.matrix[0][1] = (self.matrix[0][1] + 1) % 4
        self.matrix[1][1] = (self.matrix[1][1] + 1) % 4
        print('移动交互石2')

    def revolve3(self):  # 用来与交互石3完成交互的方法
        self.matrix[0][0] = (self.matrix[0][0] + 1) % 4
        self.matrix[1][1] = (self.matrix[1][1] + 1) % 4
        self.matrix[1][0] = (self.matrix[1][0] + 1) % 4
        print('移动交互石3')

    def revolve4(self):  # 用来与交互石4完成交互的方法
        self.matrix[1][1] = (self.matrix[1][1] + 1) % 4
        self.matrix[0][1] = (self.matrix[0][1] + 1) % 4
        self.matrix[1][0] = (self.matrix[1][0] + 1) % 4
        print('移动交互石4')

    def action(self):
        while self.matrix[0][0]+self.matrix[0][1]+self.matrix[1][0]+self.matrix[1][1] != 0:
            a = random.randint(0, 3)
            met = self.method_list[a]
            met()


resolve_puzzle().action()

这个方法非常暴力,思维十分简单,就是随机进行操作,直至成功。但是由于操作是随机的,输出的值会有很长一串,这个时候就需要复制输出的结果,粘贴到excel打开,进行计数操作

通过计数,楼主某次获得的数据是:{'移动交互石1':60, '移动交互石1':58, '移动交互石1':66, '移动交互石1':60},已知移动四次相当于移动0次,故交互次数可以翻译成{'移动交互石1':0, '移动交互石1':2, '移动交互石1':2, '移动交互石1':0},与我们刚才注意到的结果相同。

写在最后

其实楼主水平不高,写的这种算法有种投机取巧的感觉,十分粗糙。严谨高效的写法应当是使用递归或者是用树来解决。但是楼主都无法完成完整程序,如果有感兴趣的小伙伴,可以和楼主分享分享。

相关推荐
无尽的大道5 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒9 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio18 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE20 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻24 分钟前
WPF中的依赖属性
开发语言·wpf
洋24032 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙34 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点35 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
NoneCoder1 小时前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
苏三有春1 小时前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt