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

114
Card.py
View File

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

View File

@ -1,4 +1,8 @@
Deck = [
[1, 2, 3] * 7 + [4, 5, 6] * 4 + [8, 9, 10, 11] * 2 + [12, 14, 15],
[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,]*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,
15: Frenzy,
101: Guo1,
102: Guo2,
103: Guo3,
201: Rabbit1,
202: Rabbit2,
203: Rabbit3,
}
def DeckGen(card_ids):
deck = []

12
Game.py
View File

@ -35,11 +35,14 @@ class Game:
try:
card = self.first.hand[int(use)]
if isinstance(card, Card.ATKCard):
# Defence Handle
# Defense Handle
if self.second.defend(card, self.first):
print("防禦成功~")
self.first.hand.remove(card)
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):
print("防禦類卡片無法主動打出")
continue
@ -51,6 +54,13 @@ class Game:
print("請輸入數字")
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()
def end(self):
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 Card import DEFCard
from random import choice
from Card import DEFCard, SPATKCard, SPDEFCard, Rabbit1, Rabbit3
from random import choice, shuffle
class Player:
def __init__(self, name, deck):
self.hp = 15
def __init__(self, name, deck, hp):
self.hp = hp
self.name = name
self.deck = deck[:]
shuffle(self.deck)
self.hand = []
self.poison = 0
self.guard = 0
self.boost = 0
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):
if not self.deck:
return False
@ -18,18 +23,37 @@ class Player:
self.hand.append(CardGen(self.deck.pop(0)))
return self.hand[-1]
def inc_hp(self, hp):
if self.guard > 0 and hp < 0:
print("{}{}回合內不會受到傷害".format(self.name, self.guard))
return True
else:
self.hp += hp
def get(self, card):
self.hand.append(card)
def drop(self):
def drop(self, num=1):
if not self.hand:
return False
if num == 1:
card = choice(self.hand)
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):
print("對手使用了{}".format(use_card))
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:
return False
@ -42,14 +66,16 @@ class Player:
self.hand.remove(card)
return True
except Exception as e:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
message = template.format(type(e).__name__, e.args)
print(message)
#template = "An exception of type {0} occurred. Arguments:\n{1!r}"
#message = template.format(type(e).__name__, e.args)
#print(message)
return False
class Keieit(Player):
def __init__(self):
super(Keieit, self).__init__("圭月", Deck[0])
super(Keieit, self).__init__("圭月", Deck[0], HP[0])
self.guard = 0
class Rabbit(Player):
def __init__(self):
super(Rabbit, self).__init__("小兔", Deck[1])
super(Rabbit, self).__init__("小兔", Deck[1], HP[1])