Я новичок в ООП и занимаюсь составлением немного более сложных программ, использующих различные классы и реализующие принципы, такие как Наследование. Я создал симуляцию Ping-Pong, у которой есть класс Player, который содержит вероятность того, что игрок выиграет свою подачу. Тогда у меня есть класс PingPong, который является подклассом суперкласса RacquetSports. Каждый экземпляр представляет собой единую игру с возможностью изменять сервер и записывать, кто выиграл, и является ли это закрытием. Наконец, у меня есть класс SimStats, целью которого является запись статистики по «n» числу игр.Моделирование пинг-понга не корректно запускает функцию
Моя проблема в том, что мне кажется, что моя функция play_game
неправильно срабатывает, когда я размещаю заявление о печати там, где он никогда не запускается. Мой текущий результат при запуске всей программы заключается в том, что Player1 имеет 10 побед без локаутов, а Player2 имеет нулевое значение.
Наконец, любые предложения по улучшению практики ОО также будут оценены. Вот мой игрок Класс:
from random import random
class Player(object):
def __init__(self, prob_win):
self.prob = prob_win
self.points = 0
def wins_serve(self):
return self.prob >= random()
def add_point(self):
self.points += 1
def get_score(self):
return self.points
Мой RacquetSports класс:
from abc import ABCMeta, abstractmethod
from player import Player
class RacquetSport(object):
__metaclass__ = ABCMeta
def __init__(self, prob1, prob2):
self.player1 = Player(prob1)
self.player2 = Player(prob2)
self.server = self.player1
def play_game(self):
while not self.game_over():
self.sim_point()
@abstractmethod
def type(self):
pass
def chg_server(self):
if self.server == self.player1:
self.server = self.player2
else:
self.server = self.player1
def sim_point(self):
if self.server.wins_serve():
self.server.add_point()
else:
self.chg_server()
@abstractmethod
def game_over(self):
pass
def get_scores(self):
return self.player1.get_score(), \
self.player2.get_score()
def return_stats(self):
p1_score, p2_score = self.get_scores()
print(p1_score, p2_score)
won = 'p1'
if p2_score > p1_score:
won = 'p2'
return won, self.__shutout(p1_score, p2_score)
@staticmethod
@abstractmethod
def __shutout(score1, score2):
pass
Мои PingPong и SimStats классы, а также мой код вызова:
from racquet import RacquetSport
class PingPong(RacquetSport):
def type(self):
return 'Ping Pong'
def game_over(self):
return self.player1.get_score == 11 or \
self.player2.get_score == 11
@staticmethod
def __shutout(score1, score2):
return abs(score1 - score2) == 11
class SimStats(object):
def __init__(self):
# First field is games won, second is shutouts.
self.gms_won_p1 = [0] * 2
self.gms_won_p2 = [0] * 2
def update(self, game):
won, shutout = game.return_stats()
if won == 'p1':
self.gms_won_p1[0] += 1
if shutout:
self.gms_won_p1[1] += 1
else:
self.gms_won_p2[0] += 1
if shutout:
self.gms_won_p2[1] += 1
def print_results(self):
tot_games = self.gms_won_p1 + self.gms_won_p2
print('Wins for Player 1 = {} Shutouts = {}\n'
'Wins for Player 2 = {} Shutouts = {}'.format(*tot_games))
if __name__ == '__main__':
stats = SimStats()
for x in range(1, 11):
game = PingPong(.5, .5)
stats.update(game)
stats.print_results()
примечание: вы вопрос помечен 'питон-3.x' но вы используя метаклассы 'python-2.x'-style. new: 'class RacquetSport (object, metaclass = ABCMeta):' (вы можете опустить 'object' ...). –
Спасибо! Я сделаю это изменение. – flybonzai
Вы писали: «Моя проблема в том, что мне кажется, что моя функция play_game не срабатывает правильно», но нигде в коде вы не называете 'play_game'. Почему вы думаете, что это называется? –