通过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},与我们刚才注意到的结果相同。

写在最后

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

相关推荐
天下无敌笨笨熊16 分钟前
PyQT开发总结
python·pyqt
机器学习Zero26 分钟前
让效率飞升的秘密武器:解锁编程高效时代的钥匙
git·python·github·aigc
wjcroom1 小时前
celery-APP在windows平台的发布方法(绿色免安装exe可搭配eventlet)
windows·python·celery
GISer小浪花努力上岸1 小时前
Java实现简易计算器功能(idea)
java·开发语言·intellij-idea
2401_858120531 小时前
深入理解 Swift 中的隐式解包可选类型(Implicitly Unwrapped Optionals)
开发语言·ios·swift
quaer1 小时前
QT chart案例
开发语言·qt·swift
海海向前冲1 小时前
设计模式 -- 单例设计模式
java·开发语言·设计模式
AI让世界更懂你1 小时前
漫谈设计模式 [5]:建造者模式
python·设计模式·建造者模式
TT-Kun1 小时前
C++ | vector 详解
开发语言·c++
FutureUniant2 小时前
GitHub每日最火火火项目(9.13)
人工智能·python·计算机视觉·github·音视频