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