《笨办法学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()




你可能感兴趣的:(《笨办法学Python》笔记31-----你来做一个游戏)