歷史文章
這一部分我們講一些可以在之前程序附加的部分。
目錄
顏色地圖的發送(利用Python發送圖片正文的郵件)
在之前的代碼中,我們通過直接將 generate_map_image() 生成了顏色地圖的圖片並將其保存在了 image_file_path 目錄下。
def generate_map_image(maps):
global ID_COLOR
image_file_path = 'img/text.png'
size_img = 600, 600
img = py.Surface(size_img)
img.fill((255, 255, 255))
padx, pady = 30, 30
int_x, int_y = 10, 10
w, h = 100, 100
i = 0
py.draw.rect(img, (0, 0, 0), (padx // 2, pady // 2, size_img[0] - padx, size_img[1] - pady), 1)
while i < 25:
x, y = i % 5, i // 5
temp_surf = py.Surface((w, h))
temp_surf.fill(ID_COLOR[maps[i]])
img.blit(temp_surf, (padx + x * w + x * int_x, pady + y * h + y * int_y, w, h))
i += 1
py.image.save(img, image_file_path)
在實際遊戲中,因爲這個顏色只有隊長才能看,但是我們又只有一個電腦屏幕。那麼爲了遊戲的流暢進行,我們應該想辦法將這個地圖放在電腦之外的地方,比如!我們可以將圖片發送到某個指定的郵箱中去,這樣隊長就可以自己拿着手機看郵箱中的圖啦!
利用Python發送帶圖片的郵件是很容易的,大家百度一下就能找到很多,
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
def send_card_map(receivers = [[email protected],[email protected]],image_file_path='img/text.png'):
'''
發送顏色圖片至指定郵箱
:param receivers: 接受郵箱地址 例如
:param image_file_path: 發送圖片的路徑
'''
## 第三方 SMTP 服務
## 注意這裏改成一個可用的發件郵箱
mail_host="smtp.163.com" #設置服務器
mail_user="[email protected]" #用戶名
mail_pass="abc" #口令
sender = mail_user
msgRoot = MIMEMultipart('related')
msgRoot['From'] = sender
msgRoot['To'] = ','.join(receivers)
subject = 'Codenames_round_data'
msgRoot['Subject'] = Header(subject, 'utf-8')
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
mail_msg = """
<p>行動代號(Codenames)</p>
<p>本局詞語地圖:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
# 指定圖片爲當前目錄
fp = open(image_file_path, 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定義圖片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
try :
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 爲 SMTP 端口號
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(sender, receivers, msgRoot.as_string())
print("郵件發送成功")
except smtplib.SMTPException:
print("Error: 無法發送郵件")
最後我們將 send_card_map() 加在 generate_map_image() 的最後即可
詞語的獲取
遊戲的另一個問題就是我們詞語數據的獲取,of course用爬蟲就好了,然後找一些4字以下的詞語放在 ./dat 文件夾下就行
例如,911查詢網詞典
打開網址後一共發現有20頁詞語,我們定位到顯示詞語的元素標籤,發現是一個 class = ‘l3’ 的列表,於是通過直接用BeautifulSoup 獲取就好
import json
import requests
from bs4 import BeautifulSoup
def is_Chinese(word):
# 判斷word是否是中文單詞
for ch in word:
if '\u4e00' <= ch <= '\u9fff':
return True
return False
def get_raw_data():
global raw_data
raw_data = dict()
for i in range(1,21):
if i == 1:
url ='https://cidian.911cha.com/cixing_mingci.html'
else :
url = 'https://cidian.911cha.com/cixing_mingci_p{}.html'.format(i)
response = requests.get(url,headers={'User-Agent': 'Custom'}) # 簡單的防止反爬
if response.status_code != 200:
print('Error page{}'.format(i))
continue
content = BeautifulSoup(response.text)
raw_data[i] = content.find('ul',class_= 'l3').get_text()[:]
print('page {}, done!'.format(i))
print('Finish !')
get_raw_data()
得到 raw_data 後,我們簡單的處理一下數據將其轉化爲一個單詞列表
filter_data = dict()
for i in raw_data:
temp_s = ''
s = raw_data[i]
for ch in s:
if is_Chinese(ch):
temp_s+=ch
else :
temp_s+=' '
filter_data[i] = temp_s[:].split()
words_list = []
for i in filter_data:
words_list.extend(filter_data[i])
過濾掉太長的單詞
words_list = filter(lambda x: len(x) < 5, words_list)
保存單詞
with open('words.dat', 'w', encoding='utf-8') as f:
f.write(','.join(words_list))
當然大家也可以自己想一些有趣的詞和爬取一些有趣的網站將詞語放在 dat/ 文件夾下
祝大家玩的開心!
(P.S. 如果大家看到這了,說明對遊戲還是有一些興趣的,可能大家注意到呢我們的標題一直表明是“單機版”……其實,我最近也寫了一個聯機版的,不過需要自己有服務器才能玩,如果大家真的有興趣的話,我可以過段時間把這個遊戲如何多人遊戲的代碼教程寫一寫嘿嘿)