Commit d84cb4d9 by 최애림

INNODEV-2921 Seminar-프로그래밍 연습_야구 게임 객체3 만들어보기

- 선수의 경기 결과를 열거하는 PlayerBatting ENUM 클래스 생성
-Team 클래스의 practice_game 메소드
	- 투수의 아웃률, 타자의 안타율을 가중치를 두어
random.choices함수로 경기 결과를 산출
	- 타자가 이긴 경우, 각 안타횟수를 가중치를
두어 random.choices함수로 안타 결과를 산출
- Pitcher 클래스의 update_records 메소드
	- 경기 결과를 PlayerBatting ENUM 클래스 객체로 받아 전적을 업데이트
- Fielder 클래스의 update_records 메소드
	 - 경기 결과를 PlayerBatting ENUM 클래스 객체로 받아 전적을 업데이트
parent 3165169d
...@@ -10,6 +10,18 @@ class PlayerType(Enum): ...@@ -10,6 +10,18 @@ class PlayerType(Enum):
FIELDER = 1 FIELDER = 1
PITCHER = 2 PITCHER = 2
class PlayerBatting(Enum):
"""
타석에 오른 선수가 취할 수 있는 액션을 열거형으로 나타냅니다.
"""
SINGLES = 1
DOUBLES = 2
TRIPLES = 3
HOMERUNS = 4
OUTS = 5
class Player(ABC): class Player(ABC):
""" """
선수 정보를 관리하는 클래스입니다. 선수 정보를 관리하는 클래스입니다.
...@@ -63,6 +75,13 @@ class Team: ...@@ -63,6 +75,13 @@ class Team:
self.player_pitcher = [] self.player_pitcher = []
self.player_fielder = [] self.player_fielder = []
def __str__(self):
"""
객체를 문자열로 반환합니다.
:return: '구단명(연고지)' 형태로 반환
"""
return f'{self.name}({self.location})'
def check_player(self): def check_player(self):
""" """
구단 내 선수 이름 목록을 반환합니다. 구단 내 선수 이름 목록을 반환합니다.
...@@ -100,13 +119,6 @@ class Team: ...@@ -100,13 +119,6 @@ class Team:
print(f'"{player_name}" 선수가 선수 명단에서 제거 되었습니다.') print(f'"{player_name}" 선수가 선수 명단에서 제거 되었습니다.')
def __str__(self):
"""
객체를 문자열로 반환합니다.
:return: '구단명(연고지)' 형태로 반환
"""
return f'{self.name}({self.location})'
def select_player(self, n_practice): def select_player(self, n_practice):
""" """
연습 게임 횟수에 따른 1군, 2군, 랜덤 투수/타자 선수들을 선발하여 출력합니다. 연습 게임 횟수에 따른 1군, 2군, 랜덤 투수/타자 선수들을 선발하여 출력합니다.
...@@ -134,23 +146,31 @@ class Team: ...@@ -134,23 +146,31 @@ class Team:
def practice_game(self, pitcher_name, fielder_name): def practice_game(self, pitcher_name, fielder_name):
""" """
투수 1명과, 타자 1명의 전적을 비교해 안타 여부를 가리는 연습 게임입니다. 투수 1명과, 타자 1명의 전적을 비교해 안타 여부를 가리는 연습 게임입니다.
투수의 피안타율과 타자의 안타율을 비교하여 높은 비율 쪽이 승리합니다. 투수의 피안타율과 타자의 안타율을 가중치로 두고 랜덤하게 승리할 선수를 고릅니다.
만약, 타자가 선택된다면 타자의 1루/2루/3루/홈런 출타 횟수을 가중치로 두고 랜덤하게 output을 고르게 됩니다.
:param pitcher_name: 투수 1명의 이름 :param pitcher_name: 투수 1명의 이름
:param fielder_name: 타자 1명의 이름 :param fielder_name: 타자 1명의 이름
:return: None :return: 연습 경기 결과(PlayerBatting Enum class)
""" """
practice_field_rate = [obj.opponent_batting_rate for obj in self.player_pitcher if obj.name == pitcher_name][0] practice_pit_rate = [player.out_rate for player in self.player_pitcher if player.name == pitcher_name][0]
print(f'{pitcher_name} 안타율: {practice_field_rate:.3f}')
practice_fielder = [player for player in self.player_fielder if player.name == fielder_name][0]
practice_field_rate = practice_fielder.batting_rate
practice_pit_rate = [obj.batting_rate for obj in self.player_fielder if obj.name == fielder_name][0] win_player = random.choices([PlayerType.PITCHER, PlayerType.FIELDER], weights=[practice_pit_rate, practice_field_rate], k=1)[0]
print(f'{fielder_name} 피안타율: {practice_pit_rate:.3f}')
if practice_pit_rate < practice_field_rate: if win_player == PlayerType.FIELDER:
print(f'{pitcher_name} 안타!') batting_li = [PlayerBatting.SINGLES, PlayerBatting.DOUBLES, PlayerBatting.TRIPLES, PlayerBatting.HOMERUNS]
elif practice_pit_rate > practice_field_rate: batting_n = [practice_fielder.n_singles, practice_fielder.n_doubles, practice_fielder.n_triples, practice_fielder.n_homeruns]
print(f'{fielder_name} 수비 성공!') output = random.choices(batting_li, weights=batting_n, k=1)[0]
if output.value < 4:
print(f'"{fielder_name}" {output.value}루타!')
else: else:
print('무승부!') print(f'"{fielder_name}" 홈런!!!!')
return output
else:
print(f'"{pitcher_name}" 수비 성공! "{fielder_name}" 아웃!')
return PlayerBatting.OUTS
class Fielder(Player): class Fielder(Player):
...@@ -178,20 +198,24 @@ class Fielder(Player): ...@@ -178,20 +198,24 @@ class Fielder(Player):
self.n_homeruns = n_homeruns self.n_homeruns = n_homeruns
self.batting_rate = sum([self.n_singles, self.n_doubles, self.n_triples, self.n_homeruns]) / self.match_n self.batting_rate = sum([self.n_singles, self.n_doubles, self.n_triples, self.n_homeruns]) / self.match_n
def update_records(self, new_singles, new_doubles, new_triples, new_homeruns): def update_records(self, game_output):
""" """
선수 정보를 업데이트합니다. 선수 정보를 업데이트합니다.
:param new_singles: 1루타 횟수 :param game_output: 경기 결과 객체(PlayerBatting Enum class)
:param new_doubles: 2루타 횟수
:param new_triples: 3루타 횟수
:param new_homeruns: 홈런 횟수
:return: None :return: None
""" """
self.n_singles += new_singles if game_output == PlayerBatting.SINGLES:
self.n_doubles += new_doubles self.n_singles += 1
self.n_triples += new_triples elif game_output == PlayerBatting.DOUBLES:
self.n_homeruns += new_homeruns self.n_doubles += 1
self.match_n += 9 elif game_output == PlayerBatting.TRIPLES:
self.n_triples += 1
elif game_output == PlayerBatting.HOMERUNS:
self.n_homeruns += 1
else:
pass
self.match_n += 1
self.batting_rate = sum([self.n_singles, self.n_doubles, self.n_triples, self.n_homeruns]) / self.match_n self.batting_rate = sum([self.n_singles, self.n_doubles, self.n_triples, self.n_homeruns]) / self.match_n
print(f'선수 정보가 업데이트 되었습니다. {self.batting_rate:.3f}') print(f'선수 정보가 업데이트 되었습니다. {self.batting_rate:.3f}')
...@@ -220,18 +244,21 @@ class Pitcher(Player): ...@@ -220,18 +244,21 @@ class Pitcher(Player):
super(Pitcher, self).__init__(name, num, age, height, weight, match_n=100) super(Pitcher, self).__init__(name, num, age, height, weight, match_n=100)
self.position = PlayerType.PITCHER self.position = PlayerType.PITCHER
self.n_outs = n_outs self.n_outs = n_outs
self.opponent_batting_rate = self.n_outs / self.match_n self.out_rate = self.n_outs / self.match_n
def update_records(self, new_outs): def update_records(self, game_output):
""" """
선수 정보를 업데이트합니다. 선수 정보를 업데이트합니다.
:param new_outs: 아웃 횟수 :param game_output: 경기 결과 객체(PlayerBatting Enum class)
:return: :return:
""" """
self.n_outs += new_outs if game_output == PlayerBatting.OUTS:
self.match_n += 81 self.n_outs += 1
self.opponent_batting_rate = self.n_outs / self.match_n else:
print(f'선수 정보가 업데이트 되었습니다. {self.opponent_batting_rate:.3f}') pass
self.match_n += 1
self.out_rate = self.n_outs / self.match_n
print(f'선수 정보가 업데이트 되었습니다. {self.out_rate:.3f}')
def __str__(self): def __str__(self):
...@@ -239,7 +266,7 @@ class Pitcher(Player): ...@@ -239,7 +266,7 @@ class Pitcher(Player):
객체를 문자열로 반환합니다. 객체를 문자열로 반환합니다.
:return: '선수 이름(등번호, 안타율)' 형태로 반환 :return: '선수 이름(등번호, 안타율)' 형태로 반환
""" """
return f'{self.name}({self.num}, {self.opponent_batting_rate:.3f})' return f'{self.name}({self.num}, {self.out_rate:.3f})'
...@@ -273,7 +300,7 @@ for idx in range(60): ...@@ -273,7 +300,7 @@ for idx in range(60):
else: else:
player = Fielder(*information[:-1]) player = Fielder(*information[:-1])
player.update_records(*[random.randint(0,3) for _ in range(4)]) # player.update_records(*[random.randint(0,3) for _ in range(4)])
team_kiwoom.add_player(player) team_kiwoom.add_player(player)
...@@ -281,7 +308,7 @@ for idx in range(60): ...@@ -281,7 +308,7 @@ for idx in range(60):
team_kiwoom.check_player() team_kiwoom.check_player()
# 선수 삭제 # 선수 삭제
team_kiwoom.remove_player('임병욱') # team_kiwoom.remove_player('임병욱')
# 명단 확인 # 명단 확인
pitcher, fielder = team_kiwoom.check_player() pitcher, fielder = team_kiwoom.check_player()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment