今天看到很久以前在学校的时候的一个伪代码,讲述的是一个打怪的故事,今天用python做一下练习。


伪代码如下:

class 怪物 
{ 
char 怪物名; 
int 血; 

怪物(怪物名n,血n) /*构造函数*/ 
{ 
怪物名=怪物名n; 
血=血n; 
} 

被打函数() 
{ 
血减少; 
} 

判断函数() 
{ 
if (血==0) 
printf("你胜利了!"); 
} 

玩游戏() 
{ 
while (血 > 0) 
{ 
被打函数(); 
判断函数(); 
} 
} 
}




import os,random,time,threading,random,string

##定义一个monster类,属性有名字,血量,被打方法,判断方法
class monster():
  def __init__(self, name, blood):
    self.name = name
    self.blood = blood
    print 'Hahaha.....I am a tiger monster'

  def hit(self, n, times):
    self.blood = self.blood - n
    if self.blood < 0:
      self.blood = 0
    print 'Round %s monster\'s blood - %s' % (times, n)
    print 'monster\'s blood is %s' % self.blood

  def checklife(self):
    if self.blood <= 0:
      print 'Finally, you win!'

##定义一个hunter类,属性有名字、***血量,打怪方法,休息方法
class hunter():
  def __init__(self, name, hitblo):
    self.hitblo = hitblo
    self.name = name

  def hitmonster(self):
    print 'I am hunter-%s , my hitnum is %s' % (self.name, self.hitblo)
    print 'Ouye...hunter hit monster %s blood' % self.hitblo
    return self.hitblo

  def haverest(self):
    print 'hunter %s need have a rest.' % self.name
    time.sleep(random.random())


##定义一个全局怪物tiger
global m
m = monster('tiger', 800)
numround = 1                    ##定义一个计数变量,计算打斗回合

##锁
lock1 = threading.Lock()

##定义游戏流程函数,内置的if判断是必要的,否则最后一次打斗判断,3个线程while都是true,但是第一次打怪已经结束流程了,后面两线程等待锁释放之后,还是使用之前的true判断

def playgame(hname, hitblo):
  print '%s :fighting begin...\n' %hname
  h = hunter(hname, hitblo)

  while m.blood >0:
    lock1.acquire()
    try:
      if m.blood >0:
        h.hitmonster()
        h.haverest()

        global numround
        m.hit(h.hitblo, numround)
        m.checklife()
        
        numround+=1
        print '------------------------------------------'
    finally:
      lock1.release()

      
 ##定义一个函数,随机生成hunter信息
def mkobj(n):
  global hunters
  hunters = []
  for i in range(0,n):
    strname = string.join(random.sample(['a','b','c','d','e','f','g','h','i','j'], 3)).replace(" ","")
    hitnum = random.randrange(60, 151)
    hunters.append(hunter(strname,hitnum))

mkobj(3)

t0 = threading.Thread(target=playgame, args=(hunters[0].name, hunters[0].hitblo,))
t1 = threading.Thread(target=playgame, args=(hunters[1].name, hunters[1].hitblo,))
t2 = threading.Thread(target=playgame, args=(hunters[2].name, hunters[2].hitblo,))

t0.start()
t1.start()
t2.start()
t0.join()
t1.join()
t2.join()



执行结果还蛮有意思的

Hahaha.....I am a tiger monster
afg :fighting begin...
gdh :fighting begin...
cbf :fighting begin...



I am hunter-afg , my hitnum is 119
Ouye...hunter hit monster 119 blood
hunter afg need have a rest.
Round 1 monster's blood - 119
monster's blood is 681
------------------------------------------
I am hunter-gdh , my hitnum is 109
Ouye...hunter hit monster 109 blood
hunter gdh need have a rest.
Round 2 monster's blood - 109
monster's blood is 572
------------------------------------------
I am hunter-cbf , my hitnum is 64
Ouye...hunter hit monster 64 blood
hunter cbf need have a rest.
Round 3 monster's blood - 64
monster's blood is 508
------------------------------------------
I am hunter-afg , my hitnum is 119
Ouye...hunter hit monster 119 blood
hunter afg need have a rest.
Round 4 monster's blood - 119
monster's blood is 389
------------------------------------------
I am hunter-gdh , my hitnum is 109
Ouye...hunter hit monster 109 blood
hunter gdh need have a rest.
Round 5 monster's blood - 109
monster's blood is 280
------------------------------------------
I am hunter-cbf , my hitnum is 64
Ouye...hunter hit monster 64 blood
hunter cbf need have a rest.
Round 6 monster's blood - 64
monster's blood is 216
------------------------------------------
I am hunter-afg , my hitnum is 119
Ouye...hunter hit monster 119 blood
hunter afg need have a rest.
Round 7 monster's blood - 119
monster's blood is 97
------------------------------------------
I am hunter-gdh , my hitnum is 109
Ouye...hunter hit monster 109 blood
hunter gdh need have a rest.
Round 8 monster's blood - 109
monster's blood is 0
Finally, you win!
------------------------------------------