Keieit and Rabbit SP.Card completed

This commit is contained in:
Jerry Wu 2018-08-27 01:54:08 +08:00
parent 39792f4b48
commit cdc475ecc4
5 changed files with 149 additions and 56 deletions

118
Card.py
View File

@ -1,18 +1,11 @@
class Card: class Card:
ATK = 0 def __init__(self):
DEF = 1 pass
OTHER = 2
SP_ATK = 3
SP_DEF = 4
SP_OTHER = 5
def __init__(self, cardtype):
self.type = cardtype
class ATKCard(Card): class ATKCard(Card):
def __init__(self, id, name): def __init__(self, id, name):
super(ATKCard, self).__init__(Card.ATK) super(ATKCard, self).__init__()
self.id = id self.id = id
self.name = name self.name = name
self.damage = 0 self.damage = 0
@ -26,7 +19,7 @@ class ATKCard(Card):
class DEFCard(Card): class DEFCard(Card):
def __init__(self, id, name): def __init__(self, id, name):
super(DEFCard, self).__init__(Card.DEF) super(DEFCard, self).__init__()
self.id = id self.id = id
self.name = name self.name = name
def __repr__(self): def __repr__(self):
@ -37,7 +30,7 @@ class DEFCard(Card):
class OtherCard(Card): class OtherCard(Card):
def __init__(self, id, name): def __init__(self, id, name):
super(OtherCard, self).__init__(Card.OTHER) super(OtherCard, self).__init__()
self.id = id self.id = id
self.name = name self.name = name
def __repr__(self): def __repr__(self):
@ -45,17 +38,28 @@ class OtherCard(Card):
def active(self): def active(self):
pass pass
class SPATKCard(ATKCard):
def __init__(self, id, name):
super(SPATKCard, self).__init__(id, name)
def __repr__(self):
return self.name + "(SP.ATK)"
class SPDEFCard(DEFCard):
def __init__(self, id, name):
super(SPDEFCard, self).__init__(id, name)
def __repr__(self):
return self.name + "(SP.DEF)"
# Abstract Class Definition # Abstract Class Definition
class Attack(ATKCard): class Attack(ATKCard):
def __init__(self): def __init__(self):
super(Attack, self).__init__(1 ,"攻擊") super(Attack, self).__init__(1 ,"攻擊")
self.damage = 2 self.damage = 2
self.text = "可悲垃圾{}打了{}2" self.text = "可悲垃圾{}打了{}{}"
def active(self, cur, ene): def active(self, cur, ene):
self.texts = [cur.name, ene.name] self.texts = [cur.name, ene.name, self.damage]
ene.inc_hp(0-self.damage) if not ene.inc_hp(0-self.damage):
print(self.text.format(*self.texts)) print(self.text.format(*self.texts))
class Defend(DEFCard): class Defend(DEFCard):
def __init__(self): def __init__(self):
@ -94,12 +98,12 @@ class Suprise(ATKCard):
def __init__(self): def __init__(self):
super(Suprise, self).__init__(6 ,"奇襲") super(Suprise, self).__init__(6 ,"奇襲")
self.damage = 1 self.damage = 1
self.text = "{}攻擊{}1,並使其掉落了一張{}" self.text = "{}攻擊{}{},並使其掉落了一張{}"
def active(self, cur, ene): def active(self, cur, ene):
card = ene.drop() card = ene.drop()
self.texts = [cur.name, ene.name] self.texts = [cur.name, ene.name, self.damage]
if not card: if not card:
self.text = "{}攻擊{}1" self.text = "{}攻擊{}{}"
else: else:
self.texts.append(card) self.texts.append(card)
ene.inc_hp(0-self.damage) ene.inc_hp(0-self.damage)
@ -131,7 +135,6 @@ class Plan(OtherCard):
except: except:
pass pass
class Sweep(ATKCard): class Sweep(ATKCard):
def __init__(self): def __init__(self):
super(Sweep, self).__init__(10 ,"掃射的啦") super(Sweep, self).__init__(10 ,"掃射的啦")
@ -179,25 +182,68 @@ class Frenzy(ATKCard):
def __init__(self): def __init__(self):
super(Frenzy, self).__init__(15, "星爆氣流斬") super(Frenzy, self).__init__(15, "星爆氣流斬")
self.damage = 3 self.damage = 3
self.text = "可悲垃圾{}打了{}3並回復了3" self.text = "可悲垃圾{}打了{}{}並回復了3"
def active(self, cur, ene): def active(self, cur, ene):
self.texts = [cur.name, ene.name] self.texts = [cur.name, ene.name, self.damage]
ene.inc_hp(0-self.damage) ene.inc_hp(0-self.damage)
cur.inc_hp(3) cur.inc_hp(3)
print(self.text.format(*self.texts)) print(self.text.format(*self.texts))
class Guo1(SPDEFCard):
def __init__(self):
super(Guo1, self).__init__(101, "空間之鍊(門)")
def passive(self, cur, ene, card):
print("無效敵方能力並將1張{}加入手中".format(card))
cur.get(card)
class Guo2(OtherCard):
def __init__(self):
super(Guo2, self).__init__(102, "空間之鍊(殼)")
def active(self, cur, ene):
print("下2個敵方的回合{}將不會受到傷害".format(cur.name))
cur.guard = 2
class Guo3(SPATKCard):
def __init__(self):
super(Guo3, self).__init__(103, "空間之鍊(滅)")
self.damage = 5
def active(self, cur, ene):
print("對敵方造成5點傷害並使敵方損失2張手牌")
ene.drop(2)
ene.inc_hp(0-self.damage)
class Rabbit1(SPATKCard):
def __init__(self):
super(Rabbit1, self).__init__(201, "科學無用論(高速砍擊)")
self.damage = 3
def active(self, cur, ene):
ene.inc_hp(0-self.damage)
print("優先於一切防禦能力的3點傷害攻擊")
class Rabbit2(OtherCard):
def __init__(self):
super(Rabbit2, self).__init__(202, "科學無用論(力量增幅)")
def active(self, cur, ene):
cur.boost = 3
print("下3個回合對敵方造成的傷害+1")
class Rabbit3(SPATKCard):
def __init__(self):
super(Rabbit3, self).__init__(203, "科學無用論(終焉一擊)")
self.damage = 5
def active(self, cur, ene):
ene.inc_hp(0-self.damage)
print("優先於一切防禦能力的5點傷害攻擊")
""" """
v 1 攻擊 對敵方造成兩點傷害 攻擊類卡片 101 空間之鍊()x2無效敵方能力並將1張相同卡牌加入手中 SPDEF
v 2 防禦 抵擋攻擊類卡片 防禦類卡片 102 空間之鍊()x2下2個敵方的回合不會受到傷害 OTHER
v 3 治癒 回復兩點生命 103 空間之鍊()x1對敵方造成5點傷害並使敵方損失2張手牌 SPATK
v 4 補給 抽取兩張手牌
v 5 強奪 從敵方手牌中隨機一張加入自己的手牌 攻擊類卡片 201 科學無用論(高速砍擊)x3優先於一切防禦能力的3點傷害攻擊 SPATK
v 6 奇襲 對敵方造成一點傷害並使其隨機損失一張手牌 攻擊類卡片 202 科學無用論(力量增幅)x3下3個回合對敵方造成的傷害+1 OTHER
v 8 洞悉 抵擋攻擊類卡片並抽取一張(2?)手牌抵擋強奪的效果 防禦類卡片 203 科學無用論(終焉一擊)x1優先於一切防禦能力的5點傷害攻擊 SPATK
x 9 妙策 從牌庫中隨機挑出三張卡片選擇一張加入手牌
v 10 掃射 對敵方造成零五點傷害 攻擊類卡片
v 11 加護 回復三點生命並解除中毒
v 12 劇毒 使敵方中毒每個回合玩家會損失一點生命
v 14 反制 抵擋攻擊類卡片並反彈其傷害和效果 防禦類卡片
v 15 狂亂 回復三點生命並對敵方造成三點傷害 攻擊類卡片
""" """

View File

@ -1,4 +1,8 @@
Deck = [ Deck = [
[1, 2, 3] * 7 + [4, 5, 6] * 4 + [8, 9, 10, 11] * 2 + [12, 14, 15], [1, 2]*7 + [3, 4, 5, 6]*5 + [8, 9]*3 + [101, 102]*2 + [10, 11, 12, 14, 15, 103],
[1, 2, 3] * 7 + [4, 5, 6] * 4 + [8, 9, 10, 11] * 2 + [12, 14, 15] [1,]*10 + [2,8]*4 + [3,4,15, 201, 202]*3 + [5,]*5 + [6,]*9 + [9,]*2 + [203,]
]
HP = [
15, 12,
] ]

View File

@ -15,6 +15,13 @@ cards = {
14: Counter, 14: Counter,
15: Frenzy, 15: Frenzy,
101: Guo1,
102: Guo2,
103: Guo3,
201: Rabbit1,
202: Rabbit2,
203: Rabbit3,
} }
def DeckGen(card_ids): def DeckGen(card_ids):
deck = [] deck = []

12
Game.py
View File

@ -35,11 +35,14 @@ class Game:
try: try:
card = self.first.hand[int(use)] card = self.first.hand[int(use)]
if isinstance(card, Card.ATKCard): if isinstance(card, Card.ATKCard):
# Defence Handle # Defense Handle
if self.second.defend(card, self.first): if self.second.defend(card, self.first):
print("防禦成功~") print("防禦成功~")
self.first.hand.remove(card) self.first.hand.remove(card)
break break
if self.first.boost > 0 and not isinstance(card, Card.Rob):
self.first.hand[int(use)].damage += 1
print("傷害將會+1效果持續{}回合".format(self.first.boost))
elif isinstance(card, Card.DEFCard): elif isinstance(card, Card.DEFCard):
print("防禦類卡片無法主動打出") print("防禦類卡片無法主動打出")
continue continue
@ -51,6 +54,13 @@ class Game:
print("請輸入數字") print("請輸入數字")
self.first, self.second = self.second, self.first self.first, self.second = self.second, self.first
# Player Ability Handling
if isinstance(self.first, Player.Keieit):
self.first.guard -= 1
if isinstance(self.first, Player.Rabbit):
self.first.boost -= 1
self.end() self.end()
def end(self): def end(self):
winner = self.second if self.first.hp <= 0 else self.first winner = self.second if self.first.hp <= 0 else self.first

View File

@ -1,16 +1,21 @@
from Data import Deck from Data import *
from DeckGen import CardGen from DeckGen import CardGen
from Card import DEFCard from Card import DEFCard, SPATKCard, SPDEFCard, Rabbit1, Rabbit3
from random import choice from random import choice, shuffle
class Player: class Player:
def __init__(self, name, deck): def __init__(self, name, deck, hp):
self.hp = 15 self.hp = hp
self.name = name self.name = name
self.deck = deck[:] self.deck = deck[:]
shuffle(self.deck)
self.hand = [] self.hand = []
self.poison = 0 self.poison = 0
self.guard = 0
self.boost = 0
def __repr__(self): def __repr__(self):
return self.name + "(HP: " + str(self.hp) + ", 手牌: " + str(len(self.hand)) + ")" return self.name + "(HP: " + str(self.hp) + ", 手牌: " + str(len(self.hand)) + ", 牌庫: " + str(len(self.deck)) + ")"
def draw(self, num=1): def draw(self, num=1):
if not self.deck: if not self.deck:
return False return False
@ -18,19 +23,38 @@ class Player:
self.hand.append(CardGen(self.deck.pop(0))) self.hand.append(CardGen(self.deck.pop(0)))
return self.hand[-1] return self.hand[-1]
def inc_hp(self, hp): def inc_hp(self, hp):
self.hp += hp if self.guard > 0 and hp < 0:
print("{}{}回合內不會受到傷害".format(self.name, self.guard))
return True
else:
self.hp += hp
def get(self, card): def get(self, card):
self.hand.append(card) self.hand.append(card)
def drop(self): def drop(self, num=1):
if not self.hand: if not self.hand:
return False return False
card = choice(self.hand) if num == 1:
self.hand.remove(card) card = choice(self.hand)
return card self.hand.remove(card)
return card
else:
l = []
for _ in range(num):
card = choice(self.hand)
l.append(card)
self.hand.remove(card)
if not self.hand:
break
return l
def defend(self, use_card, ene): def defend(self, use_card, ene):
print("對手使用了{}".format(use_card)) print("對手使用了{}".format(use_card))
def_cards = list(filter(lambda x: True if isinstance(x, DEFCard) else False, self.hand)) def_cards = []
if isinstance(use_card, SPATKCard):
if not isinstance(use_card, (Rabbit1, Rabbit3)):
def_cards = list(filter(lambda x: True if isinstance(x, SPDEFCard) else False, self.hand))
else:
def_cards = list(filter(lambda x: True if isinstance(x, DEFCard) else False, self.hand))
if not def_cards: if not def_cards:
return False return False
for i, card in enumerate(def_cards): for i, card in enumerate(def_cards):
@ -42,14 +66,16 @@ class Player:
self.hand.remove(card) self.hand.remove(card)
return True return True
except Exception as e: except Exception as e:
template = "An exception of type {0} occurred. Arguments:\n{1!r}" #template = "An exception of type {0} occurred. Arguments:\n{1!r}"
message = template.format(type(e).__name__, e.args) #message = template.format(type(e).__name__, e.args)
print(message) #print(message)
return False return False
class Keieit(Player): class Keieit(Player):
def __init__(self): def __init__(self):
super(Keieit, self).__init__("圭月", Deck[0]) super(Keieit, self).__init__("圭月", Deck[0], HP[0])
self.guard = 0
class Rabbit(Player): class Rabbit(Player):
def __init__(self): def __init__(self):
super(Rabbit, self).__init__("小兔", Deck[1]) super(Rabbit, self).__init__("小兔", Deck[1], HP[1])