基于Python的心跳文学社(Doki Doki Literature Club)秘密诗篇10的自动化获取方案

总览

PS:在Steam的指南里面写这玩意儿失败了,一直报错code 15,所以就只能放在站台里面了。

在做DDLC+全成就的时候发现了需要靠概率才能刷出来的收集要素秘密10(the 10th secret poem),其出现概率低得令人发指,导致刷出来的时间从5分钟到十多个小时不等。我个人自认脸黑且懒,但是既然是DDLC就不得不全成就,所以自己写了些代码来实现反复进入游戏的过程。最终在33分钟重复了115次后连续刷出了两次秘密10,看上去还行。

所以现在将程序代码进行修枝完善后发布,给同样对运气没有信心但是还想要收集的玩家一些帮助。

代码简介

代码由python写成,非常简单,实现鼠标的移动单击和截屏保存。代码不包括任何网络通讯功能。逻辑如下:

从游戏的OS界面(游戏中模拟电脑的画面)单击心跳文学部进入DDLC,待人物立绘出现后截屏。对于截屏的某一个特定像素进行颜色分析,若颜色为黑色,则刷出了秘密10,保存截屏,程序退出。若为原来的颜色,则退出DDLC回到OS界面再进入DDLC循环。

准备工作

DDLC

1.DDLC进入第二周目,首次见到Monika后就可以保存退出。
2.DDLC分辨率调整到1920×1080并全屏。

电脑

1.安装Python Welcome to Python.org
2.使用pip安装pyautogui(控制鼠标)和pillow(图像截屏和分析)
3.分辨率调整到1920×1080(我的电脑是这样的分辨率,鼠标的移动也是按照该分辨率设置的)

运行

代码需要在游戏全屏进行时运行。可以在游戏全屏的时候按Windows键从下面任务栏调出没有最大化的编辑器或文件管理器。注意调出的编辑器或文件管理器不能遮挡游戏的OS界面菜单选项。

对于有编程经验的人可以直接用熟手的编辑器来运行代码。

对于没有编程经验的人可以创建一个txt文件,将代码粘贴保存后文件更名为example.py(注意把txt的后缀改成py),然后在代码保存的文件夹下创建一个txt文件,粘贴以下代码:

python example.py

保存文件后文件更名为1.bat。双击文件运行程序。

结果

如果吃完饭看完电影回来发现画面停在了OS界面,则秘密10已经刷到,可以在shortcut里面找到截图和刷图用时以及刷图的次数。

如果页面停在了游戏的设置画面,则在点击进入游戏时出现了问题,需要稍微加长while下面四行的两个duration参数。

代码

import pyautogui as ui
from PIL import ImageGrab
from PIL import Image
import time
import os
path = './shortcut/'

if not os.path.exists(path=path):           #创建文件夹保存截图  #create a folder to save shortcut

    os.mkdir(path=path)
   
i = 1
time0 = time.time()
while(i):  
    ui.moveTo(200,480,duration=1.7)         #点击开机键
    ui.leftClick(200,480)
    ui.moveTo(200,470,duration=0.3)         #enter DDLC
    ui.leftClick(200,470)

    ui.moveTo(150,900,duration=5)           #等待开屏动画   #5s game loading
    pic = ImageGrab.grab()
    pic.save(path + '0_'+str(i) + '.jpg')   #截图保存格言   #save monologue
 
    ui.moveTo(150,900,duration=0.5)
    ui.moveTo(150,900,duration=4)           #等待立绘动画   #load menu
    pic = ImageGrab.grab()                  #立绘截图      #get characters image from menu  

    ui.moveTo(150,900,duration=0)           #退出DDLC      #exit DDLC and back to OS
    ui.leftClick(150,900)

    img = pic.convert('RGB')
    color = img.getpixel((1600,680))        #截取图中某点的像素  #get pixel from characters image (actually from Monika)    

    if color != (166,132,143):              #判断色素是否正常,不正常则保存立绘并退出自动程序  
        filePath = os.path.join(path,'test.txt')#check the color of the pixel, if black then save the ghost menu and cease the script
        with open(filePath,'w') as f:
            f.write(f'It took {(time.time()-time0)//1}s and repeated for {i} times')
        pic.save(path + str(i) + '.jpg')    #截图
        break

    ui.leftClick(850,600)#确认退出
  
    i = i + 1