Commit d28b6aa9 by 최애림

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

- Player 클래스에 "전적 업데이트" 추상 함수 추가
- Player 클래스를 상속받은 Fielder 클래스 정의
	-대전 횟수 정보(기본값 100) 저장
	-1루타 횟수(기본값 25), 2루타 횟수 (기본값 10), 3루타 횟수(기본값 5), 홈런 횟수(기본값 5) 정보 저장
	-"이름(등번호, 안타율)" 형태로 출력
	- 전적 업데이트 추상 함수 구현
-Player 클래스를 상속받은 Pitcher 클래스 정의
	- 대전 횟수 정보(기본값 100) 저장
	- 아웃 횟수(기본값 30) 정보 저장
	-"이름(등번호, 피안타율)"형태로 출력
	- 전적 업데이트 추상 함수 구현
- Team 클래스 정의
	- 소속 선수 목록을 투수와 타자로 나누어 저장하도록 변경
	- 투수와 타자를 랜덤하게 지정한 숫자에 맞게 선발하는 함수 추가
	- 투수 1명의 피안타율과 타자 1명의 타율을 이용해 안타 여부를 가리는 연습게임 함수 추가
parent 533ef5c8
class Player: import random
from abc import ABC, abstractmethod
from enum import Enum
class PlayerType(Enum):
"""
투수와 타자를 열거형 클래스로 정의합니다.
"""
FIELDER = 1
PITCHER = 2
class Player(ABC):
""" """
선수 정보를 관리하는 클래스입니다. 선수 정보를 관리하는 클래스입니다.
""" """
def __init__(self, name, num, age, height, weight): def __init__(self, name, num, age, height, weight, match_n):
""" """
객체를 초기화하고 선수들의 정보를 입력하는 메소드입니다. 객체를 초기화하고 선수들의 정보를 입력하는 메소드입니다.
:param name: 선수 이름 :param name: 선수 이름
...@@ -10,19 +22,15 @@ class Player: ...@@ -10,19 +22,15 @@ class Player:
:param age: 나이 :param age: 나이
:param height: 키 :param height: 키
:param weight: 몸무게 :param weight: 몸무게
:param match_n: 대전 횟수
""" """
self.name = name self.name = name
self.num = num self.num = num
self.age = age self.age = age
self.height = height self.height = height
self.weight = weight self.weight = weight
def member(self, match_n):
"""
기존 선수 정보에 대전 횟수를 추가합니다.
:param match_n: 대전 횟수
:return: None
"""
self.match_n = match_n self.match_n = match_n
def __str__(self): def __str__(self):
""" """
객체를 문자열로 반환합니다. 객체를 문자열로 반환합니다.
...@@ -30,12 +38,20 @@ class Player: ...@@ -30,12 +38,20 @@ class Player:
""" """
return f'{self.name}({self.num})' return f'{self.name}({self.num})'
@abstractmethod
def update_records(self):
"""
선수의 전적을 업데이트할 추상함수를 구현합니다.
:return: None
"""
pass
# 선수 명단 리스트 만들기
class Team: class Team:
""" """
구단 정보를 관리하는 클래스입니다. 구단 정보를 관리하는 클래스입니다.
""" """
def __init__(self, name, location): def __init__(self, name, location):
""" """
객체를 초기화하고 구단 이름, 연고지를 정보를 입력하는 메소드입니다. 객체를 초기화하고 구단 이름, 연고지를 정보를 입력하는 메소드입니다.
...@@ -44,67 +60,212 @@ class Team: ...@@ -44,67 +60,212 @@ class Team:
""" """
self.name = name self.name = name
self.location = location self.location = location
self.player_list = [] self.player_pitcher = []
self.player_fielder = []
def __str__(self):
"""
객체를 문자열로 반환합니다.
:return: '구단명(연고지)' 형태로 반환
"""
return f'{self.name}({self.location})'
def check_player(self): def check_player(self):
""" """
구단 내 선수들을 조회합니다. 구단 내 선수 이름 목록을 반환합니다.
:return: 선수 이름 목록 :return: 선수 이름 list
""" """
return [player.name for player in self.player_list] pitcher = [player.name for player in self.player_pitcher]
fielder = [player.name for player in self.player_fielder]
print(f'투수: {pitcher}\n타자: {fielder}')
return pitcher, fielder
def add_player(self, player): def add_player(self, player):
""" """
구단 내 선수를 추가합니다. 구단 내 선수 객체 정보를 추가합니다.
:param player: 추가할 선수 객체 :param player: 추가할 선수 객체
:return: None :return: None
""" """
player_inform = player if player.position == PlayerType.PITCHER:
self.player_list.append(player_inform) self.player_pitcher.append(player)
else:
self.player_fielder.append(player)
print(f'"{player}" 선수가 선수 명단에서 추가 되었습니다.') print(f'"{player}" 선수가 선수 명단에서 추가 되었습니다.')
def remove_player(self, player_name): def remove_player(self, player_name):
""" """
구단 내 선수 삭제합니다. 구단 내 선수이름을 파라미터로 받아 선수 목록에 해당 이름이 존재하는 경우 삭제합니다.
:param player_name: 삭제할 선수 이름 :param player_name: 삭제할 선수 이름
:return: None :return: None
""" """
player_idx = [idx for idx, obj in enumerate(self.player_list) if obj.name == player_name ][0] player_list = self.player_pitcher + self.player_fielder
self.player_list.pop(player_idx) 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
print(f'"{player_name}" 선수가 선수 명단에서 제거 되었습니다.') print(f'"{player_name}" 선수가 선수 명단에서 제거 되었습니다.')
def __str__(self):
"""
객체를 문자열로 반환합니다.
:return: '구단명(연고지)' 형태로 반환
"""
return f'{self.name}({self.location})'
def select_player(self):
"""
투수와 타자를 랜덤하게 지정한 숫자에 맞게 선발하는 함수입니다.
:return: 랜덤한 수의 투수 목록, 랜덤한 수의 타자 목록
"""
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)))
print(f'투수: {[player.name for player in selected_pitchers]}')
print(f'타자: {[player.name for player in selected_fielders]}')
return selected_pitchers, selected_fielders
def practice_game(self, pitcher_name, fielder_name):
"""
투수 1명과, 타자 1명의 타율을 이용해 안타 여부를 가리는 연습 게임입니다.
투수의 피안타율과 타자의 안타율을 비교하여 높은 비율 쪽이 승리합니다.
:param pitcher_name: 투수 1명의 이름
:param fielder_name: 티지 1명의 이름
:return: 타자의 안타 여부 또는 투수의 수비 여부
"""
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.batting_rate for obj in self.player_fielder if obj.name == fielder_name][0]
print(f'{pitcher_name} 피안타율: {practice_field_rate}')
####################################################################################################################### if practice_pit_rate > practice_field_rate:
print(f'{pitcher_name} 안타!')
elif practice_pit_rate < practice_field_rate:
print(f'{fielder_name} 수비 성공!')
else:
print('무승부!')
class Fielder(Player):
"""
Player 클래스를 상속받아 타자 정보를 관리합니다.
"""
def __init__(self, name, num, age, height, weight, n_singles=25, n_doubles=10, n_triples=5, n_homeruns=5):
"""
객체를 초기화하고 타자 정보를 생성합니다.
:param name: 타자 이름
:param num: 등번호
: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
"""
super(Fielder, self).__init__(name, num, age, height, weight, 100)
self.position = PlayerType.FIELDER
self.n_singles = n_singles
self.n_doubles = n_doubles
self.n_triples = n_triples
self.n_homeruns = n_homeruns
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):
"""
선수 정보를 업데이트합니다.
:param new_singles: 1루타 횟수
:param new_doubles: 2루타 횟수
:param new_triples: 3루타 횟수
: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.batting_rate = sum([self.n_singles, self.n_doubles, self.n_triples, self.n_homeruns]) / self.match_n
print('선수 정보가 업데이트 되었습니다.')
def __str__(self):
"""
객체를 문자열로 반환합니다.
:return: '선수 이름(등번호, 안타율)' 형태로 반환
"""
return f'{self.name}({self.num}, {self.batting_rate})'
class Pitcher(Player):
"""
Player를 상속받아 투수 정보를 관리합니다.
"""
def __init__(self, name, num, age, height, weight, n_outs=30):
"""
객체를 초기화하고 타자 정보를 생성합니다.
:param name: 타자 이름
:param num: 등번호
:param age: 나이
:param height: 키
:param weight: 몸무게
:param n_outs: 아웃 횟수
"""
super(Pitcher, self).__init__(name, num, age, height, weight, match_n=100)
self.position = PlayerType.PITCHER
self.n_outs = n_outs
self.opponent_batting_rate = self.n_outs / self.match_n
def update_records(self, new_outs):
"""
선수 정보를 업데이트합니다.
:param new_outs: 아웃 횟
:return:
"""
self.n_outs = new_outs
self.opponent_batting_rate = self.new_outs / self.match_n
print('선수 정보가 업데이트 되었습니다.')
def __str__(self):
"""수
객체를 문자열로 반환합니다.
:return: '선수 이름(등번호, 안타율)' 형태로 반환
"""
return f'{self.name}({self.num}, {self.opponent_batting_rate})'
########################################### test ###################################################
import random import random
team_kiwoom = Team('키움','서진울') team_kiwoom = Team('키움','서울')
player_kiwoom_li = { player_kiwoom_li = {
'name': ['이정후', '러셀', '이용규', '후라도', '임병욱', '오윤', '노병오', '박도현', '양현', '안우'], 'name': ['이정후', '러셀', '이용규', '후라도', '임병욱', '오윤', '노병오', '박도현', '양현', '안우'],
'num': [random.randint(1,70) for _ in range(10)], 'num': [random.randint(1,70) for _ in range(10)],
'age': [random.randint(20,40) for _ in range(10)], 'age': [random.randint(20,40) for _ in range(10)],
'height': [random.randint(170,190) for _ in range(10)], 'height': [random.randint(170,190) for _ in range(10)],
'weight': [random.randint(70,90) for _ in range(10)], 'weight': [random.randint(70,90) for _ in range(10)],
'position': [random.choice(['pitcher','fielder']) for _ in range(10)]
} }
# 선수 추가 # 선수 추가
for idx in range(10): for idx in range(10):
information = [value[idx] for value in player_kiwoom_li.values()] information = [value[idx] for value in player_kiwoom_li.values()]
player = Player(*information) if 'pitcher' in information:
player = Pitcher(*information[:-1])
player.update_records = [1,2,1,2]
else:
player = Fielder(*information[:-1])
player.update_records = [3]
team_kiwoom.add_player(player) team_kiwoom.add_player(player)
# 명단 확인 # 명단 확인
print(team_kiwoom.check_player()) team_kiwoom.check_player()
# 선수 삭제 # 선수 삭제
team_kiwoom.remove_player('러셀') team_kiwoom.remove_player('러셀')
# 명단 확인 # 명단 확인
print(team_kiwoom.check_player()) pitcher, fielder = team_kiwoom.check_player()
# 선수 뽑기
team_kiwoom.select_player()
# 연습게임
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