賽爾號(hào):哀目黑子日記本破譯密碼小游戲的程序分享

賽爾號(hào)“【哀目黑子的日記本】破譯密碼”小游戲的程序分享
作者:橙汁

游戲背景
本周(2020.03.20)賽爾號(hào)更新了一個(gè)非常有意思的解密小游戲,“【哀目黑子的日記本】破譯密碼”。
游戲要求我們完成四位數(shù)字(顏色)解密小游戲,以便了解異世界的秘密,獲得養(yǎng)成道具。

“破譯密碼”小游戲的游戲規(guī)則如下所示。簡(jiǎn)單來說就是選四個(gè)顏色,猜密碼。

單機(jī)程序
我覺得這個(gè)小游戲挺好玩的,所以就把它做成單機(jī)版的小游戲了,無聊的時(shí)候可以隨時(shí)隨地玩。
這是電腦Windows的版本。(界面只是用了登錄器的外觀,核心只是小游戲,不是游戲網(wǎng)頁。)

這是手機(jī)Android的版本。(安卓手機(jī)安裝程序不需要上架應(yīng)用商店,比較方便;但是蘋果手機(jī)我就愛莫能助了,即使做出來也無法安裝。)

這兩個(gè)單機(jī)版小游戲的程序文件我已經(jīng)分享到QQ群與百度網(wǎng)盤了,下載途徑待會(huì)兒請(qǐng)見置頂評(píng)論吧。
解密程序
“密碼破譯”這種事情,交給計(jì)算機(jī)才是最方便的,所以我又寫了一個(gè)解密程序,幫助玩家“解密”小游戲。

?玩家只需要根據(jù)提示,輸入鎖孔角數(shù)與每次提示的綠燈個(gè)數(shù),程序就可以幫忙給出答案。

這小游戲的解密程序文件我已經(jīng)分享到QQ群與百度網(wǎng)盤了,下載途徑待會(huì)兒請(qǐng)見置頂評(píng)論吧。
程序代碼
解密程序是使用Python寫的,在這里我就獻(xiàn)丑,分享一下源碼吧。
大體的設(shè)計(jì)思路是這樣的:
找出每個(gè)顏色的數(shù)量。
將顏色的數(shù)量組合進(jìn)行分類。
選取數(shù)量最少的顏色,進(jìn)行逐位排查,這里為了縮短步數(shù),依次使用兩種顏色,最少的顏色選1個(gè),另一種顏色選多個(gè)。
整理分析情況,得出最終結(jié)果。
程序代碼如下所示。
def reLoad():
? ? global colorNum
? ? colorNum = [0,0,0,0,0]
? ? global colorName
? ? colorName = ['黃','藍(lán)','綠','紅','紫']
? ? print('')
def str2num(s:str):
? ? s = s.replace(' ','')
? ? try:
? ? ? ?num = float(s)
? ? except:
? ? ? ? try:
? ? ? ? ? ? num = float(eval(s))
? ? ? ? except:
? ? ? ? ? ? num = 0.0
? ? return num
def getListSum(li):
? ? sum = 0
? ? for i in li:
? ? ? ? sum += i
? ? return sum
? ??
def getNumType():
? ? if 4 in colorNum:
? ? ? ? return 0
? ? if 3 in colorNum:
? ? ? ? return 1
? ? if colorNum.count(2) == 2:
? ? ? ? return 2
? ? if 1 in colorNum and 2 in colorNum:
? ? ? ?return 3
? ? return 4
def Do():
? ? NumType = getNumType()
? ? finish = False
? ? if NumType == 0:
? ? ? ? for i in range(5):
? ? ? ? ? ? if colorNum[i] == 4:
? ? ? ? ? ? ? ? print('【答案】' + colorName[i] + ' ' + colorName[i] + ' ' + colorName[i] + ' ' + colorName[i])
? ? ? ? ? ? ? ? finish =?True
? ? ? ? ? ? ? ? break
? ? elif NumType == 1:
? ? ? ? big = -1
? ? ? ? small = -1
? ? ? ? for i in range(5):
? ? ? ? ? ? if colorNum[i] == 3:
? ? ? ? ? ? ? ? big = i
? ? ? ? ? ? elif colorNum[i] == 1:
? ? ? ? ? ? ? ? small = i
? ? ? ? for i in range(3):
? ? ? ? ? ? check =?False
? ? ? ? ? ? guess = [colorName[big],colorName[big],colorName[big],colorName[big]]
? ? ? ? ? ? guess[i] = colorName[small]
? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? while not(check):
? ? ? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? ? ? if green == 2:
? ? ? ? ? ? ? ? ? ? finish = False
? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? elif green == 4:
? ? ? ? ? ? ? ? ? ? finish = True
? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? ? ? print('【答案】' + guess)
? ? ? ? ? ? ? ? ? ? break
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? if finish == False:
? ? ? ? ? ? guess = [colorName[big],colorName[big],colorName[big],colorName[big]]
? ? ? ? ? ? guess[3] = colorName[small]
? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? print('【答案】' + guess)
? ? elif NumType == 2:
? ? ? ? A = -1
? ? ? ? B = -1
? ? ? ? for i in range(5):
? ? ? ? ? ? if colorNum[i] == 2:
? ? ? ? ? ? ? ? if A < 0:
? ? ? ? ? ? ? ? ? ? A = i
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? B = i
? ? ? ? check0 = False
? ? ? ? while not check0:
? ? ? ? ? ? isB = [0,0,0,0]
? ? ? ? ? ? for i in range(3):
? ? ? ? ? ? ? ? check = False
? ? ? ? ? ? ? ? guess = [colorName[A],colorName[A],colorName[A],colorName[A]]
? ? ? ? ? ? ? ? guess[i] = colorName[B]
? ? ? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? ? ? while not(check):
? ? ? ? ? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? ? ? ? ? if green == 3:
? ? ? ? ? ? ? ? ? ? ? ? isB[i] = 1
? ? ? ? ? ? ? ? ? ? ? ? finish = False
? ? ? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? ? ? elif green == 1:
? ? ? ? ? ? ? ? ? ? ? ? isB[i] = 0
? ? ? ? ? ? ? ? ? ? ? ? finish = False
? ? ? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? ? ? sum = getListSum(isB)
? ? ? ? ? ? if sum == 1:
? ? ? ? ? ? ? ? isB[3] = 1
? ? ? ? ? ? ? ? check0 = True
? ? ? ? ? ? elif sum == 2:
? ? ? ? ? ? ? ? check0 =?True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? guess = ''
? ? ? ? for i in range(4):
? ? ? ? ? ? if isB[i] == 1:
? ? ? ? ? ? ? ? guess += colorName[B] + ' '
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? guess += colorName[A] + ' '
? ? ? ? finish = True
? ? ? ? print('【答案】' + guess)
? ? elif NumType == 3:
? ? ? ? big = -1
? ? ? ? sml1 = -1
? ? ? ? sml2 = -1
? ? ? ? for i in range(5):
? ? ? ? ? ? if colorNum[i] == 2:
? ? ? ? ? ? ? ? big = i
? ? ? ? ? ? elif colorNum[i] == 1:
? ? ? ? ? ? ? ? if sml1 < 0:
? ? ? ? ? ? ? ? ? ? sml1 = i
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? sml2 = i
? ? ? ? check0 = False
? ? ? ? while not check0:
? ? ? ? ? ? arr = []
? ? ? ? ? ? greens = []
? ? ? ? ? ? for i in range(3):
? ? ? ? ? ? ? ? check = False
? ? ? ? ? ? ? ? guess = [colorName[big],colorName[big],colorName[big],colorName[big]]
? ? ? ? ? ? ? ? guess[i] = colorName[sml1]
? ? ? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? ? ? while not check:
? ? ? ? ? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? ? ? ? ? if green == 1:
? ? ? ? ? ? ? ? ? ? ? ? arr.append(big)
? ? ? ? ? ? ? ? ? ? ? ? greens.append(green)
? ? ? ? ? ? ? ? ? ? ? ? finish = False
? ? ? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? ? ? elif green == 2:
? ? ? ? ? ? ? ? ? ? ? ? arr.append(sml2)
? ? ? ? ? ? ? ? ? ? ? ? greens.append(green)
? ? ? ? ? ? ? ? ? ? ? ? finish = False
? ? ? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? ? ? elif green == 3:
? ? ? ? ? ? ? ? ? ? ? ? arr.append(sml1)
? ? ? ? ? ? ? ? ? ? ? ? greens.append(green)
? ? ? ? ? ? ? ? ? ? ? ? finish = False
? ? ? ? ? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? ? ? if getListSum(greens) >?3:
? ? ? ? ? ? ? ? check0 = True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? if?(sml1?in?arr?or?sml2?in?arr) and arr.count(big) < 2:
? ? ? ? ? ? arr.append(big)
? ? ? ? else:
? ? ? ? ? ? if sml1 in arr:
? ? ? ? ? ? ? ? arr.append(sml2)
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? arr.append(sml1)
? ? ? ? guess = colorName[arr[0]] + ' ' + colorName[arr[1]] + ' ' + colorName[arr[2]] + ' ' + colorName[arr[3]]
? ? ? ? finish = True
? ? ? ? print('【答案】'+guess)
? ? else:
? ? ? ? A = -1
? ? ? ? B = -1
? ? ? ? C = -1
? ? ? ? D = -1
? ? ? ? for i in range(5):
? ? ? ? ? ? if colorNum[i] == 1:
? ? ? ? ? ? ? ? if A < 0:
? ? ? ? ? ? ? ? ? ? A = i
? ? ? ? ? ? ? ? elif B < 0:
? ? ? ? ? ? ? ? ? ? B = i
? ? ? ? ? ? ? ? elif C < 0:
? ? ? ? ? ? ? ? ? ? C = i
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? D = i
? ? ? ? greens = []
? ? ? ? arr = []
? ? ? ? check = False
? ? ? ? while not check:
? ? ? ? ? ? guess = [colorName[B],colorName[A],colorName[A],colorName[A]]
? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? if green < 3:
? ? ? ? ? ? ? ? greens.append(green)
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? check = False
? ? ? ? while not check:
? ? ? ? ? ? guess = [colorName[C],colorName[A],colorName[A],colorName[A]]
? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? if green < 3 and greens[0] + green < 4:
? ? ? ? ? ? ? ? greens.append(green)
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? temp = []
? ? ? ? if greens[0] == 0 and greens[1] == 0:
? ? ? ? ? ? arr.append(A)
? ? ? ? ? ? temp = [A,C,B,B]
? ? ? ? ? ? tmp = D
? ? ? ? elif greens[0] ==?2:
? ? ? ? ? ? arr.append(B)
? ? ? ? ? ? temp = [B,C,A,A]
? ? ? ? ? ? tmp = D
? ? ? ? elif greens[1] == 2:
? ? ? ? ? ? arr.append(C)
? ? ? ? ? ? temp = [C,B,A,A]
? ? ? ? ? ? tmp = D
? ? ? ? else:
? ? ? ? ? ? arr.append(D)
? ? ? ? ? ? temp = [D,B,A,A]
? ? ? ? ? ? tmp = C
? ? ? ? check = False
? ? ? ? while not check:
? ? ? ? ? ? guess = [colorName[temp[0]],colorName[temp[1]],colorName[temp[2]],colorName[temp[3]]]
? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? if green == 2:
? ? ? ? ? ? ? ? arr.append(tmp)
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? elif green == 3:
? ? ? ? ? ? ? ? arr.append(temp[1])
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? elif green == 1:
? ? ? ? ? ? ? ? arr.append(temp[2])
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? temp = [arr[0],arr[1]]
? ? ? ? for i in range(5):
? ? ? ? ? ? if i not in temp?and colorNum[i] == 1:
? ? ? ? ? ? ? ? temp.append(i)
? ? ? ? check = False
? ? ? ? while not check:
? ? ? ? ? ? guess = [colorName[temp[0]],colorName[temp[1]],colorName[temp[2]],colorName[temp[3]]]
? ? ? ? ? ? guess = ' '.join(guess)
? ? ? ? ? ? print('猜:' + guess)
? ? ? ? ? ? green = int(str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):')))
? ? ? ? ? ? if green == 2:
? ? ? ? ? ? ? ? arr.append(temp[3])
? ? ? ? ? ? ? ? arr.append(temp[2])
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? elif green == 4:
? ? ? ? ? ? ? ? arr.append(temp[2])
? ? ? ? ? ? ? ? arr.append(temp[3])
? ? ? ? ? ? ? ? check = True
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新輸入。')
? ? ? ? guess = colorName[arr[0]] + ' ' + colorName[arr[1]] + ' ' + colorName[arr[2]] + ' ' + colorName[arr[3]]
? ? ? ? finish = True
? ? ? ? print('【答案】'+guess)
print('本程序?yàn)橘悹柼?hào)《【哀目黑子日記本】破譯密碼》小游戲的解密程序。')
print('作者:橙汁')
print('使用方法:根據(jù)程序的提示進(jìn)行選取猜測(cè),并輸入綠燈個(gè)數(shù)。')
print('\n')
while True:
? ? reLoad()
? ??check = False
? ? while not check:
? ? ? ? n = int(str2num(input('請(qǐng)輸入鎖孔角的個(gè)數(shù):')))
? ? ? ? if n > 2 and n < 6:
? ? ? ? ? ? check = True
? ? ? ? else:
? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新開始!')
? ? i = 0
? ? while?i <?5:
? ? ? ? print('猜:' + colorName[i] + ' ' + colorName[i] + ' ' + colorName[i] + ' ' + colorName[i])
? ? ? ? colorNum[i] = str2num(input('請(qǐng)輸入綠燈個(gè)數(shù):'))
? ? ? ? colorNum[i] = int(colorNum[i])
? ? ? ? sum = getListSum(colorNum)
? ? ? ? if sum > 4:
? ? ? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新開始!')
? ? ? ? ? ? i = -1
? ? ? ? elif sum == 4:
? ? ? ? ? ? break
? ? ? ? elif i == n - 2:
? ? ? ? ? ? colorNum[i + 1] = 4 - sum
? ? ? ? ? ? break
? ?? ? ?i += 1
? ? sum = getListSum(colorNum)
? ? if sum < 4:
? ? ? ? print('輸入錯(cuò)誤,請(qǐng)重新開始!')
? ? else:
? ? ? ?Do()
(作者橙汁,文章書寫不易,轉(zhuǎn)載或引用請(qǐng)注明出處,謝謝。)