2015-10-27 2 views
1

Я новичок в ООП и занимаюсь составлением немного более сложных программ, использующих различные классы и реализующие принципы, такие как Наследование. Я создал симуляцию 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() 
+1

примечание: вы вопрос помечен 'питон-3.x' но вы используя метаклассы 'python-2.x'-style. new: 'class RacquetSport (object, metaclass = ABCMeta):' (вы можете опустить 'object' ...). –

+0

Спасибо! Я сделаю это изменение. – flybonzai

+3

Вы писали: «Моя проблема в том, что мне кажется, что моя функция play_game не срабатывает правильно», но нигде в коде вы не называете 'play_game'. Почему вы думаете, что это называется? –

ответ

1

Ваша первая проблема в том, что вы никогда не звоните play_game. Я предполагаю, что вы собираетесь его работать так:

if __name__ == '__main__': 
    stats = SimStats() 
    for x in range(1, 11): 
     game = PingPong(.5, .5) 
     game.play_game() 
     stats.update(game) 
    stats.print_results() 

Далее, у вас есть ошибка, которая приведет всю игру длиться вечно. Посмотрите на эти строки:

def game_over(self): 
    return self.player1.get_score == 11 or \ 
      self.player2.get_score == 11 

get_score является функцией, так что вам нужно вызова это:

def game_over(self): 
    return self.player1.get_score() == 11 or \ 
      self.player2.get_score() == 11 
+0

Это исправлено, спасибо! – flybonzai

Смежные вопросы