From 046ddb0657b24ce690ef9114f915d9ca7cec016e Mon Sep 17 00:00:00 2001 From: Jerry Wu Date: Sun, 26 Aug 2018 19:07:59 +0800 Subject: [PATCH] First comit --- Card.py | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Data.py | 4 ++ DeckGen.py | 24 ++++++++++++ Game.py | 40 +++++++++++++++++++ Player.py | 50 ++++++++++++++++++++++++ README.md | 0 6 files changed, 228 insertions(+) create mode 100644 Card.py create mode 100644 Data.py create mode 100644 DeckGen.py create mode 100644 Game.py create mode 100644 Player.py create mode 100644 README.md diff --git a/Card.py b/Card.py new file mode 100644 index 0000000..02c1b18 --- /dev/null +++ b/Card.py @@ -0,0 +1,110 @@ +class Card: + ATK = 0 + DEF = 1 + OTHER = 2 + SP_ATK = 3 + SP_DEF = 4 + SP_OTHER = 5 + + def __init__(self, cardtype): + self.type = cardtype + + +class ATKCard(Card): + def __init__(self, id, name): + super(ATKCard, self).__init__(Card.ATK) + self.id = id + self.name = name + self.damage = 0 + self.text = "" + self.texts = [] + def __repr__(self): + #return str(self.id) + ". " + self.name + "(ATK)" + return self.name + "(ATK)" + def active(self, cur, ene): + pass + +class DEFCard(Card): + def __init__(self, id, name): + super(DEFCard, self).__init__(Card.DEF) + self.id = id + self.name = name + def __repr__(self): + return self.name + "(DEF)" + def passive(self): + pass + + +class OtherCard(Card): + def __init__(self, id, name): + super(OtherCard, self).__init__(Card.OTHER) + self.id = id + self.name = name + def __repr__(self): + return self.name + "(Other)" + def active(self): + pass + +# Abstract Class Definition + +class Attack(ATKCard): + def __init__(self): + super(Attack, self).__init__(1 ,"攻擊") + self.damage = 2 + self.text = "可悲垃圾{}打了{}2" + def active(self, cur, ene): + self.texts = [cur.name, ene.name] + ene.inc_hp(0-self.damage) + print(self.text.format(*self.texts)) + +class Defend(DEFCard): + def __init__(self): + super(Defend, self).__init__(2 ,"防禦") + def passive(self): + print("防禦成功~") + +class Heal(OtherCard): + def __init__(self): + super(Heal, self).__init__(3 ,"治癒") + def active(self, cur, ene): + cur.inc_hp(2) + +class Supply(OtherCard): + def __init__(self): + super(Supply, self).__init__(4 ,"補給") + def active(self, cur, ene): + cur.draw(2) + +class Rob(ATKCard): + def __init__(self): + super(Rob, self).__init__(5 ,"搶奪") + self.text = "{}從{}那搶走了{}" + def active(self, cur, ene): + self.texts = [cur.name, ene.name] + card = ene.drop() + cur.get(card) + self.texts.append(card) + + print(self.text.format(*self.texts)) + +class Bless(OtherCard): + def __init__(self): + super(Bless, self).__init__(11 ,"加護") + def active(self, cur, ene): + cur.inc_hp(3) + cur.poison = 0 +""" +v 1 攻擊 對敵方造成兩點傷害 攻擊類卡片 +x 2 防禦 抵擋攻擊類卡片 防禦類卡片 +v 3 治癒 回復兩點生命 +v 4 補給 抽取兩張手牌 +x 5 強奪 從敵方手牌中選擇一張加入自己的手牌 攻擊類卡片 +x 6 奇襲 對敵方造成一點傷害,並使其隨機損失一張手牌 攻擊類卡片 +x 8 洞悉 抵擋攻擊類卡片,並抽取一張手牌、抵擋強奪的效果 防禦類卡片 +x 9 妙策 從牌庫中隨機挑出三張卡片,選擇一張加入手牌 +v 10 掃射 對敵方造成零~五點傷害 攻擊類卡片 +v 11 加護 回復三點生命,並解除中毒 +v 12 劇毒 使敵方中毒:每個回合,玩家會損失一點生命 +x 14 反制 抵擋攻擊類卡片,並反彈其傷害和效果 防禦類卡片 +x 15 狂亂 回復三點生命,並對敵方造成三點傷害 攻擊類卡片 +""" \ No newline at end of file diff --git a/Data.py b/Data.py new file mode 100644 index 0000000..cea5c8e --- /dev/null +++ b/Data.py @@ -0,0 +1,4 @@ +Deck = [ + [1, 2, 3, 4, 5] * 10, + [1] * 10 +] \ No newline at end of file diff --git a/DeckGen.py b/DeckGen.py new file mode 100644 index 0000000..5c9b60d --- /dev/null +++ b/DeckGen.py @@ -0,0 +1,24 @@ +from Card import * +cards = { + 1: Attack, + 2: Defend, + 3: Heal, + 4: Supply, + 5: Rob, + 6: Card, + 7: Card, + 8: Card, + 9: Card, + 10: Card, + 11: Bless, + 12: Card, +} +def DeckGen(card_ids): + deck = [] + for card_id in card_ids: + deck.append(cards[card_id]()) + return deck + +def CardGen(card_id): + return cards[card_id]() + diff --git a/Game.py b/Game.py new file mode 100644 index 0000000..430e765 --- /dev/null +++ b/Game.py @@ -0,0 +1,40 @@ +import Player, Card + +class Game: + def __init__(self, first, second): + self.first, self.second = first, second + self.first.draw(3) + self.second.draw(3) + def main(self): + while self.first.hp > 0 and self.second.hp > 0: + print("輪到{}了\n{}抽到了{}\n這是{}現在的手牌:".format(self.first.name, self.first.name, self.first.draw(), self.first.name)) + for i, card in enumerate(self.first.hand): + print(i, ": ", card, sep="") + + # Use Cards + while 1: + use = input("請出牌的啦") + try: + card = self.first.hand[int(use)] + if isinstance(card, Card.ATKCard): + # Defence Handle + if self.second.defend(card): + break + elif isinstance(card, Card.DEFCard): + print("防禦類卡片無法主動打出") + continue + self.first.hand.pop(int(use)).active(self.first, self.second) + break + except IndexError: + print("索引錯誤") + except ValueError: + print("請輸入數字") + + self.first, self.second = self.second, self.first + self.end() + def end(self): + winner = self.second if self.first.hp <= 0 else self.first + print("{}贏了".format(winner.name)) + +game = Game(Player.Keieit(), Player.Rabbit()) +game.main() \ No newline at end of file diff --git a/Player.py b/Player.py new file mode 100644 index 0000000..9529117 --- /dev/null +++ b/Player.py @@ -0,0 +1,50 @@ +from Data import Deck +from DeckGen import CardGen +from Card import DEFCard +from random import choice +class Player: + def __init__(self, name, deck): + self.hp = 15 + self.name = name + self.deck = deck[:] + self.hand = [] + self.poison = 0 + def draw(self, num=1): + if not self.deck: + return False + for _ in range(num): + self.hand.append(CardGen(self.deck.pop(0))) + return self.hand[-1] + def inc_hp(self, hp): + self.hp += hp + def get(self, card): + self.hand.append(card) + def drop(self): + if not self.hand: + return False + card = choice(self.hand) + self.hand.remove(card) + return card + def defend(self, card): + + print("對手使用了{}".format(card)) + def_cards = list(filter(lambda x: True if isinstance(x, DEFCard) else False, self.hand)) + if not def_cards: + return False + for i, card in enumerate(def_cards): + print(i, ": ", card, sep="") + try: + use = input() + card = def_cards[int(use)] + card.passive() + self.hand.remove(card) + return True + except: + return False +class Keieit(Player): + def __init__(self): + super(Keieit, self).__init__("圭月", Deck[0]) + +class Rabbit(Player): + def __init__(self): + super(Rabbit, self).__init__("小兔", Deck[1]) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29