南理文字RPG Three
此次代码增加了
1.百位NPC比赛,决出金牌、银牌、铜牌(属性可以相同也可以不同)
2.NPC有策略地进行攻击
3.增加了多线程
copy
拷贝分为两种,深拷贝和浅拷贝,深拷贝顾名思义便是将被拷贝项的所有东西拷贝,不只是拷贝引用而是将所有地引用从新生成新地址,被拷贝项地改变不会引起拷贝项地改变
import copy
item = {"key":"键","value":"值"}
x = copy.deepcopy(item)
浅拷贝顾名思义便只是浅度地拷贝,对被拷贝对象如果有引用,直接把引用对象地引用给拷贝,被拷贝对象地改变将引起拷贝对象地改变
item = {"key":"键","value":"值"}
x = copy.copy(item)
item["value"] = "改变"
则x也变为{“key”:“键”,“value”:“改变”}
多线程
多线程即可以同时运行多个任务,也可以理解为同时运行多个函数,但是有一点要注意多线程里面地资源是共享地,如果有一个变量多个函数都在引用这是要加上锁或是队列之类地防止出错
import threading
num = 5
def print_(num):
print("haode",num)
t1 = threading.Thread(target=print,args=(num,)) #target后面为函数引用,args后面为传递地参数,需为tuple(元组)
t1.start()
等待子线程运行完再运行下面地代码需要加上下面代码
t1.join() #等待子线程运行完再运行下面代码
Python.append()与Python.expand()
Python.append()为直接添加元素,Python.extend()为将要添加地元素迭代再加入到列表地末尾
alist=[1,2]] >>>[1,2]
alist.append([3,4]) >>>[1, 2, [3, 4]]
alist.extend([3,4]) >>>[1, 2, 3, 4]
下面为游戏代码
"""
有等级,血量,魔法,防御属性
调用100个同属性战斗时需再Fight_With里面的choose_action函数改为choose_action1并多加self.WAY以及int(i/2)值
其他需将Fight_With里面的choose_action1函数改为choose_action并减去self.WAY以及int(i/2)值
"""
# coding = "utf-8"
import time
import random
import threading
import copy
MEDAL = []
VICTORY = []
SCRIPT_NPC_SCHOOL_SISTER=['你好!',
'你好!',
'你是新生吗?',
'是的',
'想要我教你魔法吗?',
'\n1、好的 \
\n2、不用了吧,我不和学姐学魔法!\n'
]
#世界里的魔法清单
MAGIC_BOOKS={
0:['火魔法',1],
1:['水魔法',2],
2:['土魔法',0.5],
3:["大地之盾",-1]
}
class Body():
ACCACK = 1
def __init__(self,IS_HUMAN_= False,NAME_='Ice NPC',LOCATION_={"x":0,"y":0},WAY_ = [],HP_=5,MP_=3,MAX_HP_=5,MAX_MP_=3,ATTACK_=1,MAGIC_ATTACK_=1.3,DEFENSE_=0,LEVEL_=1,EXPRIENCE_=0,MAX_EXPRIENCE_ = 20,FUNCTION_POINT_=0,HAS_MAGIC_=[],POS_NAME_='南昌理工学院南大门'):
self.IS_HUMAN = IS_HUMAN_ #判断是否位人类
self.NAME = NAME_ #姓名
# self.LOCATION = LOCATION_ #坐标
self.WAY = WAY_
self.HP = HP_ #血量
self.MP = MP_ #魔法值
self.MAX_HP = MAX_HP_ #最大血量
self.MAX_MP = MAX_MP_ #最大魔法值
self.ATTACK = ATTACK_ #普通攻击
self.MAGIC_ATTACK = MAGIC_ATTACK_ #魔法攻击
self.DEFENSE = DEFENSE_ #防御
self.LEVEL = LEVEL_ #等级
self.EXPERIENCE = EXPRIENCE_ #经验值
self.MAX_EXPERIENCE = MAX_EXPRIENCE_ #升级所需经验值
self.FUNCTION_POINT = FUNCTION_POINT_ #功能点
self.POS_NAME = POS_NAME_ #地点
self.HAS_MAGIC = HAS_MAGIC_ #会的魔法
def Display_Magic(self): #显示魔法
for i in self.HAS_MAGIC:
print(MAGIC_BOOKS[i][0]+"每次攻击消耗"+str(abs(MAGIC_BOOKS[i][1]))+"点魔法值")
def Display_Status(self): #显示人物状态
print('\n\r', ' 状态:' + self.NAME)
print("等级:"+str(self.LEVEL)+" 距离下次升级还需"+str(self.MAX_EXPERIENCE-self.EXPERIENCE)+"经验", end='')
print('\n血量:' + '❤' * int(self.HP), '\n 魔法值:' + '⚓' * int(self.MP),'\n 防御:' + '🛡' * int(self.DEFENSE))
print('地点:' + self.POS_NAME)
if self.HAS_MAGIC == []:
print('无魔法')
else:
self.Display_Magic()
#展示战斗状态
def display_status_fighting(self):
print('\n\r', ' 状态:' + self.NAME, end='')
print('\n血量:' + '❤' * int(self.HP), ' 魔法值:' + '⚓' * int(self.MP),' 防御:' + '🛡' * int(self.DEFENSE))
def Attack_One_Time(self,CHOOSE,NPC_): #对敌方进行一次攻击
if CHOOSE == -2:
self.Display_Magic()
elif CHOOSE == -1:
hit = 1 - NPC_.DEFENSE
if hit > 0:
NPC_.HP -= hit
print(self.NAME+"使用普攻攻击了"+NPC_.NAME+"造成了"+str(hit)+"点攻击")
else:
print(self.NAME + "使用普攻攻击了" + NPC_.NAME + "造成了0点攻击")
print("无魔法消耗")
else:
#是否有魔法
if CHOOSE in self.HAS_MAGIC:
if self.MP > MAGIC_BOOKS[CHOOSE][1]: #魔法值是否充足
if MAGIC_BOOKS[CHOOSE][1] > 0 :
hit = self.MAGIC_ATTACK * MAGIC_BOOKS[CHOOSE][1] - NPC_.DEFENSE
self.MP -= MAGIC_BOOKS[CHOOSE][1]
if hit > 0:
NPC_.HP -= hit
print(self.NAME + "使用" + MAGIC_BOOKS[CHOOSE][0] + "攻击了" + NPC_.NAME + "造成了" + str(
hit) + "点攻击")
print("消耗了" + str(abs(MAGIC_BOOKS[CHOOSE][1])) + "点魔法")
else:
print(self.NAME + "使用" + MAGIC_BOOKS[CHOOSE][0] + "攻击了" + NPC_.NAME + "造成了0点攻击")
else:
self.MP += MAGIC_BOOKS[CHOOSE][1]
self.HP -= self.MAGIC_ATTACK * MAGIC_BOOKS[CHOOSE][1]
print(self.NAME + "使用" + MAGIC_BOOKS[CHOOSE][0] + "回复了自身" + str(-self.MAGIC_ATTACK * MAGIC_BOOKS[CHOOSE][1])+"点生命值")
else:
print("魔法值不足")
hit = 1 - NPC_.DEFENSE
if hit > 0:
NPC_.HP -= hit
print(self.NAME + "使用普攻攻击了" + NPC_.NAME + "造成了" + str(hit) + "点攻击")
else:
print(self.NAME + "使用普攻攻击了" + NPC_.NAME + "造成了0点攻击")
else:
print("你没有此魔法")
hit = 1 - NPC_.DEFENSE
if hit > 0:
NPC_.HP -= hit
print(self.NAME + "使用普攻攻击了" + NPC_.NAME + "造成了" + str(hit) + "点攻击")
else:
print(self.NAME + "使用普攻攻击了" + NPC_.NAME + "造成了0点攻击")
if NPC_.HP <= 0:
return 1
else:
return 0
def talk_to(self, NPC_, NPC_SCRIPT_, delay=0):
# 按剧本和NPC聊天
print('在' + self.POS_NAME + '遇到 ' + NPC_.NAME)
for i in range(len(NPC_SCRIPT_)):
if i % 2 == 1: # 判断当前说话的人
TURN = self.NAME
else:
TURN = NPC_.NAME
print(TURN + ':' + NPC_SCRIPT_[i])
time.sleep(delay)
def display_magic(self): # 显示魔法
print(self.MP,self.NAME + '会如下几种魔法:')
print('魔法名 ,消耗点数')
i = 0
for iMagic in self.HAS_MAGIC:
print('第', i+1, '个魔法:', MAGIC_BOOKS[iMagic])
i = i + 1
def Learn_Magic_From(self,NPC_): #学习魔法
NPC_.display_magic()
CHOOSE = input("是否学习魔法y/n:")
if CHOOSE == "y":
for i in NPC_.HAS_MAGIC:
print('恭喜'+self.NAME+'学会'+MAGIC_BOOKS[i][0]+
',每次使用消耗'+str(abs(MAGIC_BOOKS[i][1]))+'MP.')
self.HAS_MAGIC.append(i)
self.Display_Magic()
elif CHOOSE == "n":
print("由于你的固执,你只能普攻")
else:
print("不知道你在说什么")
def npc_learn_Magic_from(self,NPC_):
for i in NPC_.HAS_MAGIC:
print('恭喜' + self.NAME + '学会' + MAGIC_BOOKS[i][0] +
',每次使用消耗' + str(abs(MAGIC_BOOKS[i][1])) + 'MP.')
self.HAS_MAGIC.append(i)
self.Display_Magic()
#NPC选择最优攻击方式
def Choose_Action(self,NPC_):
if self.HP < 2:
if 3 in self.HAS_MAGIC:
return 3
else:
HAS_MAGIC = [MAGIC_BOOKS[i][1] for i in self.HAS_MAGIC]
HAS_MAGIC.sort()
HAS_MAGIC.reverse()
for i in HAS_MAGIC:
for key, value in MAGIC_BOOKS.items():
if i in value:
if self.MP >= i:
return key
else:
HAS_MAGIC = [MAGIC_BOOKS[i][1] for i in self.HAS_MAGIC]
HAS_MAGIC.sort()
HAS_MAGIC.reverse()
for i in HAS_MAGIC:
for key, value in MAGIC_BOOKS.items():
if i in value:
if self.MP >= i:
return key
return -1
#同属性战斗
def Choose_Action1(self,NPC_,WAY_,index1):
return WAY_[index1]
#玩家提升属性
def Add_Attribute(self):
print("恭喜你增加经验20")
self.EXPERIENCE += 20
while True:
if self.EXPERIENCE - self.MAX_EXPERIENCE >= 0:
self.LEVEL += 1
self.EXPERIENCE -= self.MAX_EXPERIENCE
self.MAX_EXPERIENCE *= 2
FUNCYTION_POINT = self.FUNCTION_POINT + self.LEVEL * 2 + 2
self.FUNCTION_POINT += FUNCYTION_POINT
print("恭喜等级提升到" + str(self.LEVEL) + "级", "\n 获得" + str(FUNCYTION_POINT) + "点功能点,可用来提升属性")
# 防止一次提升多次等级
if self.EXPERIENCE - self.MAX_EXPERIENCE < 0:
break
self.Display_Status()
for i in range(self.FUNCTION_POINT):
CHOOSE = input("你需要提升哪个属性?(HP/MP/DEFENCE)")
if CHOOSE == "HP":
self.HP += 1
elif CHOOSE == "MP":
self.MP += 1
elif CHOOSE == "DEFENCE":
self.DEFENSE += 1
self.Display_Status()
#挑战NPC
def Fight_With(self,NPC_):
print('【', self.NAME + '开始和' + NPC_.NAME + '战斗! !', '】')
MAX_ROUND = 100
IS_DEAD = 0
for i in range(MAX_ROUND):
if i%2==0:
if self.IS_HUMAN:
self.display_status_fighting() # 显示玩家状态
self.Display_Magic() # 显示玩家魔法
NPC_.display_status_fighting() # 显示NPC状态
HAS_MAGIC = []
for j in self.HAS_MAGIC:
HAS_MAGIC.append(str(j))
HAS_MAGIC = "/".join(HAS_MAGIC)
choose_magic = int(input('-----使用魔法/普通攻击(-1普通攻击,{}.魔法攻击,查看状态-2):'.format(HAS_MAGIC)))
IS_DEAD = self.Attack_One_Time(NPC_=NPC_, CHOOSE=choose_magic)
IS_DEAD = IS_DEAD * 2 # 用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了
else:
choose_action = self.Choose_Action(NPC_)
IS_DEAD = self.Attack_One_Time(NPC_=NPC_, CHOOSE=choose_action)
IS_DEAD *= 2
if i%2 == 1:
if not NPC_.IS_HUMAN:
choose_action = NPC_.Choose_Action(self)
IS_DEAD = NPC_.Attack_One_Time(NPC_=self, CHOOSE=choose_action)
else:
self.display_status_fighting() # 显示玩家状态
self.Display_Magic() # 显示玩家魔法
NPC_.Display_Status() # 显示NPC状态
HAS_MAGIC = []
for j in self.HAS_MAGIC:
HAS_MAGIC.append(str(j))
HAS_MAGIC = "/".join(HAS_MAGIC)
choose_magic = int(input('-----使用魔法/普通攻击(-1普通攻击,{}.魔法攻击,查看状态-2):'.format(HAS_MAGIC)))
IS_DEAD = self.Attack_One_Time(NPC_=NPC_, CHOOSE=choose_magic)
IS_DEAD = IS_DEAD*4 #用乘法,让我们不改变0,非0状态的情况下,标记是谁赢了
if IS_DEAD>=1:
print('【战斗结束】')
#恢复状态
self.HP = self.MAX_HP
self.MP = self.MAX_MP
NPC_.MP = NPC_.MAX_MP
NPC_.HP = NPC_.MAX_HP
#判断胜利者
if IS_DEAD==2:
print('【',self.NAME+'战胜了'+NPC_.NAME,'】')
VICTORY.append(self)
if self.IS_HUMAN:
self.Add_Attribute()
elif IS_DEAD==4:
VICTORY.append(NPC_)
print('【',NPC_.NAME+'战胜了'+self.NAME,'】')
if NPC_.IS_HUMAN:
NPC_.Add_Attribute()
return IS_DEAD
else:
if i % 2 == 1:
print('【第' + str(1 + int(i / 2)) + '回合结束!】\n===================================')
class World:
# import sys
# # 如果确实需要很深的递归深度,可以使用sys模块中的setrecursionlimit()函数修改默认的最大深度限制。
# sys.setrecursionlimit(10000)
PLAYER = Body(DEFENSE_=0.5,IS_HUMAN_=True)
def __init__(self):
self.NPCs = {
'school elder sister': Body(NAME_='school elder sister', HAS_MAGIC_=[0, 1,3]),
'ice monster': Body(NAME_='ice monster', HAS_MAGIC_=[2]),
'fire monster': Body(NAME_='fire monster', HAS_MAGIC_=[0])
}
print("欢迎来到南理文字游戏")
# self.PLAYER.NAME = input("请输入玩家姓名")
print('....南理文字RPG0.2的世界开始了.....')
welcome_script = 'Hi,' + self.PLAYER.NAME + ',欢迎加入南理文字RPG0.2 '
# self.display_a_line(script=welcome_script)
print(welcome_script)
def self_NPC_(self):
NPCs = []
t = []
for i in range(10):
NPC = Body(NAME_="NPC"+str(i),HP_=random.randint(3,6),MP_=random.randint(2,4),HAS_MAGIC_=[random.randint(0,3) for i in range(2)])
NPCs.append(NPC)
VICTORY.append(NPC)
for i in range(5):
NPC1 = random.choice(NPCs)
NPCs.remove(NPC1)
NPC2 = random.choice(NPCs)
NPCs.remove(NPC2)
t1 = threading.Thread(target=self.NPC,args=(NPC1,NPC2))
t.append(t1)
#开启线程
for i in t:
i.start()
#NPC遭遇
def NPC(self,NPC1,NPC2):
print(NPC1.NAME + "与" + NPC2.NAME)
NPC1.talk_to(NPC_=NPC2, NPC_SCRIPT_=SCRIPT_NPC_SCHOOL_SISTER)
NPC1.npc_learn_Magic_from(NPC2)
NPC1.Fight_With(NPC2)
#NPC比赛
def Game(self):
SILVER_MEDAL = []
BRONZE_MEDAL = []
t = []
for i in range(100):
NPC = Body(NAME_="NPC"+str(i),HP_=random.randint(3,6),MP_=random.randint(2,4),HAS_MAGIC_=[random.randint(0,3) for i in range(2)])
VICTORY.append(NPC)
while len(VICTORY) > 1:
if len(VICTORY) == 4:
BRONZE_MEDAL.extend(VICTORY)
if len(VICTORY) == 2:
SILVER_MEDAL.extend(VICTORY)
for i in range(int(len(VICTORY)/2)):
NPC1 = random.choice(VICTORY)
VICTORY.remove(NPC1)
NPC2 = random.choice(VICTORY)
VICTORY.remove(NPC2)
t1 = threading.Thread(target=NPC1.Fight_With, args=(NPC2,))
t.append(t1)
t1.start()
for i in t:
i.join()
player = [i.NAME for i in VICTORY]
print(player)
VICTORY1 = copy.deepcopy(VICTORY)
BRONZE_MEDAL = list(set(BRONZE_MEDAL) - set(SILVER_MEDAL))
SILVER_MEDAL = list(set(SILVER_MEDAL) - set(VICTORY))
VICTORY.clear()
BRONZE_MEDAL[0].Fight_With(BRONZE_MEDAL[1])
print("金牌:",VICTORY1[0].NAME)
print("银牌:",SILVER_MEDAL[0].NAME)
print("铜牌:",VICTORY[0].NAME)
#npc同属性战斗
def With_Game(self):
SILVER_MEDAL = []
BRONZE_MEDAL = []
t = []
for i in range(20):
NPC = Body(NAME_="NPC" + str(i), HP_=5, MP_=3,
HAS_MAGIC_=[0,1,3],WAY_= [1,1,0,3,-1,-1,-1,-1])
VICTORY.append(NPC)
for i in range(20,40):
NPC = Body(NAME_="NPC" + str(i), HP_=5, MP_=3,
HAS_MAGIC_=[0, 1, 3], WAY_=[0, 1, 0, 3, -1, -1, -1, -1])
VICTORY.append(NPC)
for i in range(40,60):
NPC = Body(NAME_="NPC" + str(i), HP_=5, MP_=3,
HAS_MAGIC_=[0,1,3],WAY_= [0,0,3,-1,-1,-1,-1,-1])
VICTORY.append(NPC)
for i in range(60,80):
NPC = Body(NAME_="NPC" + str(i), HP_=5, MP_=3,
HAS_MAGIC_=[0,1,3],WAY_= [1,1,3,-1,-1,-1,-1,-1])
VICTORY.append(NPC)
for i in range(80,100):
NPC = Body(NAME_="NPC" + str(i), HP_=5, MP_=3,
HAS_MAGIC_=[0,1,3],WAY_= [-1,-1,0,3,0,-1,-1,-1])
VICTORY.append(NPC)
while len(VICTORY) > 1:
if len(VICTORY) == 4:
BRONZE_MEDAL.extend(VICTORY)
if len(VICTORY) == 2:
SILVER_MEDAL.extend(VICTORY)
for i in range(int(len(VICTORY) / 2)):
NPC1 = random.choice(VICTORY)
VICTORY.remove(NPC1)
NPC2 = random.choice(VICTORY)
VICTORY.remove(NPC2)
t1 = threading.Thread(target=NPC1.Fight_With, args=(NPC2,))
t.append(t1)
t1.start()
for i in t:
i.join()
player = [i.NAME for i in VICTORY]
print(player)
VICTORY1 = copy.deepcopy(VICTORY)
BRONZE_MEDAL = list(set(BRONZE_MEDAL) - set(SILVER_MEDAL))
SILVER_MEDAL = list(set(SILVER_MEDAL) - set(VICTORY))
VICTORY.clear()
BRONZE_MEDAL[0].Fight_With(BRONZE_MEDAL[1])
print("金牌:", VICTORY1[0].NAME)
print("银牌:", SILVER_MEDAL[0].NAME)
print("铜牌:", VICTORY[0].NAME)
#随机选择NPC进行交流,学习,战斗
def Draw_NPC(self):
NPCs = [i for i in self.NPCs.keys()]
num = random.randint(0,len(NPCs)-1)
return self.NPCs[NPCs[num]]
#实现逻辑
def run(self):
#展示人物状态
self.PLAYER.Display_Status()
#随机选择NPVC
NPC_ = self.Draw_NPC()
#遭遇NPC
self.PLAYER.talk_to(NPC_=NPC_,NPC_SCRIPT_=SCRIPT_NPC_SCHOOL_SISTER)
#向NPC进行学习
self.PLAYER.Learn_Magic_From(NPC_)
#随机挑战NPC
NPC_ = self.Draw_NPC()
self.PLAYER.Fight_With(NPC_)
if __name__ == "__main__":
magic_world = World()
# #npc遭遇、交流、战斗
# magic_world.self_NPC_()
# #玩家
# magic_world.run()
#npc比赛
magic_world.Game()
# #npc同属性下比赛
# magic_world.With_Game()
本人学习所创,如有错误请多多指教
联系QQ1135999353