文件结构:

[root@xmdevops xmdevops_limanman]# tree |grep -v ".pyc"

|-- main.py                                                         主文件

|-- CommonPyutils.py                                        通用方法

|-- GameRoleControl.py                                    角色操作类

|-- GameSceneControl.py                                  场景控制类

|-- GameUserControl.py                                    用户注册类

|-- GameLockDatabase.pkl                                帐号锁定数据库

|-- GameUserDatabase.pkl                                账户管理数据库

原文数据:

John and Liz是高中同学时的恋人,后来Liz考上了北京城市学院,而Jhon没有,为了跟女朋友在一起

他来到了北京打工(一家网吧当网管),挣钱为Liz交学费,后来LIZ毕业后工作了,遇到了公司的高富帅

Peter,然后两人就苟且在了一起,John发现后非常伤心,发誓要把LIZ夺回来,然后他发粪学习,增加

自身能力,参加自考,学习老男孩Python,若干年后,当上了某大型互联网公司的IT总监,月薪5万,北京

买了车和房,偶然又见到了LIZ,此时她已被高富Peter甩了,LIZ提出再回到JHON身边时,JHONE说...

具体要求:

1. 用PYTHON面向对象编写模拟人生屌丝逆袭的故事~

代码流程:

代码实现:

/xm-workspace/xm-pyss/auto_python/xmdevops_limanman/main.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import os
import sys
import time
import pprint
from CommonPyutils import pkl_load_dump
from GameUserControl import (UserControl)
from GameSceneControl import (SceneControl)
from GameRoleControl import (BaseRole, RoleControl)# 引导精灵
def game_guidespeak(message, with_guid=True):"""Game guid.Args:message  : guid message.with_guid: wither with guiderReturns:None"""if with_guid:print 'manbao: %s' % messageelse:print message# 游戏背景
def game_showbanner():print u'''游戏背景:John and Liz是高中同学时的恋人,后来Liz考上了北京城市学院,而Jhon没有,为了跟女朋友在一起他来到了北京打工(一家网吧当网管),挣钱为Liz交学费,后来LIZ毕业后工作了,遇到了公司的高富帅Peter,然后两人就苟且在了一起,John发现后非常伤心,发誓要把LIZ夺回来,然后他发粪学习,增加自身能力,参加自考,学习老男孩Python,若干年后,当上了某大型互联网公司的IT总监,月薪5万,北京买了车和房,偶然又见到了LIZ,此时她已被高富Peter甩了,LIZ提出再回到JHON身边时,JHONE说...'''# 画矩形盒
def grame_drawbox(box_width, menu_list):"""Draw a game box with menu list.Args:box_width : menu box widthmenu_list : menu list with choiceReturns:None"""side_sta_width = 5side_end_width = side_sta_width + box_widthprint ''.join([' '*(side_sta_width-1), '-'*box_width])for cur_index, cur_item in enumerate(menu_list,start=0):cur_menu_item = '%s. %s' % (cur_index, cur_item)print '|'.join([' '*(side_sta_width-1),cur_menu_item.ljust(box_width-side_sta_width, ' ')]),print '|'print ''.join([' '*(side_sta_width-1), '-'*box_width])# 首页选择
def login_select(menu_list):"""Login menu select.Args:menu_list: login menu listReturns:bool"""while True:grame_drawbox(75 ,menu_list)login_choice = raw_input('please input mb choice: ')if login_choice not in map(str, range(len(menu_list))):print 'errors: valid login choice number. try again.'continueif login_choice == '0':# 用户注册uc_control.register_verification()continueelif login_choice == '1':# 登陆游戏(返回用户ID)user_hash = uc_control.login_verification()if user_hash:return user_hashcontinueelse:# 退出游戏sys.exit('notice: %s quit game at %s' % (None, None))# 登入选择
def roles_select(user_hash, menu_list):"""Roles select.Args:menu_list: rolesReturns:bool"""# 开始角色相关role_name = uc_control.user_pkl_db[user_hash]['username']role_data = uc_control.user_pkl_db[user_hash]['useroles']baserole = BaseRole(role_name)rolecontrol = RoleControl(baserole)while True:grame_drawbox(75 ,menu_list)select_choice = raw_input('please input mb choice: ')if select_choice not in map(str, range(len(menu_list))):print 'errors: valid login choice number. try again.'continueif select_choice == '0':select_id = rolecontrol.role_add(role_name, role_data)continueelif select_choice == '1':select_id = rolecontrol.role_select(role_name, role_data)if select_id:return select_idcontinueelif select_choice == '2':rolecontrol.role_delete(role_name, role_data)continueelif select_choice == '3':return False# 场景相关
def scene_select(user_hash, role_id, menu_list):"""Game scene select.Args:user_hash: user hashrole_id  : role idmenu_list: menu listReturns:bool"""scenecontrol = SceneControl(user_hash, role_id, uc_control.user_pkl_db)while True:grame_drawbox(75 ,menu_list)scene_choice = raw_input('please input mb choice: ')if scene_choice not in map(str, range(len(menu_list))):print 'errors: valid login choice number. try again.'continueif scene_choice == '0':res = scenecontrol.scene_studyskill()if not res:continueelif scene_choice == '1':scenecontrol.scene_changework()continueelif scene_choice == '2':# 简单交朋友(细节略)scenecontrol.scene_makefriend('Liz')continueelif scene_choice == '3':scenecontrol.scene_makemoney()continueelif scene_choice == '4':scenecontrol.scene_printinfo()continueelif scene_choice == '5':pkl_load_dump(pkl_user_file, 'dump', uc_control.user_pkl_db)return Truedef main():"""Main function."""game_showbanner()game_guidespeak(u'''免责声明:欢迎到ManBao模拟人生游戏平台,请遵守游戏规则,未成年人请在成年人监护下进行游戏!''', False)game_guidespeak(u'''正在载入....''', False)time.sleep(2)# 开始登陆相关user_hash = login_select(login_menu)if not user_hash:return Falseselect_id = roles_select(user_hash ,roctl_menu)if not select_id:return Falseprint "notice: welcome %s's %s role login game scene." % (user_hash,select_id)# 开始场景相关scene_select(user_hash, select_id, works_menu)if __name__ == '__main__':login_menu = [u'注册帐号', u'登陆游戏', u'退出游戏']roctl_menu = [u'创建角色', u'选择角色', u'删除角色',u'重新登陆']works_menu = [u'学习技能', u'换个工作', u'交个朋友',u'努力赚钱', u'查看信息', u'保存进度']pkl_user_file = os.path.join(os.getcwd(), 'GameUserDatabase.pkl')pkl_lock_file = os.path.join(os.getcwd(), 'GameLockDatabase.pkl')# 用户控制uc_control = UserControl(pkl_user_file, pkl_lock_file)main()

/xm-workspace/xm-pyss/auto_python/xmdevops_limanman/CommonPyutils.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import cPickledef pkl_load_dump(pkl_file, pkl_type, pkl_data=None):"""Args:pkl_file: pickle source filepkl_type: pickle typepkl_data: pickle source dataReturns:None/dict"""if pkl_type == 'load':with open(pkl_file, 'r+b') as rhandler:try:return cPickle.load(rhandler)except EOFError as eof_err:print 'errors: first load %s, content is empty.' % pkl_filereturn {}if pkl_type == 'dump':with open(pkl_file, 'w+b') as whandler:cPickle.dump(pkl_data, whandler)if __name__ == '__main__':pass

/xm-workspace/xm-pyss/auto_python/xmdevops_limanman/GameRoleControl.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import os
import pprintclass BaseRole(object):"""Attributes:role_age   : role agerole_sex   : role sexrole_name  : role namerole_salary: role salaryrole_assets: role assetsgirl_friend: role girl friendcurrent_job: role current job"""def __init__(self, role_name):self.role_num = 0self.role_age = Noneself.role_salary = 0self.role_assets = 0self.girl_friend = Noneself.current_job = Noneself.role_sex = Noneself.role_name = role_nameclass RoleControl(object):"""Attributes:baserole: base role object"""def __init__(self, baserole):self.baserole = baseroledef __is_created(self, role_num, role_datadb):"""Game role is created?Args:user_hash  : user hashrole_datadb: role datadbReturns:bool"""if role_datadb.has_key(role_num):return Truereturn False# 添加角色(每个用户最多创建3个角色)def role_add(self, role_name, role_datadb):role_num = self.baserole.role_numif len(role_datadb) > 3:print 'errors: up to three characters peer user.'return Falseif self._RoleControl__is_created(role_num, role_datadb):print 'errors: role %s has been registed.' % (role_name)return False# 免输入验证role_age = raw_input('please input your age: ').strip()role_sex = raw_input('please input your sex: ').strip()self.baserole.role_age = role_ageself.baserole.role_sex = role_sex# 更新数据库role_datadb.update({str(role_num): self.baserole})self.baserole.role_num += 1return self.baserole.role_num-1# 输出角色信息def role_print(self, role_name, role_datadb):"""Print all role info.Args:role_datadb: role databaseReturns:str"""for cur_index, cur_item in enumerate(role_datadb):print "user %s's role %s info:" % (role_name, cur_index)print u'''角色名字: %s角色性别: %s角色年龄: %s角色工资: %s角色存款: %s角色朋友: %s角色工作: %s''' % (getattr(self.baserole, 'role_name', None),getattr(self.baserole, 'role_sex', None),getattr(self.baserole, 'role_age', None),getattr(self.baserole, 'role_salary', None),getattr(self.baserole, 'role_assets', None),getattr(self.baserole, 'girl_friend', None),getattr(self.baserole, 'current_job', None))# 删除角色信息def role_delete(self, role_name, role_datadb):"""Delete role info.Args:role_name    : role namerole_database: role databaseReturns:bool"""self.role_print(role_name, role_datadb)# 下拉选择role_num = raw_input('please input role number: ')if not role_datadb.has_key(role_num):print "errors: user %s have not the role %s." % (role_name, role_num)return Falsereturn role_datadb.pop(role_num)# 选择角色def role_select(self, role_name, role_datadb):"""Select game role.Args:role_datadb: role databaseReturns:int"""if len(role_datadb) == 0:print 'errors: no roles in database to select.'return Falseself.role_print(role_name, role_datadb)select_id = raw_input('please input select id: ').strip()# 下拉框选择if not select_id in role_datadb:print 'errors: selected invalid id, select again.'return Falsereturn select_idif __name__ == '__main__':pass

/xm-workspace/xm-pyss/auto_python/xmdevops_limanman/GameSceneControl.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import pprint
from CommonPyutils import pkl_load_dumpclass SceneControl(object):"""Attributes:user_hash  : user hashrole_id    :role_datadb: role database"""work_menu = [u'LINUX 运维 - 5000', u'PYTHON开发 - 6000',u'JAVA  开发 - 10000', u'基础   网管 - 3500']def __init__(self, user_hash, role_id, role_datadb):self.role_id = role_idself.user_hash = user_hashself.role_datadb = role_datadb@staticmethoddef scene_showmenu(menu_list):"""Show scene menu.Args:menu_list: menu listReturns:None"""for cur_index, cur_item in enumerate(menu_list):print '''\%s. %s''' % (cur_index, cur_item)@staticmethoddef split_money(work_choice, work_menu):"""Split cursors and money.Args:work_item: work item.Returns:tuple"""work_tuples = work_menu[work_choice].split('-')current_job = work_tuples[0].strip()role_salary = int(work_tuples[-1].strip())return work_choice, current_job, role_salary# 学习技能def scene_studyskill(self):assets = self.role_datadb[self.user_hash]['useroles'][self.role_id].role_assetsif assets < 6000:print 'errors: you have no enouth money to study, work first.'return Falsewhile True:self.scene_showmenu(self.work_menu)study_choice = raw_input('please input work choice: ')if study_choice not in map(str, range(len(self.work_menu))):print 'errors: invalid work select id, try again.'continuestudy_choice = int(study_choice)wid, stu, mny = self.split_money(study_choice, self.work_menu)breakself.role_datadb[self.user_hash]['useroles'][self.role_id].role_assets -= mnyassets = self.role_datadb[self.user_hash]['useroles'][self.role_id].role_assetsprint 'notice: you success learnd %s cursor, cost %s money, superplus %s money.' % (stu, mny, assets)return wid, stu, mny# 换个工作def scene_changework(self):# 零时选择while True:self.scene_showmenu(self.work_menu)work_choice = raw_input('please input work choice: ')if work_choice not in map(str, range(len(self.work_menu))):print 'errors: invalid work select id, try again.'continuework_choice = int(work_choice)wid, job, mny = self.split_money(work_choice, self.work_menu)self.role_datadb[self.user_hash]['useroles'][self.role_id].current_job = jobself.role_datadb[self.user_hash]['useroles'][self.role_id].role_salary = mnyprint 'notice: you success change your work %s and %s money every month'  % (job, mny)return wid, job, mny# 交个朋友def scene_makefriend(self, firend):# 交朋友化钱略self.role_datadb[self.user_hash]['useroles'][self.role_id].girl_friend = firendprint 'notice: you success make firend with %s.' % (firend)# 努力赚钱def scene_makemoney(self, ):job = self.role_datadb[self.user_hash]['useroles'][self.role_id].current_jobif not job:print 'errors: you have not job for make money, get a job first.'return False# 已经有工作了salary = self.role_datadb[self.user_hash]['useroles'][self.role_id].role_salaryself.role_datadb[self.user_hash]['useroles'][self.role_id].role_assets += salaryassets = self.role_datadb[self.user_hash]['useroles'][self.role_id].role_assetsprint 'notice: you make %d money, your total money is %s.' % (salary, assets)# 查看信息def scene_printinfo(self):game_role = self.role_datadb[self.user_hash]['useroles'][self.role_id]print u'''角色名字: %s角色性别: %s角色年龄: %s角色工资: %s角色存款: %s角色朋友: %s角色工作: %s''' % (getattr(game_role, 'role_name', None),getattr(game_role, 'role_sex', None),getattr(game_role, 'role_age', None),getattr(game_role, 'role_salary', None),getattr(game_role, 'role_assets', None),getattr(game_role, 'girl_friend', None),getattr(game_role, 'current_job', None))if __name__ == '__main__':pass

/xm-workspace/xm-pyss/auto_python/xmdevops_limanman/GameUserControl.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
#
# Authors: limanman
# OsChina: http://my.oschina.net/pydevops/
# Purpose:
#
"""
import os
import random
import pprint
import string
import hashlib
import traceback
from CommonPyutils import pkl_load_dump# 回调写入用户文件
def called_userdb_back(func):"""Write user pickle data back to file."""def wrapper(self, *args):user_hash = func(self, *args)if user_hash:pkl_load_dump(self.user_pkfile, 'dump', self.user_pkl_db)return user_hashelse:return Falsereturn wrapper# 回调写入锁定文件
def called_lockdb_back(func):"""Write user pickle data back to file."""def wrapper(self, *args):user_hash = func(self, *args)if not user_hash:pkl_load_dump(self.user_lkfile, 'dump', self.user_lck_db)return Falseelse:return user_hashreturn wrapperclass UserControl(object):"""Attributes:user_pkfile: user login database fileuser_lkfile: user lock  database file"""# 加载用户数据def __init__(self, user_pkfile, user_lkfile):self.user_pkfile = user_pkfileself.user_lkfile = user_lkfileself.user_pkl_db = pkl_load_dump(self.user_pkfile, 'load')self.user_lck_db = pkl_load_dump(self.user_pkfile, 'load')# 生成加密key@staticmethoddef generate_keys(user_name):"""Generate user_name of md5.Args:user_name: user name that registedReturns:str"""md5 = hashlib.md5()md5.update(user_name)try:hash(user_name)except TypeError:return Falsereturn  md5.hexdigest()# 用户是否注册def __is_registed(self, user_name):"""Args:user_name: registed user nameReturns:bool"""user_hash = self.generate_keys(user_name)if not user_hash:print 'errors: user name %s is not valid.' % (user_name)return Falseif self.user_pkl_db.has_key(user_hash):return Trueelse:return False# 注册新的用户def user_register(self, user_name, user_pass):"""User register.Args:user_name: user name for registeruser_pass: user name for registerReturns:bool"""if self._UserControl__is_registed(user_name):print 'errors: user name %s has been registed.' % (user_name)return Falseuser_hash = self.generate_keys(user_name)self.user_pkl_db.update({user_hash: {'username': user_name,'userpass': user_pass,'useroles': {}}})print ('notice: registed success,''keep in mind account and pass (%s, %s).') % (user_name,user_pass)return user_hash# 模拟数据来源@called_userdb_backdef register_verification(self):while True:user_name = raw_input('please input user name: ')user_pass = raw_input('please input user pass: ')user_hash = self.user_register(user_name, user_pass)if not user_hash:return Falseelse:return user_hash# 用户登陆验证def user_login(self, user_name, user_pass):"""User login verification.Args:user_name: user name for verificationuser_pass: user pass for verificationReturns:bool"""if not self._UserControl__is_registed(user_name):print 'errors: user %s has not been registed.' % (user_name)return Falseuser_hash = self.generate_keys(user_name)if not user_pass == self.user_pkl_db[user_hash]['userpass']:print 'errors: user %s with wrong password.' % (user_name)return Falseelse:return user_hash# 模拟数据来源@called_lockdb_backdef login_verification(self):retry_count = 3retry_set = set()while retry_count > 0:user_name = raw_input('please input user name: ')user_pass = raw_input('please input user pass: ')user_hash = self.generate_keys(user_name)# 用户不存在直接返回if not self._UserControl__is_registed(user_name):print 'errors: user %s have not been registed.' % (user_name)return False# 登陆成功返回用户IDif self.user_login(user_name, user_pass):print 'notice: welcome user %s to login.' % (user_name)return user_hashretry_set.add(user_hash)retry_count -= 1else:if len(retry_set) == 1:self.user_lck_db.update({user_hash: {'username': user_name,'userpass': user_pass,'useroles': {}}})print 'notice: user %s wrong pass 3 times, locked.' % (user_name)return Falseif __name__ == '__main__':pass

有图有像:

转载于:https://my.oschina.net/pydevops/blog/651475

每日一题.PYTHON面向对象编写模拟人生屌丝逆袭游戏(登录类/角色类/场景类)?相关推荐

  1. 每日一题:现在你在玩一款游戏,叫做节奏大师。它有三种判定

    每日一题:现在你在玩一款游戏,叫做节奏大师.它有三种判定 2020年11月10日,微众银行校招笔试,算法第二题 一.题目描述 题目: 现在你在玩一款游戏,叫做节奏大师.它有三种判定: P : Perf ...

  2. python面向对象3-多层继承、super()、私有权限、多态、类属性实例属性、类方法和静态方法

    python面向对象1–类.对象.属性.魔法方法 python面向对象2–综合案例:烤地瓜.搬家具.单继承.多继承 python面向对象3-多层继承.super().私有权限.多态.类属性实例属性.类 ...

  3. 如何从一个普通的屌丝逆袭为一个程序员屌丝?(连载)

    零.题记 屌丝逆袭亘古不变的话题,芸芸众生津津乐道的话题,如何从一个普通的屌丝逆袭呢?如果你早个20年问这个问题,可能是去学土木工程,就好像现在众屌丝纷纷涌向了计算机的相关行业.无疑,高新技术是最能刺 ...

  4. java学习之屌丝逆袭

    Java学习攻略之视频学习篇 --屌丝逆袭之7K轻松拿 屌丝靓妹,你现在学习java还在抱着一本本学习资料学吗?见过<java编程思想>这本书吧,这本书确实很好,那么厚一本,你真有勇气看下 ...

  5. 区块链,屌丝逆袭的最后机会

    区块链,屌丝逆袭的最后机会 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: 区块链,屌丝逆袭的最后机会 作者:小管 转载仅为方便学习查看,一切权利属于原作者,本人只 ...

  6. 【文学文娱】《屌丝逆袭》-出任CEO、迎娶白富美、走上人生巅峰

    本文地址:http://www.cnblogs.com/aiweixiao/p/7759790.html 原文地址:(微信公众号) 原创 2017-10-30 微信号wozhuzaisi 程序员的文娱 ...

  7. 短视频是屌丝逆袭的一个绝好的机会

    短视频是屌丝逆袭的一个机会. 把握好这个机会可以实现财富自由. 之前我是觉得它是一个好的机会和发展趋势,但是我不懂,所以我觉得它跟我没有关系. 以前我很害怕自己看不懂,也不会做一些新的领域和项目. 现 ...

  8. 别说什么“寒门再难出贵子”,屌丝逆袭从来都是极少数

    别说什么"寒门再难出贵子",屌丝逆袭从来都是极少数 2013年08月31日 00:00 来源: 南方都市报 文/咪蒙 新浪微博:@咪蒙 朋友当了十多年教师,最近跟我感叹," ...

  9. GISer还有机会屌丝逆袭吗?

    在上世纪90年代末,GIS行业顶着"边缘交叉性学科"的光鲜名头逐渐在国内兴起.各个高校纷纷开设GIS课程,许多先行者也投身GIS浪潮寻找机会.1997年北京超图成立.1998年中地 ...

最新文章

  1. 引入幂等性后对系统有什么影响?
  2. android下关闭软键盘
  3. python网络编程要学吗_总算发现如何学习python网络编程
  4. matlab save将变量值保存为mat
  5. hashtable,dictionary 从原理上说说有什么异同,哪个性能高一些
  6. error: ora-01034:oracle not available ora-27101:shared memory realm does not exist
  7. rabbitmq docker
  8. python行业数据分析_python在数据分析
  9. 电子病历实体识别数据处理、多个文件读取
  10. 配置vmcore通过ssh转储到其他主机的方法
  11. 还在愁csdn进不去吗,看这里
  12. AhMyth远程控制手机实践
  13. phpstorm设置鼠标滚动缩放代码字体大小
  14. 防163网易邮箱登录界面html,网易邮箱163,网易邮箱163登录界面
  15. 使用PS蒙版功能去水印以及Word中的图片合并功能合并公司Logo图片
  16. Android蓝牙4.0单车锁应用实例开发
  17. Jenkins项目配置-maven项目-全面
  18. Oracle简介与安装
  19. mybatis根据时间查询最新一条数据
  20. linux的led驱动的实验总结,linux设备驱动归纳总结(五):4.写个简单的LED驱动

热门文章

  1. [转]软件开发项目计划编制过程
  2. 远程访问及控制SSH
  3. Self-attention中为什么softmax要除d_k
  4. special effects - 星空宇宙背景特效
  5. 孤岛双馈风电机组数学模型matlab,大型变速双馈风电机组动态稳定性仿真分析
  6. 美国的非农数据一般会在几点发布
  7. 复盘:智能座舱系列文五- 它的3种交互方式之隐式交互
  8. JavaScript/Js 大全
  9. [注]微信公众号的运营推广总结方案(持续更新)
  10. 累死你的不是工作是工作方式 好的团队会教你如何工作