本节作业:
熟练使用类和模块,写一个交互性强、有冲突的程序。
思路:
1、各个模块之间的调用关系,如何使用类,各种方法的使用上面;
2、学了类,以为能用来解决所有问题,东西都要写在类里面;
3、下面自己谢了一个简写版程序,有些地方还待完善,先梳理一下,自己在把里面所有东西完善完成;
本例写的是两个男人为了一个女人决斗,谁胜利抱得美人归,失败的人一边凉快去。
conf配置文件下面有两个文件:
setting.py:
import os,sys '''配置环境变量''' BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) Skills = ["rich","poor","handsome","ugly",'struggle',"car",'house',"height","short",'fat',"thin"] DATABASE = {'rich':66,"poor":10,"handsome":25,"ugly":6,"struggle":30,"car":35,"house":60,'height':42, 'short':18,"fat":15,"thin":25}
setting里面是存放技能属性和技能对应的得分属性,有钱人得分66,贫穷得分:10分等等;根据属性判断得分,屌丝就失败,高富帅就抱得美人归。
menu.py:
'''程序主入口显示''' main_show = ''' ------------------------------------------------------------------------------------------- 欢迎光临抢美女决战平台 日期:{0} 星期:{1} ------------------------------------------------------------------------------------------- 【1】故事介绍 【2】PK决战 【3】战绩榜 【q】退出 ------------------------------------------------------------------------------------------- ''' skill_message = ''' ---------------------------------------------------------------------------------------------- 技能展示 ---------------------------------------------------------------------------------------------- 技能编号 技能名称 技能得分 ''' battle_message = ''' -------------------------------------------------------------------------------------------------- 033[31;1m 今天:{0} 星期:{1} 姓名:{2} 和 姓名:{3} 为了 {4} 在此决斗,获胜者将抱得美人归,生死由命成败在天,谁能抱 得美人归,各凭实力 特在此签生死状,如有生死,既往不咎!!! 033[0m -------------------------------------------------------------------------------------------------- ''' battle_show = ''' -------------------------------------------------------------------------------------------------- 第{0}回合: 日期:{1} 星期:{2} 决战者1 姓名:{3} 决战者2 姓名:{6} VS 技能:{4} 得分 {5} 技能:{7} 得分:{8} -------------------------------------------------------------------------------------------------- ''' match_show = ''' -------------------------------------------------------------------------------------------------- 第{0}回合--决战者1:{1} 累计得分:{2} 决战者2:{3} 累计得分:{4} -------------------------------------------------------------------------------------------------- ''' victor_show = ''' -------------------------------------------------------------------------------------------------- 比赛结果: 日期:{0} 星期:{1} 经过{2}回合决斗,决战者--姓名:{3} 最终得分:{4} 战胜 姓名:{5} 最终得分:{6} -------------------------------------------------------------------------------------------------- '''
此模块配置各种输出框架,整理输出,以便看着舒服。
modules模块--类,函数存放
common.py:
import sys,os,datetime base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(base_dir) from conf import menu from conf import setting def introduce(mess): ''' 主页介绍,介绍系统有哪些功能,让人们尝试 :param mess: 功能展示 :return: ''' print(mess) def function_show(skills,skills_dict): ''' 功能展示模块,进行人功能的展示 :param skills: :param skills_dict: :return: ''' print(menu.skill_message) for skill_num,skill in enumerate(skills,11): print("%18s%30s%20s" %(skill_num,skill,skills_dict[skill])) print("----------------------------------------------------------------------------------------------") def trans_weekday(): ''' 星期转换模式,按照国人的习惯,把数字日期转换为中文日期 :return: 返回中文下的日期 ''' weekdays = ["一","二","三","四","五","六","日"] week_day = weekdays[datetime.date.weekday(datetime.date.today())] return week_day def show_duel_message(date,week,name1,name2,name3): '''决斗者双方信息展示,以及签订生死状''' print(menu.battle_message.format(date,week,name1,name2,name3))
common.py模块,存放公共函数,一些转换函数,方法都在里面。
role.py
'''定义角色类''' class Person(object): '''定义一个人的类''' def __init__(self,name,age,sex): ###变量初始化### self.name = name self.age = age self.sex = sex class Man(Person): def __init__(self,name,age,sex,score=0): '''继承''' super(Man,self).__init__(name,age,sex) #重写父类的方法,因为被子类覆盖了 self.score = score class Wemon(Person): '''定义一个女性的类,继承父类''' def __init__(self,name,age,sex,belong_to=""): super(Wemon,self).__init__(name,age,sex) self.belong_to = belong_to
存放类模块,用来生成实例:
game_index.py -- 程序主入口,运行调用整个模块
import sys,os,datetime,random from conf import menu from modules import common,role from conf import setting def story_introduce(): message = ''' ------------------------------------------------------------------------------------------------- 033[34;1m相传在民国时期,如果两个男的同时看上一个女的,那么他们两个就要进行决斗来获得美女的芳心。 比赛共分为三场,没人根据自己的独特性质进行得分,最后得分最高者胜利,抱得美人归。如果三场比赛 之后,两人得分相同,则进入加时赛,加时赛按每轮进行得分,直到分出胜负。033[0m ------------------------------------------------------------------------------------------------- ''' print(message) def duel(): '''决斗''' '''完善决斗者1的信息''' name1 = input("请输入决斗者1的名字:") age1 = input("请输入决斗者1的年龄:") sex1 = "男" #默认决斗者的性别都是男 '''把决斗者1封装到类中,生成一个实例''' m1 = role.Man(name1,age1,sex1) '''完善决斗者2的信息''' name2 = input("请输入决斗者2的名字:") age2 = input("请输入决斗者2的年龄:") sex2 = "男" m2 = role.Man(name2,age2,sex2) '''完善美女的信息''' name = input("请输入被决斗美女的名字:") age = input("请输入被决斗美女的年龄:") sex = "女" w1 = role.Wemon(name,age,sex) '''下面进入决斗了''' common.show_duel_message(date_today,week_day,m1.name,m2.name,w1.name) skill_num = 0 common.function_show(setting.Skills, setting.DATABASE) while skill_num < 3: '''初始化m1的属性''' m1.skill = input("决斗者1请根据实际情况输入您对应的技能编号:") if int(m1.skill) in list(range(11,22)): m1.skill = setting.Skills[int(m1.skill)-11] else: print("对不起,您输入的技能编号有误,请重新输入!") continue m1_tem_score = setting.DATABASE[m1.skill] m1.score += m1_tem_score '''初始化m2的属性''' m2.skill = input("决斗者2请根据实际情况输入您对应的技能编号:") if int(m2.skill) in list(range(11,22)): m2.skill = setting.Skills[int(m2.skill)-11] else: print("对不起,您输入的技能编号有误,请重新输入!") continue m2_tem_score = setting.DATABASE[m2.skill] m2.score += m2_tem_score print(menu.battle_show.format(skill_num+1,date_today,week_day,m1.name,m1.skill,m1.score,m2.name,m2.skill,m2.score)) print(menu.match_show.format(skill_num+1,m1.name,m1.score,m2.name,m2.score)) skill_num += 1 if m1.score > m2.score: print(menu.victor_show.format(date_today,week_day,3,m1.name,m1.score,m2.name,m2.score)) print("比赛结束,%s获胜" %m1.name) sys.exit() elif m1.score < m2.score: print(menu.victor_show.format(date_today,week_day,3,m2.name,m2.score,m1.name,m1.score)) print("比赛结束,%s获胜" %m2.name) sys.exit() elif m2.score == m1.score: print("两个人经过三轮比赛,得分一样,下面将进行加时赛,来确定输赢!!!") if __name__ == "__main__": date_today = datetime.date.today().strftime("%Y-%m-%d") week_day = common.trans_weekday() flag = True while flag: common.introduce(menu.main_show.format(date_today,week_day)) query_num = input("请输入选择功能编号:") if query_num == '1': story_introduce() common.function_show(setting.Skills, setting.DATABASE) elif query_num == '2': ###完善挑战者1的信息,并放在一个类中### duel() elif query_num == '3': pass elif query_num == 'q' or query_num == 'quit': sys.exit("您已退出游戏,欢迎下次来玩!")
game_life.py程序主入口,用来调用整个程序的模块,下面,运行这个程序,看如下:
------------------------------------------------------------------------------------------- 欢迎光临抢美女决战平台 日期:2017-08-06 星期:日 ------------------------------------------------------------------------------------------- 【1】故事介绍 【2】PK决战 【3】战绩榜 【q】退出 ------------------------------------------------------------------------------------------- 请输入选择功能编号:2 请输入决斗者1的名字:吴沛齐 请输入决斗者1的年龄:25 请输入决斗者2的名字:Alex 请输入决斗者2的年龄:36 请输入被决斗美女的名字:李志玲 请输入被决斗美女的年龄:24 -------------------------------------------------------------------------------------------------- 今天:2017-08-06 星期:日 姓名:吴沛齐 和 姓名:Alex 为了 李志玲 在此决斗,获胜者将抱得美人归,生死由命成败在天,谁能抱 得美人归,各凭实力 特在此签生死状,如有生死,既往不咎!!! -------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------- 技能展示 ---------------------------------------------------------------------------------------------- 技能编号 技能名称 技能得分 11 rich 66 12 poor 10 13 handsome 25 14 ugly 6 15 struggle 30 16 car 35 17 house 60 18 height 42 19 short 18 20 fat 15 21 thin 25 ---------------------------------------------------------------------------------------------- 决斗者1请根据实际情况输入您对应的技能编号:11 决斗者2请根据实际情况输入您对应的技能编号:12 -------------------------------------------------------------------------------------------------- 第1回合: 日期:2017-08-06 星期:日 决战者1 姓名:吴沛齐 决战者2 姓名:Alex VS 技能:rich 得分 66 技能:poor 得分:10 -------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------- 第1回合--决战者1:吴沛齐 累计得分:66 决战者2:Alex 累计得分:10 -------------------------------------------------------------------------------------------------- 决斗者1请根据实际情况输入您对应的技能编号:13 决斗者2请根据实际情况输入您对应的技能编号:14 -------------------------------------------------------------------------------------------------- 第2回合: 日期:2017-08-06 星期:日 决战者1 姓名:吴沛齐 决战者2 姓名:Alex VS 技能:handsome 得分 91 技能:ugly 得分:16 -------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------- 第2回合--决战者1:吴沛齐 累计得分:91 决战者2:Alex 累计得分:16 -------------------------------------------------------------------------------------------------- 决斗者1请根据实际情况输入您对应的技能编号:17 决斗者2请根据实际情况输入您对应的技能编号:18 -------------------------------------------------------------------------------------------------- 第3回合: 日期:2017-08-06 星期:日 决战者1 姓名:吴沛齐 决战者2 姓名:Alex VS 技能:house 得分 151 技能:height 得分:58 -------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------- 第3回合--决战者1:吴沛齐 累计得分:151 决战者2:Alex 累计得分:58 -------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------- 比赛结果: 日期:2017-08-06 星期:日 经过3回合决斗,决战者--姓名:吴沛齐 最终得分:151 战胜 姓名:Alex 最终得分:58 -------------------------------------------------------------------------------------------------- 比赛结束,吴沛齐获胜
总结:
1、通过上面的实例,大概知道了类是如何使用的,上面我就是使用类的方法进行调用的,使用类的好处是,可以把一个人所有的属性都封装到类里面,而且另一个实例也一样,调用的时候我们只需要调用类即可,很名了。
2、可以把一些方法放在类里面,其实不是说使用类,就不用其他的函数了,其他函数还是与之前一样要写的,只是类里面包含的是属于类的本身方法,就如common模块本身还有自己的方法。
3、函数的调用,我们要知道我们实现的东西是什么,不要害怕参数问题,参数后期自己可以直接传即可,只要知道需要什么参数,都是可以办的到的。
下面将对上面代码进行重写完善,并整理流程图。这也是我第一次用类写框架,所以纪念一下。