【项目预览】
【创作背景】
这其实才是我真正意义上的第一个python项目,创建日期大概在3月20多号,但因为更新的拖拖拉拉,甚至到现在都还没完工,所以排在了第三个。跟图书馆项目类似,这个项目也是我在学了“类和对象”之后,用来练手的。
弈厢棋苑是我的围棋微信群,也是我的主要社交圈。群里的小伙伴们互相都认识很久了,平时群里下棋,做题,聊天,八卦,唱歌,比赛,非常热闹。学了python之后,我想把这些热闹用程序再现出来。
【功能设想】+【效果体验】
成员:正如图书馆里面的对象是一本一本的书,微信群里面的对象就是一个一个的人。因此,建立一个成员类,内置一些核心成员对象。
申请入群:这个功能最简单了,就是添加新的对象。
下棋功能:这是我第一个设想好的功能,每个人有“棋力”属性,把用K和D表示的棋力数字化之后,根据匹配到的两个人的棋力差值,计算出谁黑谁白,需要让几子,输出提示语。因为这个程序并不能真的下棋,所以意思意思,输赢结果随机输出就好。
聊天功能:这里我想引入智能聊天机器人,我自己当然不会编写,但风变体验课的第一课就给我们体验过一个聊天机器人,我只要去把代码抄过来,改一改,就行了。我给每个人设置了“聊天意愿”属性,赋值0-5,这是根据小伙伴的真实水群水平定的,这个属性就决定了你可以跟这个成员聊几句话(例如:云云的聊天意愿是4,那么当你选择云云跟你聊天的时候,她只会跟你讲4句话,就溜了)。
群唱会功能:弈厢群里真实的群唱会是这样的:大家一起丢骰子,丢到最大的,就发语音唱几句歌。在程序里,只要我们把唱歌用打印歌词来代替,其他过程跟真实群唱会可以做到一模一样。首先在核心成员里随机产生几个人来报名参加这次群唱会(列表里随机选择N个对象),然后大家逐个丢骰子(产生随机数),比较这些数的大小,输出最大的数的人名,然后随机给出一段歌词就当是唱歌了。我给每个人设置了“唱歌意愿”属性,赋值0-5,代表了他报名参加群唱会的概率(按“唱歌意愿”属性值把人名重复N次添加到群唱会参加人名单列表里,再随机抽取)。
做题功能:直到现在还没想好怎么实现,怕是要一直坑下去了。
【完工感受】——额,其实并没有完工,但短期内我也不会更新了
虽然并是一个不是很有趣的项目,但它对我的提升非常大。我不仅巩固了学过的所有知识(循环,列表和字典,类和对象,函数),还学会了抄别人的高级代码改装成自己的(聊天功能),还学会了自定义import(因为歌词这个字典实在太大,我不想放在源代码里,于是建了一个新的py文件专门存放{歌名:歌词}字典。相应的,也就学会了在打包exe的时候添加隐藏模块(hidden import)。
因为这是基于一个真实存在的群所开发的小游戏,我把这个程序打包成exe发到群里,小伙伴们纷纷刷了一波存在感。我也是很开心的,想要给大家做更多的游戏。不过很快,下一个项目就让我明白了,exe真的不能随便乱开。基于对大家负责的态度,我也决定再也不在群里发exe了。
【完整代码】
这个程序我建了3个py文件,一个用来放聊天机器人(因为这个代码不是我写的,分开放以示尊重原作者),一个用来放歌词字典,还有一个主程序。
聊天机器人:chat.py
import urllib.parse
import hashlib
import time
import random
import string
import requests
import sys
import readline
#----------------智能聊天程序-----------------#
def chatchat(person,chatch):
global se
def curl_md5(src):
m = hashlib.md5(src.encode('UTF-8'))
# 将得到的MD5值所有字符转换成大写
return m.hexdigest().upper()
"""
get_req_sign :根据 接口请求参数 和 应用密钥 计算 请求签名
参数说明
-pa:接口请求参数
-apk:应用密钥
返回数据
-签名结果
"""
def get_req_sign(pa, apk):
# 1.字典升序排序
pa_list = list(pa.items())
pa_list.sort()
# 2.拼按URL键值对
tem_str = ''
for i in range(len(pa_list)):
if pa_list[i][1]:
tem_str += (pa_list[i][0] + '=' + urllib.parse.quote(pa_list[i][1]) + '&')
# 3.拼接app_key
tem_str += ('app_key=' + apk)
# 4.MD5运算 + 转换大写,得到请求签名
sign = curl_md5(tem_str)
return sign
def get_param