Commit 3165169d by 최애림

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

- Team클래스에 select_player 수정
	- 연습게임 횟수 파라미터 추가
	- 연습게임 횟수별로 아래의 선수를 선발하여 출력하도록 함
		- 1군 투수 1명, 타자 9명 선발
		- 2군 투수 1명, 타자 9명 선발
		- 랜덤 투수 1명, 타자 9명 선발
parent d28b6aa9
...@@ -5,7 +5,7 @@ from enum import Enum ...@@ -5,7 +5,7 @@ from enum import Enum
class PlayerType(Enum): class PlayerType(Enum):
""" """
투수와 타자를 열거형 클래스로 정의합니다. 선수의 타자/투수 여부를 열거형으로 나타냅니다.
""" """
FIELDER = 1 FIELDER = 1
PITCHER = 2 PITCHER = 2
...@@ -66,7 +66,7 @@ class Team: ...@@ -66,7 +66,7 @@ class Team:
def check_player(self): def check_player(self):
""" """
구단 내 선수 이름 목록을 반환합니다. 구단 내 선수 이름 목록을 반환합니다.
:return: 선수 이름 list :return: 선수 이름 목록
""" """
pitcher = [player.name for player in self.player_pitcher] pitcher = [player.name for player in self.player_pitcher]
fielder = [player.name for player in self.player_fielder] fielder = [player.name for player in self.player_fielder]
...@@ -87,7 +87,7 @@ class Team: ...@@ -87,7 +87,7 @@ class Team:
def remove_player(self, player_name): def remove_player(self, player_name):
""" """
구단 내 선수이름을 파라미터로 받아 선수 목록에 해당 이름이 존재하는 경우 삭제합니다. 구단 내 선수 이름을 파라미터로 받아 투수/타자 선수 목록에 해당 이름이 존재하는 경우 삭제합니다.
:param player_name: 삭제할 선수 이름 :param player_name: 삭제할 선수 이름
:return: None :return: None
""" """
...@@ -95,10 +95,8 @@ class Team: ...@@ -95,10 +95,8 @@ class Team:
remove_player = [player for player in player_list if player.name == player_name][0] remove_player = [player for player in player_list if player.name == player_name][0]
if remove_player.position == PlayerType.PITCHER: if remove_player.position == PlayerType.PITCHER:
self.player_pitcher.remove(remove_player) self.player_pitcher.remove(remove_player)
elif remove_player.position == PlayerType.FIELDER:
self.player_fielder.remove(remove_player)
else: else:
pass self.player_fielder.remove(remove_player)
print(f'"{player_name}" 선수가 선수 명단에서 제거 되었습니다.') print(f'"{player_name}" 선수가 선수 명단에서 제거 되었습니다.')
...@@ -109,42 +107,55 @@ class Team: ...@@ -109,42 +107,55 @@ class Team:
""" """
return f'{self.name}({self.location})' return f'{self.name}({self.location})'
def select_player(self): def select_player(self, n_practice):
""" """
투수와 타자를 랜덤하게 지정한 숫자에 맞게 선발하는 함수입니다. 연습 게임 횟수에 따른 1군, 2군, 랜덤 투수/타자 선수들을 선발하여 출력합니다.
:return: 랜덤한 수의 투수 목록, 랜덤한 수의 타자 목록 :param n_practice: 연습 게임 횟수
:return: None
""" """
selected_pitchers = random.sample(self.player_pitcher, random.randint(1, len(self.player_pitcher))) self.n_practice = n_practice
selected_fielders = random.sample(self.player_fielder, random.randint(1, len(self.player_fielder)))
for i in range(self.n_practice):
print(f'**** {i+1}번째 연습 게임 선발 ****')
selected_pitchers = random.sample(self.player_pitcher, 3)
selected_pitcher_1 = selected_pitchers[0]
selected_pitcher_2 = selected_pitchers[1]
selected_pitcher_random = selected_pitchers[2]
selected_fielders = random.sample(self.player_fielder, 27)
selected_fielders_1 = selected_fielders[:9]
selected_fielders_2 = selected_fielders[9:18]
selected_fielders_random = selected_fielders[18:]
print(f'투수: {[player.name for player in selected_pitchers]}') print(f'\t1군 \n\t\t 투수:{selected_pitcher_1.name}, 타자:{ [player.name for player in selected_fielders_1]}')
print(f'타자: {[player.name for player in selected_fielders]}') print(f'\t2군 \n\t\t 투수:{selected_pitcher_2.name}, 타자:{[player.name for player in selected_fielders_2]}')
return selected_pitchers, selected_fielders print(f'\t랜덤 \n\t\t 투수:{selected_pitcher_random.name}, 타자:{[player.name for player in selected_fielders_random]}')
def practice_game(self, pitcher_name, fielder_name): def practice_game(self, pitcher_name, fielder_name):
""" """
투수 1명과, 타자 1명의 타율을 이용해 안타 여부를 가리는 연습 게임입니다. 투수 1명과, 타자 1명의 전적을 비교해 안타 여부를 가리는 연습 게임입니다.
투수의 피안타율과 타자의 안타율을 비교하여 높은 비율 쪽이 승리합니다. 투수의 피안타율과 타자의 안타율을 비교하여 높은 비율 쪽이 승리합니다.
:param pitcher_name: 투수 1명의 이름 :param pitcher_name: 투수 1명의 이름
:param fielder_name: 티지 1명의 이름 :param fielder_name: 타자 1명의 이름
:return: 타자의 안타 여부 또는 투수의 수비 여부 :return: None
""" """
practice_pit_rate = [obj.opponent_batting_rate for obj in self.player_pitcher if obj.name == pitcher_name][0] practice_field_rate = [obj.opponent_batting_rate for obj in self.player_pitcher if obj.name == pitcher_name][0]
print(f'{pitcher_name} 안타율: {practice_pit_rate}') print(f'{pitcher_name} 안타율: {practice_field_rate:.3f}')
practice_field_rate = [obj.batting_rate for obj in self.player_fielder if obj.name == fielder_name][0] practice_pit_rate = [obj.batting_rate for obj in self.player_fielder if obj.name == fielder_name][0]
print(f'{pitcher_name} 피안타율: {practice_field_rate}') print(f'{fielder_name} 피안타율: {practice_pit_rate:.3f}')
if practice_pit_rate > practice_field_rate: if practice_pit_rate < practice_field_rate:
print(f'{pitcher_name} 안타!') print(f'{pitcher_name} 안타!')
elif practice_pit_rate < practice_field_rate: elif practice_pit_rate > practice_field_rate:
print(f'{fielder_name} 수비 성공!') print(f'{fielder_name} 수비 성공!')
else: else:
print('무승부!') print('무승부!')
class Fielder(Player): class Fielder(Player):
""" """
Player 클래스를 상속받아 타자 정보를 관리합니다. Player 클래스를 상속 받아 타자 정보를 관리합니다.
""" """
def __init__(self, name, num, age, height, weight, n_singles=25, n_doubles=10, n_triples=5, n_homeruns=5): def __init__(self, name, num, age, height, weight, n_singles=25, n_doubles=10, n_triples=5, n_homeruns=5):
""" """
...@@ -154,10 +165,10 @@ class Fielder(Player): ...@@ -154,10 +165,10 @@ class Fielder(Player):
:param age: 나이 :param age: 나이
:param height: 키 :param height: 키
:param weight: 몸무게 :param weight: 몸무게
:param n_singles: 1루타 횟수 default = 25 :param n_singles: 1루타 횟수 (default = 25)
:param n_doubles: 2루타 횟수 default = 10 :param n_doubles: 2루타 횟수 (default = 10)
:param n_triples: 3루타 횟수 default = 5 :param n_triples: 3루타 횟수 (default = 5)
:param n_homeruns: 홈런 횟수 default = 5 :param n_homeruns: 홈런 횟수 (default = 5)
""" """
super(Fielder, self).__init__(name, num, age, height, weight, 100) super(Fielder, self).__init__(name, num, age, height, weight, 100)
self.position = PlayerType.FIELDER self.position = PlayerType.FIELDER
...@@ -176,25 +187,25 @@ class Fielder(Player): ...@@ -176,25 +187,25 @@ class Fielder(Player):
:param new_homeruns: 홈런 횟수 :param new_homeruns: 홈런 횟수
:return: None :return: None
""" """
self.match_n += 1 self.n_singles += new_singles
self.n_singles = new_singles self.n_doubles += new_doubles
self.n_doubles = new_doubles self.n_triples += new_triples
self.n_triples = new_triples self.n_homeruns += new_homeruns
self.n_homeruns = new_homeruns self.match_n += 9
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('선수 정보가 업데이트 되었습니다.') print(f'선수 정보가 업데이트 되었습니다. {self.batting_rate:.3f}')
def __str__(self): def __str__(self):
""" """
객체를 문자열로 반환합니다. 객체를 문자열로 반환합니다.
:return: '선수 이름(등번호, 안타율)' 형태로 반환 :return: '선수 이름(등번호, 안타율)' 형태로 반환
""" """
return f'{self.name}({self.num}, {self.batting_rate})' return f'{self.name}({self.num}, {self.batting_rate:.3f})'
class Pitcher(Player): class Pitcher(Player):
""" """
Player를 상속받아 투수 정보를 관리합니다. Player를 상속 받아 투수 정보를 관리합니다.
""" """
def __init__(self, name, num, age, height, weight, n_outs=30): def __init__(self, name, num, age, height, weight, n_outs=30):
""" """
...@@ -204,7 +215,7 @@ class Pitcher(Player): ...@@ -204,7 +215,7 @@ class Pitcher(Player):
:param age: 나이 :param age: 나이
:param height: 키 :param height: 키
:param weight: 몸무게 :param weight: 몸무게
:param n_outs: 아웃 횟수 :param n_outs: 아웃 횟수 (default = 30)
""" """
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
...@@ -214,58 +225,70 @@ class Pitcher(Player): ...@@ -214,58 +225,70 @@ class Pitcher(Player):
def update_records(self, new_outs): def update_records(self, new_outs):
""" """
선수 정보를 업데이트합니다. 선수 정보를 업데이트합니다.
:param new_outs: 아웃 횟 :param new_outs: 아웃 횟
:return: :return:
""" """
self.n_outs = new_outs self.n_outs += new_outs
self.opponent_batting_rate = self.new_outs / self.match_n self.match_n += 81
print('선수 정보가 업데이트 되었습니다.') self.opponent_batting_rate = self.n_outs / self.match_n
print(f'선수 정보가 업데이트 되었습니다. {self.opponent_batting_rate:.3f}')
def __str__(self): def __str__(self):
""" """
객체를 문자열로 반환합니다. 객체를 문자열로 반환합니다.
:return: '선수 이름(등번호, 안타율)' 형태로 반환 :return: '선수 이름(등번호, 안타율)' 형태로 반환
""" """
return f'{self.name}({self.num}, {self.opponent_batting_rate})' return f'{self.name}({self.num}, {self.opponent_batting_rate:.3f})'
########################################### test ################################################### ########################################### test ###################################################
import random import random
team_kiwoom = Team('키움','서울') team_kiwoom = Team('키움','서울')
first_name = ['김', '이', '박', '임' ,'후','오', '노', '최', '안', '러']
last_name = ['이혁', '재명', '정후', '셀', '용규', '라도', '병욱', '윤', '병오', '도현', '현', '우진', '우주', '로하', '하하','윤하']
player_kiwoom_li = { player_kiwoom_li = {
'name': ['이정후', '러셀', '이용규', '후라도', '임병욱', '오윤', '노병오', '박도현', '양현', '안우진'], 'name': [random.choice(first_name)+random.choice(last_name) for _ in range(60)],
'num': [random.randint(1,70) for _ in range(10)], 'num': random.sample(range(1,99), 60),
'age': [random.randint(20,40) for _ in range(10)], 'age': [random.randint(20,40) for _ in range(60)],
'height': [random.randint(170,190) for _ in range(10)], 'height': [random.randint(170,190) for _ in range(60)],
'weight': [random.randint(70,90) for _ in range(10)], 'weight': [random.randint(70,100) for _ in range(60)],
'position': [random.choice(['pitcher','fielder']) for _ in range(10)] 'position': [random.choice(['pitcher','fielder']) for _ in range(60)]
} }
# 선수 추가 # 선수 추가
for idx in range(10): for idx in range(60):
information = [value[idx] for value in player_kiwoom_li.values()] information = [value[idx] for value in player_kiwoom_li.values()]
if 'pitcher' in information: if 'pitcher' in information:
player = Pitcher(*information[:-1]) player = Pitcher(*information[:-1])
player.update_records = [1,2,1,2] player.update_records(random.randint(0, 3))
else: else:
player = Fielder(*information[:-1]) player = Fielder(*information[:-1])
player.update_records = [3] player.update_records(*[random.randint(0,3) for _ in range(4)])
team_kiwoom.add_player(player) team_kiwoom.add_player(player)
# 명단 확인 # 선수 명단 확인
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()
# 선수 뽑기 # 랜덤으로 투수, 타자 선수 한명씩 뽑아서 연습게임
team_kiwoom.select_player() team_kiwoom.practice_game(random.choice(pitcher), random.choice(fielder))
# 연습게임 횟수만큼 선수 뽑기
team_kiwoom.select_player(3)
# 연습게임
team_kiwoom.practice_game(random.choice(pitcher), random.choice(fielder))
\ No newline at end of file
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