Advertisement
Tyler_Elric

BattleMachine.py

Apr 27th, 2013
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.43 KB | None | 0 0
  1. from statemachine import Machine, BluePrint, Node
  2. from random import randrange, choice, shuffle
  3.  
  4. class Move(object):
  5.     def __init__(self,name,power):
  6.         self.name,self.power=name,power
  7.     def apply(self,target):
  8.         target.hp -= self.power
  9.     def __str__(self):return self.name
  10.  
  11. class Monster(object):
  12.     def __init__(self,species):
  13.         self.species = species
  14.         self.moves = [Move('kick',3),Move('punch',2),Move("heal",-1)]
  15.         self.hp,self.speed = 10,randrange(1,20)
  16.  
  17. class Card(object):
  18.     name="Player-"
  19.     def __init__(self):
  20.         self.roster = []
  21.         self.inventory = {}
  22.     def __str__(self):return self.name
  23.  
  24. class Battle(object):
  25.     def __init__(self):
  26.         self.players = []
  27.         self.rounds = []
  28.  
  29. class Round(object):
  30.     def __init__(self,players):
  31.         self.moves = {}
  32.         sort_by_speed=lambda player:-player.roster[0].speed
  33.         self.players = sorted(players,key=sort_by_speed)
  34.     @property
  35.     def current_player(self):
  36.         return [p for p in self.players if p not in self.moves][0]
  37.  
  38. class BattleMachine(Machine):
  39.     def __init__(self,*a,**b):
  40.         super().__init__(*a,**b)
  41.         self.battle = Battle()
  42.         self.pending = None
  43.     def __call__(self):super().__call__(self.battle)
  44.  
  45. class CreatePlayer(Node):
  46.     def apply(self,battle):
  47.         p = Card()
  48.         p.roster = [Monster(None) for i in range(randrange(1,6))]
  49.         p.name += str(len(battle.players)+1)
  50.         battle.players.append(p)
  51.  
  52. class EnoughPlayers(Node):
  53.     def apply(self,battle):
  54.         return len(battle.players)>3
  55.  
  56. class NeedMoreMoves(Node):
  57.     resume=True
  58.     def apply(self,battle):
  59.         return len(battle.rounds[-1].moves)<len(battle.rounds[-1].players)
  60.  
  61. class GetMove(Node):
  62.     def apply(self,battle):
  63.         player = battle.rounds[-1].current_player
  64.         moves = player.roster[0].moves
  65.         m = choice(moves+[None]*3)
  66.         if m is not None:
  67.             t=[p for p in battle.rounds[-1].players if p is not player]
  68.             shuffle(t)
  69.             battle.rounds[-1].moves[player]=(m,t)
  70.  
  71. class ApplyMoves(Node):
  72.     def apply(self,battle):
  73.         round = battle.rounds[-1]
  74.         for player,(move,targets) in round.moves.items():
  75.             if len(player.roster)<1:
  76.                 print(player.name,"has no pokemon left to fight.")
  77.             targets = [t for t in targets if len(t.roster)>0]
  78.             if len(targets)<1:
  79.                 print(player.name,"failed.")
  80.                 continue
  81.             target=targets[0]
  82.             move.apply(target.roster[0])
  83.             if target.roster[0].hp <1:
  84.                 print(target.name,"lost a pokemon.")
  85.                 target.roster = target.roster[1:]
  86.                 if len(target.roster)<1:
  87.                     print(target.name,"is out of pokemon.")
  88.  
  89. class GameFinished(Node):
  90.     def apply(self,battle):
  91.         p=[p for p in battle.players if len(p.roster)>0]
  92.         return len(p)<2
  93.  
  94. class NextRound(Node):
  95.     resume=True
  96.     def apply(self,battle):
  97.         p=[p for p in battle.players if len(p.roster)>0]
  98.         battle.rounds.append(Round(p))
  99.  
  100. class FinalizeGame(Node):
  101.     def apply(self,battle):
  102.         print("Game is over!")
  103.         victors = [p for p in battle.players if len(p.roster)>0]
  104.         if len(victors)<1:
  105.             print("There are no winners.")
  106.         if len(victors)>1:
  107.             print("The winners are:",*map(str,victors))
  108.         else:
  109.             print("The winner is:",victors[0].name)
  110.  
  111. class BattleScheme(BluePrint):
  112.     machine = BattleMachine
  113.     components = [
  114.         (CreatePlayer,1), #0
  115.         (EnoughPlayers,[0,2]),#1
  116.         (NextRound,3),#2
  117.         (NeedMoreMoves,[5,4]),#3
  118.         (GetMove,3),#4
  119.         (ApplyMoves,6),#5
  120.         (GameFinished,[2,7]),#6
  121.         (FinalizeGame,-1)#7
  122.     ]
  123.  
  124. for i in range(10):
  125.     print("Battle",i+1)
  126.     with BattleScheme.build() as machine:
  127.             while machine.state>=0:
  128.                 machine()
  129.     print("="*80,end='\n'*2)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement