【项目预览】

【创作背景】

这其实才是我真正意义上的第一个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 sedef 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_keytem_str += ('app_key=' + apk)# 4.MD5运算 + 转换大写,得到请求签名sign = curl_md5(tem_str)return signdef get_params(plus_item):# 请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效) t = time.time()time_stamp = str(int(t))# 请求随机字符串,用于保证签名不可预测  nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10))global seapp_id = '212xxxx340'        #毕竟是别人的程序,我把这个信息抹去,不过分吧app_key = '9FmxxxxxxxxxZ89' #毕竟是别人的程序,我把这个信息抹去,不过分吧params = {'app_id': app_id,'time_stamp': time_stamp,'nonce_str': nonce_str,'question': plus_item,'sign': '','session': se}params['sign'] = get_req_sign(params, app_key)return paramsdef get_content(plus_item):# 聊天的API地址    url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat"# 获取请求参数  plus_item = plus_item.encode('UTF-8')payload = get_params(plus_item)r = requests.post(url, data=payload)if r.json()["ret"] == 0:print(person+':' + r.json()["data"]["answer"])else:print('{}:听不懂~麻烦下次说人话好吗?不跟你聊了,哼~'.format(person))time.sleep(0.5)print('\n哦豁,你得罪了{},被赶出群了。下次记得礼貌一点哦!'.format(person))input()sys.exit()feature_text = ['''
{}:今天想聊点啥?你 >'''.format(person), '''
{}:还想说点什么?你 >'''.format(person),'''
{}:嗯哼,继续。你 >'''.format(person),'''
{}:还有什么想聊的吗?你 >'''.format(person),'''
{}:我有点饿了,再和你聊完最后一句,我就要去吃饭咯~你 >'''.format(person)]se = str(random.randint(1, 10000))for i in range(chatch):comment = input(feature_text[i])get_content(comment)time.sleep(0.5)print('\n我走啦,下次见!')

歌词:geci.py (这个就不贴了,太长了,就是一个简单的字典)

dic={'笑红尘':'笑红尘的歌词xxxxxxx','数鸭子':'数鸭子的歌词xxxxxxx',......'可惜我是水瓶座':'xxxxxxxx'}

主程序:yixiang.py

import chat,geci
import datetime,time,random#-------------程序开场语-----------------#class Yixiang():founddate='2016年春'founder='苏画'owner='傻龙'size=100print('\n弈厢棋苑微信群成立于{},创建者是{},群规模为{}人。\n群主题是围棋,当前群主是{}。'.format(\founddate,founder,size,owner))print('\n作者:云云\n日期:尚未完工')#-----------定义成员属性-----------------#class Member():def __init__(self,num,name,gender,loc,goch,singch,chatch,chat0,state=0):self.num=numself.name=nameself.gender=genderself.loc=locself.goch=goch      #棋力(18K-9D)self.singch=singch  #唱歌水平0-5递增self.chatch=chatch  #聊天意愿0-5递增self.chat0=chat0    #开场白self.state=state    #0=有空,1=没空#-----------------主类-------------------#        class GoYi():start=Yixiang()member=[]allplayers=[]   #参加群唱会的成员+出场概率qili={'18K':-17,'17K':-16,'16K':-15,'15K':-14,'14K':-13,'13K':-12,'12K':-11,'11K':-10,'10K':-9,'9K':-8,'8K':-7,'7K':-6,'6K':-5,'5K':-4,'4K':-3,'3K':-2,'2K':-1,'1K':1,'1D':1,'2D':2,'3D':3,'4D':4,'5D':5,'6D':6,'7D':7,'8D':8,'9D':9}geci=geci.dic#-----------添加初始成员-----------------#def __init__(self):m1=Member(1,'云云','女','成都','9K',4,5,'小哥哥你好,嘻嘻~')m2=Member(2,'傻龙','男','深圳','3D',3,3,'本人是群主。新人,来决一死战吧!')m3=Member(3,'莲子','女','北京','12K',4,5,'弈厢欢迎你,请随意哦!')m4=Member(4,'阳光','男','天津','9D',2,2,'这位女同学请问你叫什么名字?')        m5=Member(5,'菜花','男','南京','8D',3,4,'啥都别说,先来干一杯!')m6=Member(6,'胖玄','男','杭州','5D',0,3,'呃呃呃,我可以划水吗?')m7=Member(7,'小九','男','郑州','9D',3,1,'找我啥事?快点,我忙着呢!')m8=Member(8,'娜娜','男','上海','4D',2,2,'Hello, what can I do for you?') m9=Member(9,'兔子','男','温州','1D',1,4,'哇,新人耶,好棒!我们可以做朋友吗?')m10=Member(10,'月丫','女','厦门','5K',5,5,'很高兴认识你!嗯,握个手~')m11=Member(11,'安然','男','武汉','4D',2,4,'大家好我是人见人爱,花见花开的安然。')m12=Member(12,'风风','男','重庆','1K',4,3,'嗯哼,我就是风风。')m13=Member(13,'山石','男','武汉','17K',1,2,'欲速则不达,棋力每年涨1K就满足了。')m14=Member(14,'若水','女','赣州','7K',1,4,'石头最疼我了~')m15=Member(15,'猪头','男','潮州','9D',2,2,'啊~~来个大腿让我抱抱吧!')m16=Member(16,'木木','男','深圳','6D',3,3,'我可不是一般的王者!')m17=Member(17,'土豆','女','太原','15K',1,4,'我来了,有瓜吗?')m18=Member(18,'个性','男','汉中','4D',0,3,'欢迎大家来汉中找我玩。')m19=Member(19,'年华','男','西安','2K',1,3,'喵~你猜我今天看到了什么?')m20=Member(20,'锅锅','男','北京','2D',3,4,'全世界都有我的家')m21=Member(21,'苏画','男','沈阳','3D',0,2,'刚买了个耳机,又要吃一年的土了。')self.member.append(m1)self.member.append(m2)self.member.append(m3)self.member.append(m4)self.member.append(m5)self.member.append(m6)self.member.append(m7)self.member.append(m8)self.member.append(m9)self.member.append(m10)self.member.append(m11)self.member.append(m12)self.member.append(m13)self.member.append(m14)self.member.append(m15)self.member.append(m16)self.member.append(m17)self.member.append(m18)self.member.append(m19)self.member.append(m20)self.member.append(m21)for m in self.member:   #设置参加群唱会的成员+出场概率if m.singch>0:for i in range(m.singch):self.allplayers.append(m.name)#-----------------找人函数-----------------#def zhaoren(self):print('\n要选哪位朋友呢?请输入Ta的名字或编号:')while True:n=input()for mem in self.member:if str(mem.num)==n or mem.name==n:return membreakelse:print('\n群里没有这个人哦,请重新输入:')#-----------------分割符------------------#def fenge(self):print('\n'+'-'*70) #---------------主菜单函数-----------------#def menu(self):while True:time.sleep(0.4)self.fenge()a=str(datetime.datetime.now())a=a[:-7]print('\n现在是 {},欢迎来到弈厢棋苑。'.format(a))self.fenge()choice=input('\n0.查询群成员\n1.下棋\n2.做题(尚未完工)\n3.参加群唱会\n4.聊天\n5.退出系统\n6.申请入群\n\n请输入数字键选择功能:')if choice=='0':#列出初始成员-doneself.listall()elif choice=='1':#下棋-doneself.gogo()elif choice=='2':#做题self.practice()elif choice=='3':#唱歌-doneself.sing()elif choice=='4':#聊天-doneself.chat()elif choice=='5':#退出程序-doneprint('\n欢迎下次再来弈厢玩,再见。')input()breakelif choice=='6':self.addmember()#申请入群-doneelse:print('\n输入有误,请输入数字选择功能。')#----------------------------------以下是各功能----------------------------##--------------功能0:列出群成员----------------#def listall(self): time.sleep(0.3)print('\n本群的成员有:\n')count=0for mem in self.member:print(str(mem.num)+'.'+mem.name,end='   ')count+=1if count%5==0:print('\n')#--------------功能1:下棋----------------#def gogo(self):print('\n来了弈厢,当然要下棋啦!请先输入您的棋力:18K-1K,1D-9D,请注意K和D要大写:')while True:myqili=input()if myqili not in ('18K','17K','16K','15K','14K','13K','12K','11K','10K','9K','8K','7K','6K','5K',\'4K','3K','2K','1K','1D','2D','3D','4D','5D','6D','7D','8D','9D'):print('\n输入有误,请重新输入(18K-1K,1D-9D)注意K和D要大写:')else:myqili=self.qili[myqili]breakwhile True:cho=input('\n您是想指定一位朋友下棋,还是想随缘碰到一位呢?1-指定/2-随缘:')while True:if cho=='1':p=self.zhaoren()                    breakelif cho=='2':p=random.choice(self.member)time.sleep(1)print('\n*****缘分让你遇到了{}*****'.format(p.name))breakelse:print('\n输入有误,请输入数字重新选择:1-指定/2-随缘')pgoch=self.qili[p.goch]if pgoch==myqili:print('\n{}跟你棋力相当,你们分先吧!现在开始猜先——'.format(p.name))time.sleep(1)input('\n{}抓了一把棋子,你猜猜棋子的个数是单数还是双数(1-单数/2-双数):'.format(p.name))print(random.choice(['\n你猜对啦!那么{}执白,你执黑。请多指教!'.format(p.name),\'\n你猜错了。那么{}执黑,你执白。请多指教!'.format(p.name)]))elif pgoch>myqili:rangzi=round((pgoch-myqili)/3)+1if rangzi==1:print('\n{}的棋力是{},那么来一局让先局吧。你执黑,请~'.format(p.name,p.goch))else:print('\n{}的棋力是{},那么来一局让{}子局吧。你执黑,请~'.format(p.name,p.goch,rangzi))elif pgoch<myqili:rangzi=round((myqili-pgoch)/3)+1if rangzi==1:print('\n{}的棋力是{},那么来一局让先局吧。你执白,请~'.format(p.name,p.goch))else:print('\n{}的棋力是{},那么来一局让{}子局吧。你执白,请~'.format(p.name,p.goch,rangzi))input()print('\n************************************\n\n       {}和你杀的天昏地暗\n\n************************************'.format(p.name))time.sleep(1)mu=random.randint(1,20)if pgoch==myqili:mu=mu-0.5print(random.choice(['\n一局终。你赢了{}目,太厉害了!!{}很不服气,请求跟你再战一局。'.format(mu,p.name),\'\n一局终,你输了{}目,真是遗憾。下次请再接再厉!'.format(mu)]))time.sleep(1)conti=input('\n你还想再下一局吗?按1再来一局,按其他键退出:')if conti!='1':break#--------------功能2:做题----------------#def practice(self):pass#--------------功能3:群唱会----------------#def sing(self):songs=['笑红尘','数鸭子','锦鲤抄','难忘今宵','枕边童话','一颗开花的树',\'天下','长夜雨','流光飞舞','追光者','我的一个道姑朋友','凉城',\'九万字','月半小夜曲','绿色','化身孤岛的鲸','东流','牵丝戏','可惜我是水瓶座']while True:n=random.randint(2,4)players=[]self.fenge()print('\n当当当~群唱会开始啦!请大家踊跃报名参加~')time.sleep(1)print('\n这次跟你一起唱歌的小伙伴有:',end='')for i in range(n):a=random.choice(self.allplayers)if a not in players:players.append(a)print(a,end=' ')time.sleep(1)print('\n\n现在大家开始丢骰子,丢到最大点数的,就要唱歌哦!(按回车键继续)')input()print('\n1~2~3~开始——')dians={}sortdian=[]for i in range(len(players)):time.sleep(1)dians[players[i]]=random.randint(1,6)sortdian.append(dians[players[i]])print('\n{}丢出了{}点。'.format(players[i],dians[players[i]]))time.sleep(1)input('\n该你啦!请按回车键丢骰子:')dians['你']=random.randint(1,6)sortdian.append(dians['你'])print('\n你丢出了{}点。'.format(dians['你']))time.sleep(1)sortdian.sort()big=sortdian[-1]singger=[]for i in dians:if big==dians[i]:singger.append(i)print('\n那么这次,有请 ',end='')for i in singger:print(i,end=' ')print('来唱歌。请大家鼓掌欢迎!!!!(按回车键欢迎)')input()geming=random.choice(songs)print('\n就唱一首《{}》吧!'.format(geming))input('\n准备好了吗?请按回车键,开始——')time.sleep(1)self.fenge()print(self.geci[geming])self.fenge()input()print('\n唱的真好!❀ ❀ ❀ ❀ ❀ 撒花撒花 ❀ ❀ ❀ ❀ ❀')conti=input('\n你还想再玩一次吗?按1再玩一次,按其他键退出:')if conti!='1':break#--------------功能4:聊天----------------#def chat(self):print('\n您是想指定一位朋友聊天,还是想随缘碰到一位呢?1-指定/2-随缘:')while True:cho=input()if cho=='1':p=self.zhaoren()                    breakelif cho=='2':p=random.choice(self.member)time.sleep(1)print('\n*****缘分让你遇到了{}*****'.format(p.name))breakelse:print('\n输入有误,请输入数字重新选择(1-指定/2-随缘):')pname=p.nameprint('')print(p.name+":"+p.chat0)pchatch=p.chatch                    chat.chatchat(pname,pchatch)#--------------功能6:申请入群----------------#def addmember(self):while True:newname=input('\n欢迎加入弈厢。\n请输入你的昵称:')while True:newgender=input('\n请输入你的性别(男/女):')if newgender not in ('男','女'):print('\n输入有误,请重新输入性别(男/女):')else:break            newloc=input('\n请输入你的所在城市:')while True:newgoch=input('\n请输入你的围棋棋力(18K-1K,1D-9D):')if newgoch not in ('18K','17K','16K','15K','14K','13K','12K','11K','10K','9K','8K','7K','6K','5K',\'4K','3K','2K','1K','1D','2D','3D','4D','5D','6D','7D','8D','9D'):print('\n输入有误,请重新输入,注意K和D要大写:')else:break            while True:newsingch=input('\n你喜欢唱歌吗?(填数字0-5:0=从不开口,5=非常喜欢):')if newsingch not in ('0','1','2','3','4','5'):print('\n输入有误,请重新输入。只能填写数字0-5:')else:newsingch=int(newsingch)for i in range(newsingch):self.allplayers.append(newname)breakwhile True:newchatch=input('\n你喜欢水群嘛?(填数字0-5:0=从不水群,5=非常喜欢)')if newchatch not in ('0','1','2','3','4','5'):print('\n输入有误,请重新输入。只能填写数字0-5:')else:newchatch=int(newchatch)breaknewchat0=input('\n用一句简短的话跟大家打个招呼吧:')confirm=input('\n请检查你的输入,需要修改请按0,确认无误请按其他键:')if confirm=='0':continueelse:newnum=len(self.member)+1newmem=Member(newnum,newname,newgender,newloc,newgoch,newsingch,newchatch,newchat0)self.member.append(newmem)print('\n从现在开始,你就是我们的一份子了!在群里要积极学棋哦!')break#-------------可以调用啦!来愉快的玩耍吧------------#go=GoYi()
go.menu()

【云云怪】第3个项目:弈厢棋苑相关推荐

  1. C语言实战项目1——三子棋(可转变为N子棋)

    文章目录 前言 一.三子棋实现步骤 1.什么是三子棋? 2.C语言实现逻辑 3.函数实现 二.源代码 1.头文件 2.函数实现 3.主函数 总结 前言 学习就是一个总结以及融汇贯通的的过程,适当的对知 ...

  2. 团队编程项目作业2-象棋游戏设计文档

    http://www.cnblogs.com/Ggao 转载于:https://www.cnblogs.com/1501193636anqila/p/7732876.html

  3. C语言小项目——井字棋游戏(升级版)

  4. 阿里四面之后才懂得如何更好的学Java

    前言 很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来. 但是没过多久,能了解到的资料就开始超过每天学习的能力,像 ...

  5. PaddleHub实战——人脸黑板简笔画

    项目简介: 本项目通过AI Studio(基于百度深度学习平台飞桨的人工智能学习与实训社区,提供在线编程环境.免费GPU算力.海量开源算法和开放数据,帮助开发者快速创建和部署模型)运行. 感兴趣的小伙 ...

  6. 已解决java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map异常的正确解决方法,亲测有效!!

    已解决java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map异常的正确解决方法,亲测有效!! ...

  7. 助力视障人士,微软等公司捐赠首批AI有声内容

    12月2日,微软与周迅AI语音红丹丹公益项目发起人鹿音苑文化传播公司,以及来自微软及各界的150名余志愿者,将创作的首批人工智能有声内容,包括鲁迅.老舍.萧红.朱自清等作家的一系列经典作品.红丹丹文化 ...

  8. 小小突击队为什么服务器正在维护中,4399小小突击队3月20日5:30更新维护公告!...

    亲爱的各位玩家: <小小突击队>将于3月20日5:30-7:30进行维护更新,更新内容如下: 一.英雄 1.新增:海牙战士为了寻找幼年时走失妹妹,加入了小小突击队 2.调整:龙骑士去国外旅 ...

  9. 奉劝想把编程学好的学弟们 · 如何高效学习编程?

    大家好,我是安然无虞. 目录 一.毕业想成为程序员,现在该怎么学? 1.IT行业是不是值得进入? 2.想做研发工作,该学习什么? 二.怎么学,有方法吗? 1.入门攻略 怎么学好C语言 使用C语言写一些 ...

最新文章

  1. List常用方法总结 遍历集合的方法
  2. Web API应用架构设计分析(2)
  3. matlab里面连接器是什么,连接器
  4. 泪目!连拿3份 offer,AI 程序员求职经历火爆 IT圈!
  5. (kruskal)Jungle Roads
  6. 如何避免重复性地做数据维护页面?
  7. 质变的小米:从铁人三项到AIoT
  8. 无线通信基础知识10:数字通信之双工技术
  9. 同余式 和 费马小定理
  10. bzoj2109: [Noi2010]Plane 航空管制
  11. 方舟生存进化服务器存档位置,方舟生存进化怎么转移存档
  12. 跨境电商APP解决方案
  13. CIC-IDS-2018数据集分析笔记
  14. shiro漏洞原理以及检测key值原理
  15. google FireBase产品接入 —— FCM
  16. R语言之Rstudio 导入包
  17. linux bcm43142无线网卡驱动安装,Centos7.7安装bcm43142(博通)无线网卡驱动(示例代码)...
  18. Bigasoft Video Downloader Pro Mac破解教程
  19. 【css】LCD液晶字体——自定义字体@font-face
  20. 配置路由器,两个PC通过路由器通信

热门文章

  1. 在html5页面中添加canvas,HTML页面中添加Canvas标签示例
  2. 数组(Arry)几个常用方法的详解
  3. echarts地图生成
  4. 【专知荟萃18】目标跟踪Object Tracking知识资料全集(入门/进阶/论文/综述/视频/专家,附查看)
  5. SecureBoost: A Lossless Federated Learning Framework论文笔记
  6. Source Insight工程导入
  7. 螺栓与螺栓组联接实验测试分析装置,QY-JXSX26
  8. php实现增量更新,基于html5plus平台 实现app增量更新功能
  9. 水箱建模最小二乘法_大气VOCs在线监测系统评估工作指南(二)
  10. GO Strings-and-runes