用 Python 給女友做了個可能會被打死的七夕禮物

第2大腦發表於2022-12-07

馬上就是七夕了,曉得你們有女票的或者正在追妹子的,肯定又在絞盡腦汁想買什麼別出新裁的禮物,如果女生感覺你的禮物花心思了,那肯定是好感度倍增啊。

今天給各位分享一個用 Python 製作的成本一毛錢卻誠意滿滿的小禮物。不過需要提醒的是:這個禮物需要妹子花點心思才能領會,沒有耐心的那種的妹子,千萬不要給她,因為這可能會是分手神器

下面就來說說,怎麼製作這個禮物。

簡單來說就用一張A4紙,列印個表格,嗯,表格是幹啥用?其實就是手繪二維碼,當然二維碼內容你懂得,利用的下面這個手繪二維碼app,會分成格子,提示你哪個塗黑。

用 Python 給女友做了個可能會被打死的七夕禮物

不過,這種套路貌似被用濫了。

所以今天說的這個明顯是手繪二維碼的升級版,成本依然是一毛錢,不僅你要費心思,女孩也要去費心思,這樣才好玩嘛。

「數織遊戲」

來,我們一步一步來,我們先說說數織這個遊戲,然後你就知道大概用意了。數織(nonogram)是日本人的數獨遊戲。

如下是數織的規則,簡單易懂。分行和列,行和列都標記了一些數字,比如下圖的第一行7 1 2 7,代表第一行有四條獨立的線,分別佔了7、1、2和7格,而每條線最少要由一個空格分開。

傳統上,玩家是以黑色填滿格子,以“×”號標記一定不需要填充的格子。所以聰明的你肯定就會知道第一列7 1 1 1 7代表什麼意思。

用 Python 給女友做了個可能會被打死的七夕禮物

所以數織就是如下這樣玩,給你的圖片只有行列數字,格子需要自己根據規則塗黑,所以你也知道了,我們做的就是下面的圖,將二維碼隱藏其中。讓女孩塗黑,掃碼即可。

用 Python 給女友做了個可能會被打死的七夕禮物

「製作隱藏二維碼的數織圖」

你說怎麼做出上圖呢?

對於笨辦法,就是開頭說的手繪二維碼app,如下它會分21*21或者更多的格子,告訴你哪個該塗黑,相應的你就知道該填寫哪些數織數字。

用 Python 給女友做了個可能會被打死的七夕禮物

可上面做法確實繁瑣了,數字自己寫,還得整理列印。

咋辦呢?

下面就是 Python 出場的時候了,用 Python 編寫一個輸入二維碼文字,一鍵生成數織圖片的程式然後直接列印即可。

完整程式碼如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pyplot import savefig
import qrcode

def qr_matrix(data):
    qr = qrcode.QRCode(version=1, box_size=1, border=1)
    qr.add_data(data)
    return np.asarray(qr.get_matrix(), dtype = int)

def _rle(matrix):
    # find run start and ends
    d = np.diff(matrix)
    row, start_pos = np.where(d > 0)
    _, end_pos = np.where(d < 0)
    # find run lengths
    run_lengths = end_pos - start_pos
    # split runs from different rows into separate arrays
    split_on = np.cumsum(np.bincount(row - 1))[:-1]
    return np.split(run_lengths, split_on)

def run_length_encode(matrix):
    rle_row = _rle(matrix)
    rle_col = _rle(matrix.T)
    return rle_row, rle_col

def nonogram_qr(data):
    qr = qr_matrix(data)
    row_rle, col_rle = run_length_encode(qr)
    shape = np.array(qr.shape) - 2
    return shape, row_rle, col_rle

def draw_nonogram(shape, row_rle, col_rle):
    r, c = shape
    f = open('qr.griddler'"w")

    f.write('MK Version 3.0')
    f.write('\n')
    f.write('\n')

    f.write(str(r)+' '+str(c))
    f.write('\n')
    f.write('\n')

    q=np.zeros((r,c),dtype=int)
    for qq in q:
        f.write(str(qq)[1:-1].replace("0""?"))
        f.write('\n')
    f.write('\n')

    for col in col_rle:
        f.writelines(str(col[::-1])[1:-1])
        f.write('\n')

    f.write('\n')
    for row in row_rle:
        f.writelines(str(row[::-1])[1:-1])
        f.write('\n')

    fig, ax = plt.subplots(figsize=(1010))
    plt.axis('off')
    plt.axis('equal')
    # draw the grid for the nonogram:
    for i in range(r + 1):
        ax.plot([0, c], [-i, -i], 'k-')
    for j in range(c + 1):
        ax.plot([j, j], [0, -r], 'k-')

    # draw the numbers onto the grid
    for i, row in enumerate(row_rle):
        for idx, val in enumerate(row[::-1]):

            ax.annotate(xy=(-idx - 0.5, -i - 0.5), s=val, ha='center', va='center')
    for j, col in enumerate(col_rle):
        for idx, val in enumerate(col[::-1]):
            ax.annotate(xy=(j + 0.5, idx + 0.5), s=val, ha='center', va='center')

    # adjust x and y limits
    lim_left = max([len(x) for x in row_rle + col_rle]) + 1
    lim_right = max(r, c) + 1
    ax.set_xlim(-lim_left, lim_right)
    ax.set_ylim(-lim_right, lim_left)
    return ax

name=input('請輸入二維碼內容(比如我愛你?):')
ax = draw_nonogram(*nonogram_qr(name))
print('製作完成,圖片名字叫做:列印吧.jpg')

savefig("列印吧.jpg")
# plt.show()

當然不想這麼麻煩的話,我這裡把程式也打包好了,各位直接執行exe 程式即可。

下面說說這個打包程式。

如下,下載解壓,執行(注意可能開啟速度挺慢,耐心等待黑框出現),輸入二維碼文字。

用 Python 給女友做了個可能會被打死的七夕禮物

然後回車,等待,就能在軟體目錄看到列印吧.jpg

這個圖片你要準備的一毛錢禮物,如下所示:

用 Python 給女友做了個可能會被打死的七夕禮物

而細心的你肯定還看到另一個箭頭的檔案:qr.griddler,嗯,這個也很有意思,我們接著說。

「數織解密軟體」

其實吧,這個生成的21*21或者以上大小的數織難度還是挺高的,不能讓女友做不出來啊,你得在身邊提示一下啊,那麼這款解密軟體派上用場。

我們下載解壓開啟,如下開啟我們前文生成的qr.griddler。

然後點選如下箭頭指示按鈕即可解密,如下動圖(小機率會發生多個解的現象,不過二維碼有容錯率,所以掃到的文字是一樣的):

用 Python 給女友做了個可能會被打死的七夕禮物

用 Python 給女友做了個可能會被打死的七夕禮物

這同時也是驗證的過程,萬一出的題無解,不過這個的程式應該沒啥問題,應該不會出現這種現象

「小結」

這個禮物認認真真整出來,估計得花個個把小時,七夕好時光,好好利用哈。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900353/viewspace-2652751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章