您的位置:首页 > 编程语言 > Python开发

【python学习】多线程 与 面向对象 结合的一个经典例子

2016-04-12 17:15 691 查看
今天看到很久以前在学校的时候的一个伪代码,讲述的是一个打怪的故事,今天用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!
------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息