Arafat Khan
Arafat Khan

Reputation: 857

Problems with switching players and keeping track of each of their score when making a Cricket game

I want to create a very simple text-based Cricket game. But I am quite stuck.

from random import randint
class Player():
    def __init__(self):
        pass

    def run(self, player, score):
        # some code that will take a player and a score and associate that
        # score with the player and store it (in a dictionary)

    def switch(self, player):
        # some code that will take a player name and change the current 
        # batsmen to the next one, for e.g this should change "a" to "b" or 
        # vice versa but not "c"

team_players = ["a", "b", "c"]

player = Player()

position = 0
run = randint(0,6)
current_batsman = team_players[position]

if run%2 == 0: # which means run is even
    player.run(current_batsman, run) # sending the current player and their run
else: # if the run is odd
    player.run(current_batsman, run) # still doing the same stuff as before but...
    player.switch(current_batsman) # the current batsman should now be switched

Maybe tweaking position in the Player class somehow might help.

I hope my code explains my problem thoroughly. And by the way, in Cricket scores are called run and if a player (batsman) makes an odd run (1, 3, 5) the next batsman comes to play, and there are only two batsmen in the field until one gets out but I want my game to be really simple, for now. Any help is greatly appreciated. Thanks.

Upvotes: 0

Views: 113

Answers (1)

furas
furas

Reputation: 142982

I don't know Cricket's rules but in class Player I would keep player's name and his score. It could have also function run() which adds random value to his score (or create method with parameter - value which you want to add to score)

class Player():

    def __init__(self, name):
        self.name = name
        self.score = 0

    def run(self):
        self.score += random.randint(0, 6)

    def __str__(self):
        return "{} (score: {})".format(self.name, self.score)

I also added __str__ to easily display player.

Next I would create class Team which keeps all players, keep information which player is current batsman, switch batsman, and use run() for current batsman

class Team():

    def __init__(self, players):
        self.players = players
        self.current_batsman = 0
        self.current_run = 0

    def set_next_batsman(self):
        self.current_batsman += 1
        if self.current_batsman >= len(self.players):
            self.current_batsman = 0

    def get_current_batsman(self):
        return self.players[self.current_batsman]

    def run(self):
        self.players[self.current_batsman].run()

        if self.current_run % 2 != 0:
            self.set_next_batsman()

        self.current_run += 1

    def __str__(self):
        return "Player: " + ", ".join(str(p) for p in self.players)

    def total_score(self):
        return sum(p.score for p in self.players)

And then two teams can play:

team1 = Team( [Player("a"), Player("b"), Player("c")] )
team2 = Team( [Player("x"), Player("y"), Player("z")] )

print('Team1:', team1)
print('Team2:', team2)

for number in range(1, 5):
    print('Round:', number)
    print('Team1 current batsman:', team1.get_current_batsman())
    team1.run()
    print('Team2 current batsman:', team2.get_current_batsman())
    team2.run()

print('Team1:', team1)
print('Team2:', team2)

print('Team1 total score:', team1.total_score())
print('Team2 total score:', team2.total_score())

Upvotes: 2

Related Questions