《笨办法学Python》笔记31-----你来做一个游戏

你来做一个游戏

到处都是class!!!

class意如其名,类。

类是对现实世界物体的抽象。

如,张三是一个人,李四也是一个人,小黄是一条狗。

这里的张三和李四有什么共同点呢?他们都是人,他们都是高级动物,他们都有思想,所以他们可以抽象成一个或多个类,名字叫人类,你也可以叫高级动物、有思想的动物等等,看你怎么去抽象它,即要如何对他们进行分类,小黄是条狗,狗是一类动物,狗也可以抽象成一个类,还可以更高的抽象成动物、四条腿的动物,吃屎的动物。。。所以类就是对个体的共同特征进行抽象,他们有什么共同的特征,有什么共同的动作。

python中如何定义、使用类

直接看例子,依然为每句代码添加注释

#定义一个名叫TheThing的类
class TheThing(object):

  #在TheThing类中定义一个叫__init__的方法,有一个叫self的参数
  def __init__(self):
    #为self的成员变量赋值为0
    self.number = 0

  #定义TheThing类的第二个方法,也有一个self参数  
  def some_function(self):
    #打印一句话
    print "I got called."

  #定义TheThing类的第三个方法,除self参数外,还有一个额外的more参数
  def add_me_up(self, more):
    #self成员变量number做加法
    self.number += more
    #此方法返回self的成员变量number
    return self.number

#类的实例化,如TheThing是一条狗类,则生成狗a和狗b
a = TheThing()
b = TheThing()

#对象调用类中的函数
a.some_function()
b.some_function()

#对象调用类中的函数后输出到屏幕
print a.add_me_up(20)
print a.add_me_up(20)
print b.add_me_up(30)
print b.add_me_up(30)

#输出两条狗的number
print a.number
print b.number

先根据代码分析一下屏幕上会输出啥,然后再运行代码看实际输出是否与预估一致。

以上例子中有三个梗要注意

1.python中类的定义

class是python中的关键字,类使用class开头来进行定义,class后跟着类名,注意类名的命名方式,变量的命名方式有各种不同的风格,但建议至始至终使用一种统一的命名方式,如驼峰式命名规则,类名要有意义,单词首字母大写,类名后面紧跟括号,括号里面是object,官方文档这样说object是所有类的基类。

object is a base for all new style classes. It has the methods that are common to all instances of new style classes.

实际上TheThing类的写法是类的继承,TheThing是子类,object是父类。可以通过以下语句查看TheThing的父类

print TheThing.class.base

类是面向对象编程中引入的概念,类之间也可以存在关系,父类、子类,他们通过继承实现。

子类继承了父类,即子类拥有了父类的成员变量,包括属性和方法。

类体与方法定义类似,需要整体缩进一边python确定类的边界。

python中有许多内置的类,可以直接使用,如str,list,dict都是类。

面向对象编程也是可以继续深挖的梗。

对象的生命周期也是可以深挖的梗。

挖、挖、挖,好的程序员是一个挖矿工。

参考菜鸟教程

2.init方法

上面提到的对象的生命周期就与init有关,这个函数是对象的构造器,在它里面实现对象成员的初始化,生成对象时的任何参数都会被init接收,比如如果我们调用 x = SomeClass(10, 'foo')),那么 init 将会得到两个参数10和foo。

实际上init并不是对象生成时被调用的第一个函数,而是new方法,python根据new的返回值决定是否调用init方法

如果说newinit是对象的构造器的话,那么del就是对象的析构器,它定义的是当一个对象进行垃圾回收时候的行为。当一个对象在删除的时需要更多的清洁工作的时候此方法会很有用,比如套接字对象或者是文件对象。注意,如果解释器退出的时候对象还存存在,就不能保证 del 能够被执行.

from os.path import join

class FileObject:
    '''给文件对象进行包装从而确认在删除时文件流关闭'''

    def __init__(self, filepath='~', filename='sample.txt'):
        #读写模式打开一个文件
        self.file = open(join(filepath, filename), 'r+')

    def __del__(self):
        self.file.close()
        del self.file

参考

3.self参数

python的self参数相当于C++的this指针,但C++中由编译器隐式指定,用户不用关心,python的设计理念是:显式好于隐式。

class X:
def func(self,a,b):
pass

obj = X('a','b')

调用X类中的方法

obj.func('a','b')
相当于
X.func(obj,'a','b')

试着将上节中的游戏封装到一个类中

游戏中包含6个函数

death

escape_pod

the_bridge

laser_weapon_armory

central_corridor

runner

一个字典数据

ROOMS

将以上属性抽象成一个Game类

#coding:utf-8

from sys import exit
from random import randint



class Game(object):

  def __init__(self, place):
    self.start = place
    self.ROOMS = {
      'death':self.death,
      'central_corridor':self.central_corridor,
      'laser_weapon_armory':self.laser_weapon_armory,
      'the_bridge':self.the_bridge,
      'escape_pod':self.escape_pod
  }

  def death(self):
      quips = ["你死了。你在这有点糟糕","干得漂亮,你死了,愚蠢的人类","失败者","我有只小狗很擅长这个"]
      print quips[randint(0,len(quips)-1)]
      exit(1)


  def central_corridor(self):
      print "来自Percal25号行星的哥顿人入侵并破坏了你的飞船"
      print "你的全体船员已经阵亡,你是最后的幸存者"
      print "任务是从武器库中拿到中子自毁炸弹"
      print "把它放在舰桥上,在你进入一个。。后炸毁飞船"
      print "逃生仓"
      print "\n"
      print "你正奔跑在中央走廊到武器库的路上"
      print "这时一个哥顿人跳出来,红皮肤,黑牙齿,邪恶的服装"
      print "怨恨充斥着他的身体,他正在挡在武器库的门外,好像正准备扔出炸弹炸死你"

      action = raw_input("> ")

      if action == "shoot!":

          print "快速拔出你的枪并朝哥顿人开火"
          print "他灵活的移动让你失去了目标,你的激光枪击中了他的服装,这"
          print "让他整个燃烧起来"    
          print "这让他非常愤怒,不停的揍你的脸,直到"
          print "你死了,然后他吃了你"
          return "death"
      elif action == "dodge!":
          print "像一个世界级拳击手,你躲闪"
          print "哥顿人的枪射穿了你的头,然后把你吃了"
          return "death"
      elif action == "tell a joke":
          print "哥顿人喜欢听笑话"
          print "你给他讲了个非常搞笑的笑话,趁他不注意,你爆了他的头"
          print "穿过了武器库的门"    
          return "laser_weapon_armory"
      else:
          print "别想了"
          return 'central_corridor'

  def laser_weapon_armory(self):
      print "你打了个洞进入武器库"
      print "这里死静死静的,好像埋伏着好多哥顿人"
      print "你发现了中子炸弹,但是它被密码锁锁着"
      print "你需要代码才能打开"
      print "如果输错10次,密码锁将永远锁着"
      print "提示:代码是3个数字"
      code = "%d%d%d" % (randint(1,9),randint(1,9),randint(1,9))
      print code
      guess = raw_input("[keypad]> ")

      guesses = 0

      while guess != code and guesses < 10:
          print "BZZZZEDDD!"
          guesses += 1
          guess = raw_input("[keypad]> ")

      if guess == code:
          print "锁打开了,飘荡出白色的气体"
          print "你带着中子弹跑得越来越快"
          print "你必须把中子弹放在舰桥正确的位置"
          return "the_bridge"
      else:
          print "你最后一次听到了滴滴声"
          print "锁永久锁定了"
          print "你决定静静的坐着,最终哥顿人炸掉了飞船,你挂了"
          return "death"

  def the_bridge(self):
      print "你带着中子弹突然出现在舰桥"
      print "惊动了5个哥顿人"
      print "他们正试图控制飞船,他们每个人都穿着一套丑陋的服装"
      print "他们还没有拿出武器,因为他们看到你手上正拿着一个已经启动的炸弹,他们不想看着它爆炸"

      action = raw_input("> ")
      if action == "throw the bomb":
          print "恐慌中,你把炸弹扔向了哥顿人"
          print "这时一个哥顿人从背后把你射杀,你倒地的时候看见一个哥顿人正在解除炸弹"


          return "death"

      elif action == "slowly place the bomb":
          print "你指着手中的炸弹,哥顿人被吓到了,他们举起手开始惊慌,"
          print "你慢慢地移动到门口,小心的把炸弹放到地上"
          print "你把门锁住,哥顿人出不来。炸弹放置好了,你跑向逃生仓"
          return "escape_pod"

      else:
          print "DOES NOT COMPUTE"
          return "the_bridge"


  def escape_pod(self):
      print "你冲向逃生仓,争取整个船爆炸前,"
      print "似乎船上没有其他哥顿人,你一路很顺利"
      print "你来到逃生仓,这里有5个仓位,你要选择一个"
      print "你选择哪一个?"

      good_pod = randint(1, 5)
      print good_pod
      guess = raw_input("[pod #]> ")

      if not guess.isdigit():
        print "please input a number"
        self.escape_pod()


      if int(guess) != good_pod:
          print "你跳进 %s 号逃生仓,按下了弹出按钮" % guess
          print "逃生仓发生了爆炸"
          print "你挂了"

          return "death"

      else:

          print "你跳进 %s 号逃生仓,按下了弹出按钮" % guess
          print "你赢了"

          exit(0)





  def runner(self):
      next = self.start
      while True:
          room = self.ROOMS[next]
          print "\n-----------"
          next = room()



g = Game('central_corridor')

g.runner()




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,041评论 0 4
  • 如果要晨跑,就坐26层不锈钢电梯下到花园,跑鞋不断与水泥地面摩擦,呼吸的空气里刚刚打过农药的味儿 如果要工作,就坐...
    SaraWang357阅读 900评论 0 0
  • 本文参与#漫步青春#征文活动,作者:胡小玉,本人承诺,文章内容为原创,且未在其他平台发布 再慢一点 从前,我们习惯...
    氧化钙zz阅读 190评论 0 0