Ejemplo n.º 1
0
class ResistanceGame():

    def setPlanList(self):
        # missionList returns the default list of missions for the game 
        # resistance. missions are represented as:
        # (number of players,number of fails required for sabotage)
        n = len(self.players)
        if n in [5,6,7,8,9,10]:
            planList = {
                5 :[(2,1),(3,1),(2,1),(3,1),(3,1)],
                6 :[(2,1),(3,1),(4,1),(3,1),(4,1)],
                7 :[(2,1),(3,1),(3,1),(4,2),(4,1)],
                8 :[(3,1),(4,1),(4,1),(5,2),(5,1)],
                9 :[(3,1),(4,1),(4,1),(5,2),(5,1)],
                10:[(3,1),(4,1),(4,1),(5,2),(5,1)]
                }[n]
        else:
            plan = []
            print "Error: Expected a value in [5,10]. for n in missionList function of Class ResistanceGame Given: {}".format(n)
        self.plans = planList
        
    def getPlan(self,n):
        return self.plans[n]

    def getRandomPlayer(self):
        # getRandomPlayer generates a random number then uses that random 
        # number to select and return a player from the playerList. This can be
        # used to, for example, set the initial mission leader.
        nPlayers = len(self.players)
        return self.players[int(random()*nPlayers)]

    def getRandomPlayerIndex(self):
        nPlayers = len(self.players)
        return int(random()*nPlayers)

    def getLeader(self):
        return self.players[self.leaderIndex]

    def incrementLeaderCounter(self):
        nPlayers = len(self.players)
        self.leaderIndex = (self.leaderIndex+1)%nPlayers

    def setTeams(self):
        #setSpies sets the spies by randomly choosing from the players in 
        # PlayerList
        nPlayers = len(self.players)
        nSpies   = (nPlayers-1)/3+1 # equivalent to ceil((n+2)/3)
        spyIndices = sample(range(nPlayers),nSpies) 
        

        self.spies = [self.players[i] for i in spyIndices]
        for spy in self.spies: spy.setRole("spy")

        self.resistance = [self.players[i] for i in range(nPlayers) if not(i in spyIndices)]
        for resister in self.resistance: resister.setRole("resistance")
        
    def getSpies(self):
        return self.spies
    
    def getResistance(self):
        return self.resistance



    def __init__(self,playerList):
        self.players = playerList
        self.setPlanList()
        self.setTeams()
        #game is started by random player
        self.leaderIndex = self.getRandomPlayerIndex()
        self.nSuccess =0
        self.nFail = 0
        self.missionCounter=0
        self.gameState = GameState(playerList)
        
        




    def getResult(self):
        nSuccess = self.nSuccess
        nFail = self.nFail
        if (nSuccess==3):
            resistance = self.getResistance()
            names = [player.getName() for player in resistance]
            print "Resistance wins!\nCongratulations to: ",
            return names
        if (nFail==3):
            spies = self.getSpies()
            names = [player.getName() for player in spies]
            print "Spies win!\nCongratulations to: ",
            return names
        else:
            return "Game does not appear to be over. Current state is:\n Resistance:{} \tSpies:{}".format(nSuccess,nFail)


        

    def round(self):
        nPlayers = len(self.players)
        voteCounter = 0
        #set up the mission
        plan=self.getPlan(self.missionCounter)
        for player in self.players:
            player.setState(self.gameState)
        while voteCounter<5:
            #maybe players communicate somehow 
            #leader proposes a mission
           
            leader = self.getLeader()
            team = leader.proposeTeam(plan,self.players)
            #Display option:
            #print "proposal #{}:".format(voteCounter+1), " ".join([player.name for player in team])

            #every player votes
            votes = [player.vote(team) for player in self.players]
            nApprove = sum(1 for vote in votes if vote)
            nReject = sum(1 for vote in votes if not(vote))
            #leader counter increments
            self.incrementLeaderCounter()
        
            #if mission is approved
            if nApprove>nReject:
                # make a mission for the proposed team
                thisMission = Mission(team,plan)
                # run the mission
                thisMission.run()
                # add it to the game state's mission list
                
                self.gameState.addMission(thisMission)
                self.missionCounter+=1
                return
            else:
            #  increment voteCounter
                voteCounter+=1
            if voteCounter>=5:
                # Missions fail after 5 tries
                thisMission = Mission([],plan)
                this.Mission.result='fail'
                self.gameState.addMission(thisMission)
                return

    def play(self):
        for i in range(5):
#            print "\n=========================="
#            print "beginning round {}".format(i+1)
            self.round()     
#            print "\n=========================="
            if self.gameState.isOver():
                return self.gameState