first stable version
This commit is contained in:
289
card.py
289
card.py
@@ -3,6 +3,7 @@ import game
|
||||
from room import Room
|
||||
from json import dumps
|
||||
|
||||
|
||||
cards = dict()
|
||||
card_name = ["1.攻擊","2.防禦","3.治癒","4.補給","5.強奪","6.奇襲","7.交易","8.洞悉","9.妙策","10.掃射","11.加護","12.劇毒","13.詛咒","14.反制","15.狂亂","16.逆轉"]
|
||||
unattackable = ['2','8','14','17','18']
|
||||
@@ -10,9 +11,14 @@ unrobable = ['8','17','18']
|
||||
for i in range(len(card_name)):
|
||||
cards[str(i+1)] = card_name[i] # initialize cards
|
||||
# create default deck
|
||||
# 攻擊*15 防禦*15 治癒*15 補給*10 強奪*10 奇襲*10 交易*10 洞悉*5 妙策*5 掃射*5 加護*5 劇毒*2 詛咒*2 反制*2 狂亂*2 逆轉*2
|
||||
#default_deck = ['1', '2', '3'] * 5 + ['4', '5', '6', '7'] * 3 + ['8', '9', '10', '11'] * 2 + ['12', '13', '14', '15', '16']
|
||||
default_deck = ['3', '4', '2', '1']*15
|
||||
"""
|
||||
攻擊*7 防禦*7 治癒*7
|
||||
補給*4 強奪*4 奇襲*4 交易*4
|
||||
洞悉*2 妙策*2 掃射*2 加護*2
|
||||
劇毒*1 詛咒*1 反制*1 狂亂*1 逆轉*1
|
||||
"""
|
||||
default_deck = ['1', '2', '3'] * 7 + ['4', '5', '6', '7'] * 4 + ['8', '9', '10', '11'] * 2 + ['12', '13', '14', '15', '16']
|
||||
|
||||
random.shuffle(default_deck) # wash
|
||||
|
||||
# card functions
|
||||
@@ -26,11 +32,10 @@ def attack(wscur, wsene):
|
||||
r = []
|
||||
|
||||
cur.damage = 2 # 給反制判斷的
|
||||
r.append(( (wscur, ), dumps({"msg": "attack", "data": [cur.name, ene.name]})))
|
||||
r.append(( (wscur, wsene), dumps({"msg": "attack", "data": [cur.name, ene.name]})))
|
||||
if ene.defence():
|
||||
r.append(( (wsene, ),
|
||||
dumps({"msg": "attack", "data": [cur.name, ene.name],
|
||||
"action": "toDefend", "value": {"damage": cur.damage}})
|
||||
dumps({"action": "toDefend", "value": {"damage": cur.damage, "type": "attack"}})
|
||||
))
|
||||
cur.status = Room.NOTHING
|
||||
ene.status = Room.DEFENCE
|
||||
@@ -38,7 +43,10 @@ def attack(wscur, wsene):
|
||||
r.append(( (wsene, wscur),
|
||||
dumps({"msg": "damaged", "data": [ene.name, cur.damage]})
|
||||
))
|
||||
|
||||
cur.status = Room.NOTHING
|
||||
ene.life -= cur.damage
|
||||
r.extend(Room.start_turn(wsene, wscur))
|
||||
cur.attacking = False
|
||||
cur.damage = 0 # reset
|
||||
"""
|
||||
@@ -62,10 +70,10 @@ def defend(wscur,wsene): # cur是用卡方
|
||||
cur, ene = wscur.player, wsene.player
|
||||
r = []
|
||||
if ene.attacking or ene.surprise:
|
||||
r.append(( (wsene,wscur), "{} 防禦成功".format(cur.name)))
|
||||
r.append(( (wsene,wscur), dumps({"msg": "defended", "data": [cur.name]})))
|
||||
|
||||
else:
|
||||
r.append(( (wsene,wscur), "{} 沒什麼可以防禦的,回復一點生命".format(cur.name)))
|
||||
r.append(( (wsene,wscur), dumps({"msg": "defend", "data": [cur.name]})))
|
||||
|
||||
cur.life += 1
|
||||
return r
|
||||
@@ -89,209 +97,206 @@ def supply(wscur,wsene):
|
||||
|
||||
def rob(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
cur.robbing = True
|
||||
print("{} 正在對 {} 行搶".format(cur.name,ene.name))
|
||||
if ene.keep():
|
||||
game.display(ene) # 顯示手牌
|
||||
while True:
|
||||
choice = input("請問要防禦嗎? 不使用請輸入0 ")
|
||||
if choice in ene.hand:
|
||||
if choice in unrobable:
|
||||
skills[choice](cur,ene)
|
||||
ene.remove_card(choice)
|
||||
break
|
||||
elif choice == "0":
|
||||
break
|
||||
else:
|
||||
if len(ene.hand) == 0:
|
||||
print("可惜,{} 有夠窮,沒東西能搶".format(ene.name))
|
||||
else:
|
||||
game.display(ene)
|
||||
while True:
|
||||
swag = input("{} 要搶哪張?".format(cur.name))
|
||||
if swag in ene.hand:
|
||||
ene.robbed(swag)
|
||||
cur.add_card(swag)
|
||||
break
|
||||
cur.robbing = False
|
||||
r = []
|
||||
r.append(( (wscur, ), dumps({"msg": "rob", "data": [cur.name, ene.name],
|
||||
"action": "toRob", "value": {"enemy_card": ene.hand}})))
|
||||
|
||||
cur.status = Room.ROBBING
|
||||
r.append(( (wsene, ), dumps({"msg": "rob", "data": [cur.name, ene.name]})))
|
||||
return r
|
||||
|
||||
def surprise(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
cur.surprise = True
|
||||
cur.damage = 1 # 給反制判斷
|
||||
print("{} 發動奇襲".format(cur.name))
|
||||
|
||||
r = []
|
||||
|
||||
cur.damage = 1
|
||||
r.append(( (wscur, wsene), dumps({"msg": "surprise", "data": [cur.name]})))
|
||||
if ene.defence():
|
||||
game.display(ene) # 顯示手牌
|
||||
while True:
|
||||
choice = input("請問要防禦嗎? 不使用請輸入0 ")
|
||||
if choice in ene.hand:
|
||||
if choice in unattackable:
|
||||
skills[choice](cur,ene)
|
||||
ene.remove_card(choice)
|
||||
break
|
||||
elif choice == "0":
|
||||
print("{} 受到{}點傷害,而且掉了一張手牌".format(ene.name,cur.damage))
|
||||
ene.life -= cur.damage
|
||||
drop = random.choice(ene.hand)
|
||||
ene.remove_card(drop)
|
||||
break
|
||||
r.append(( (wsene, ),
|
||||
dumps({"action": "toDefend", "value": {"damage": cur.damage, "type": "surprise"}})
|
||||
))
|
||||
cur.status = Room.NOTHING
|
||||
ene.status = Room.DEFENCE
|
||||
else:
|
||||
print("{} 受到{}點傷害,而且掉了一張手牌".format(ene.name,cur.damage))
|
||||
r.append(( (wsene, wscur),
|
||||
dumps({"msg": "surprised", "data": [ene.name, cur.damage]})
|
||||
))
|
||||
|
||||
cur.status = Room.NOTHING
|
||||
ene.life -= cur.damage
|
||||
drop = random.choice(ene.hand)
|
||||
ene.remove_card(drop)
|
||||
cur.surprise = False
|
||||
cur.damage = 0 # reset
|
||||
cur.surprise = False
|
||||
cur.damage = 0 # reset
|
||||
|
||||
r.extend(Room.start_turn(wsene, wscur))
|
||||
|
||||
return r
|
||||
|
||||
def trade(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
print("{} 想與 {} 進行交易".format(cur.name,ene.name))
|
||||
cur.remove_card("7") # you can't trade the using card "trade"
|
||||
game.display(cur) # 顯示手牌
|
||||
while True:
|
||||
choice = input("選擇一張手牌以交換 ")
|
||||
if choice in cur.hand:
|
||||
cur_item = choice
|
||||
print("{} 選擇了 {}".format(cur.name,cards[choice]))
|
||||
break
|
||||
game.display(ene) # 顯示手牌
|
||||
while True:
|
||||
choice = input("選擇一張手牌以交換 ")
|
||||
if choice in ene.hand:
|
||||
ene_item = choice
|
||||
print(ene.name,"choose",cards[choice])
|
||||
break
|
||||
# current player part
|
||||
cur.hand.remove(cur_item)
|
||||
cur.display.remove(cards[cur_item])
|
||||
cur.hand.append(ene_item)
|
||||
cur.display.append(cards[ene_item])
|
||||
# enemy part
|
||||
ene.hand.remove(ene_item)
|
||||
ene.display.remove(cards[ene_item])
|
||||
ene.hand.append(cur_item)
|
||||
ene.display.append(cards[cur_item])
|
||||
r = []
|
||||
if ene.hand:
|
||||
r.append(( (wsene, wscur),
|
||||
dumps({"msg": "trade", "data": [cur.name, ene.name]})
|
||||
))
|
||||
|
||||
cur.add_card("7") # add back the card. game system will remove this card right away
|
||||
r.append(( (wscur,),
|
||||
dumps({"action": "toTrade", "value": {"hand": cur.hand}}) # 更新已被移除的trade
|
||||
))
|
||||
cur.status = Room.TRADE
|
||||
else:
|
||||
r.append(( (wscur,wsene),
|
||||
dumps({"msg": "tradeNoCard", "data": [cur.name]})
|
||||
))
|
||||
r.extend(Room.start_turn(wsene, wscur))
|
||||
|
||||
return r
|
||||
|
||||
def aware(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
if cur.attacking:
|
||||
print("{} 洞悉了 {} 的攻擊,並抽取了一張手牌".format(ene.name,cur.name))
|
||||
game.draw(ene)
|
||||
elif cur.robbing:
|
||||
print("{} 洞悉了 {} 的強奪,並抽取了一張手牌".format(ene.name,cur.name))
|
||||
game.draw(ene)
|
||||
elif cur.surprise:
|
||||
print("{} 洞悉了 {} 的奇襲,並抽取了一張手牌".format(ene.name,cur.name))
|
||||
game.draw(ene)
|
||||
r = []
|
||||
if ene.attacking:
|
||||
r.append(( (wsene,wscur), dumps({"msg": "awared", "data": [cur.name, ene.name, "攻擊"]})))
|
||||
|
||||
elif ene.robbing != "0":
|
||||
r.append(((wscur, wsene), dumps({"msg": "awared", "data": [cur.name, ene.name, "搶奪"]})))
|
||||
|
||||
elif ene.surprise:
|
||||
r.append(( (wsene,wscur), dumps({"msg": "awared", "data": [cur.name, ene.name, "奇襲"]})))
|
||||
|
||||
else:
|
||||
r.append(((wscur, wsene), dumps({"msg": "aware", "data": [cur.name]})))
|
||||
for _ in range(3):
|
||||
print("{} 增加三張手牌".format(cur.name))
|
||||
game.draw(cur)
|
||||
|
||||
return r
|
||||
|
||||
def plan(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
r = []
|
||||
|
||||
r.append(( (wsene, wscur),
|
||||
dumps({"msg": "plan", "data": [cur.name]})
|
||||
))
|
||||
|
||||
print("{} 有個妙策".format(cur.name))
|
||||
options = random.sample(cur.deck,3)
|
||||
o_name = [] # names of cards in options
|
||||
for id in options:
|
||||
o_name.append(cards[id])
|
||||
print(o_name)
|
||||
while True:
|
||||
r.append(( (wscur, ),
|
||||
dumps({"action": "toAdd", "value": {"cards": options}})
|
||||
))
|
||||
cur.planning = options
|
||||
cur.status = Room.PLAN
|
||||
"""while True:
|
||||
choice = input("選擇一張卡加入手牌 ")
|
||||
if choice in options:
|
||||
cur.add_card(choice)
|
||||
break
|
||||
break"""
|
||||
return r
|
||||
|
||||
def sweep(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
cur.attacking = True
|
||||
|
||||
r = []
|
||||
|
||||
cur.damage = random.randint(0,5)
|
||||
print("{} 對 {} 進行掃射,威力是 {}".format(cur.name,ene.name,cur.damage))
|
||||
r.append(( (wscur, wsene), dumps({"msg": "sweep", "data": [cur.name, ene.name, cur.damage]})))
|
||||
if ene.defence():
|
||||
game.display(ene) # 顯示手牌
|
||||
while True:
|
||||
choice = input("請問要防禦嗎? 不使用請輸入0 ")
|
||||
if choice in ene.hand:
|
||||
if choice in unattackable:
|
||||
skills[choice](cur,ene)
|
||||
ene.remove_card(choice)
|
||||
break
|
||||
elif choice == "0":
|
||||
print("{} 受到{}點傷害".format(ene.name,cur.damage))
|
||||
ene.life -= cur.damage
|
||||
break
|
||||
r.append(( (wsene, ),
|
||||
dumps({"action": "toDefend", "value": {"damage": cur.damage, "type": "sweep"}})
|
||||
))
|
||||
cur.status = Room.NOTHING
|
||||
ene.status = Room.DEFENCE
|
||||
else:
|
||||
print("{} 受到{}點傷害".format(ene.name,cur.damage))
|
||||
r.append(( (wsene, wscur),
|
||||
dumps({"msg": "damaged", "data": [ene.name, cur.damage]})
|
||||
))
|
||||
|
||||
cur.status = Room.NOTHING
|
||||
ene.life -= cur.damage
|
||||
cur.attacking = False
|
||||
cur.damage = 0 # reset
|
||||
r.extend(Room.start_turn(wsene, wscur))
|
||||
cur.attacking = False
|
||||
cur.damage = 0 # reset
|
||||
|
||||
return r
|
||||
|
||||
|
||||
|
||||
def bless(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
print("{} 獲得加護,身上的毒素一掃而空,並回復三點生命,還抽取了兩張手牌".format(cur.name))
|
||||
r = []
|
||||
r.append(( (wsene,wscur), dumps({"msg": "bless", "data": [cur.name]})))
|
||||
|
||||
cur.poison = 0 # 解毒
|
||||
cur.life += 3
|
||||
|
||||
for _ in range(2):
|
||||
game.draw(cur)
|
||||
|
||||
return r
|
||||
|
||||
def poison(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
if ene.poison != 0:
|
||||
s = "又"
|
||||
else:
|
||||
s = ""
|
||||
print("{} 在食物下毒,{} {}中毒了".format(cur.name,ene.name, s))
|
||||
r = []
|
||||
r.append(( (wsene,wscur), dumps({"msg": "poison", "data": [cur.name, ene.name]})))
|
||||
|
||||
ene.poison += 1
|
||||
return r
|
||||
|
||||
def curse(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
r = []
|
||||
|
||||
print("{} 詛咒了 {},使其損失四點生命,並掉了一張手牌".format(cur.name,ene.name))
|
||||
|
||||
ene.life -= 4
|
||||
drop = random.choice(ene.hand)
|
||||
ene.remove_card(drop)
|
||||
|
||||
msg = "curseNoCard"
|
||||
if ene.hand:
|
||||
drop = random.choice(ene.hand)
|
||||
ene.remove_card(drop)
|
||||
msg = "curse"
|
||||
r.append(( (wsene,wscur), dumps({"msg": msg, "data": [cur.name, ene.name]})))
|
||||
return r
|
||||
|
||||
def counter(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
r = []
|
||||
|
||||
if cur.attacking:
|
||||
print("{} 反制了 {} 的攻擊,反彈了{}點傷害".format(ene.name,cur.name,cur.damage))
|
||||
cur.life -= cur.damage
|
||||
elif cur.surprise:
|
||||
print("{} 反制了 {} 的奇襲,反彈了{}點傷害,並使其掉了一張手牌".format(ene.name,cur.name,cur.damage))
|
||||
cur -= cur.damage
|
||||
drop = random.choice(cur.hand)
|
||||
cur.remove_card(drop)
|
||||
if ene.attacking:
|
||||
r.append(( (wsene,wscur), dumps({"msg": "countered", "data": [cur.name, ene.name, ene.damage]})))
|
||||
ene.life -= ene.damage
|
||||
elif ene.surprise:
|
||||
r.append(( (wsene,wscur), dumps({"msg": "counteredSur", "data": [cur.name, ene.name, ene.damage]})))
|
||||
ene.life -= ene.damage
|
||||
drop = random.choice(ene.hand)
|
||||
ene.remove_card(drop)
|
||||
else:
|
||||
print("{} 反制了敵手,使 {} 生命值減半了!".format(cur.name,ene.name))
|
||||
r.append(( (wsene,wscur), dumps({"msg": "counter", "data": [cur.name, ene.name]})))
|
||||
ene.life = ene.life//2
|
||||
|
||||
return r
|
||||
|
||||
def chaos(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
|
||||
print("{} 進入狂亂模式,回復三點生命,並對 {} 造成三點傷害".format(cur.name,ene.name))
|
||||
r = []
|
||||
r.append(( (wsene,wscur), dumps({"msg": "reverse", "data": [cur.name, ene.name]})))
|
||||
|
||||
cur.life += 3
|
||||
ene.life -= 3
|
||||
|
||||
return r
|
||||
|
||||
def reverse(wscur,wsene):
|
||||
cur, ene = wscur.player, wsene.player
|
||||
r = []
|
||||
r.append(( (wsene,wscur), dumps({"msg": "reverse", "data": [cur.name]})))
|
||||
|
||||
|
||||
print("{} 一口氣逆轉了情勢".format(cur.name))
|
||||
cur.life,ene.life = ene.life,cur.life
|
||||
return r
|
||||
|
||||
skills = dict()
|
||||
skill_name = [attack,defend,heal,supply,rob,surprise,trade,aware,plan,sweep,bless,poison,curse,counter,chaos,reverse]
|
||||
for i in range(len(skill_name)):
|
||||
skills[str(i+1)] = skill_name[i]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user