깃헙 레포지토리=https://github.com/woominKO/Pirograming
피로그래밍 운영진 카드 게임
2개월 간의 혹독하지만 보람찬 세션과 과제들을 완수하며 **코딩 지옥🔥**
에 빠져버린 피로그래밍 운영진들…
운영진과의 카드 게임에서 1등을 해야 코딩 지옥에서 벗어날 수 있다는데..😨
제시된 출력 형태를 참고하여 아래의 조건들을 만족하는 프로그램을 구현해 운영진을 구해주세요🥺✨
출력 형태를 바탕으로 아래의 조건들에 맞게 프로그램을 구현하시오.
문제설명
[ 게임 시작 전 ]
캐릭터 표 | 박신빈 | 윤정원 | 임담희 | 김용현 |
---|
[ 게임 진행 ]
[ 게임 종료 후 ]
*
를 출력해준다.HINT
카드를 무작위로 뽑거나 섞을 때는 random 함수를 사용해보세요.
정렬할 때에는 sort, lambda 함수를 사용해보세요.
어디서부터 공부해야할지 모르겠다면, 아래 링크에 들어가보세요!
스켈레톤 코드
스켈레톤 코드는 참고사항일 뿐입니다.
스켈레톤 코드를 사용하지 않아도 좋습니다.
사용하실 분들은 TODO 로 표시 되어있는 부분을 참고해주세요.
자유롭게 조건에 맞는 프로그램을 구현해주세요.
import random
class Player:
def __init__(self, name):
self.name = name
self.score = 0
self.round_wins = 0
def __str__(self) -> str:
return f"{self.name}"
class Game:
def __init__(self):
self.players = [] # 유저들의 목록
self.deck = [] # 카드 무작위 생성
self.my_player = ""
def start_game(self):
"""
- [ 게임 시작 전 ] 부분을 담당하는 함수 입니다.
- 캐릭터들을 초기화 하고, 사용자가 플레이할 캐릭터를 선택합니다.
- 1부터 13사이의 숫자의 무작위 숫자를 골라서 30개의 카드로 이루어진 덱을 만듭니다.
- 동일 클래스의 game()에서 호출됩니다.
"""
self.players.append(Player("박신빈"))
self.players.append(Player("윤정원"))
self.players.append(Player("임담희"))
self.players.append(Player("김용현"))
print("당신의 캐릭터 번호를 선택해주세요 (1,2,3,4) :", end = "")
# TODO 1-(1): 사용자로부터 캐릭터를 입력받아 my_player에 저장해주세요.
# Write code here..
##### END OF TODO 1-(1)(문제와 본 라인 사이에 코드를 작성하세요.) #####
# TODO 1-(2) : 랜덤으로 1부터 13 사이의 카드 30장을 deck에 저장해주세요
# random에 대한 함수를 공부해봅시다.
# Write code here..
##### END OF TODO 1-(2)(문제와 본 라인 사이에 코드를 작성하세요.) #####
def set_play_order(self, round_num):
"""
- [ 게임 진행 ] 부분에서 게임진행 순서를 정하는 함수 입니다.
- 동일 클래스의 play_game()에서 호출됩니다.
"""
# TODO 2 : 게임진행을 위한 플레이어를 재정렬해주세요.(ROUND 1 : 사전 순서로 이름을 오름차순으로 정렬, ROUND 2,3,4 : 점수를 기준으로 오름차순 정렬)
# sort 와 lambda 함수에 대해 공부해보세요. 사용하지 않아도 좋습니다.
# Write code here..
##### END OF TODO 2 (문제와 본 라인 사이에 코드를 작성하세요.) #####
def play_round(self):
"""
- [ 게임 진행 ] 라운드 진행을 담당하는 함수 입니다.
- 동일 클래스의 play_game()에서 호출됩니다.
"""
play_order = ",".join(map(str, self.players))
print(f"게임은 {play_order} 순으로 진행됩니다.\n")
# TODO 3-(1) : 카드를 뽑기 전에 self.deck을 랜덤으로 섞어주셔요.
# Write code here..
##### END OF TODO 3-(1) (문제와 본 라인 사이에 코드를 작성하세요.) #####
print("===========플레이어가 뽑은 카드============")
# TODO 3-(2) : 플레이어들이 카드를 뽑는 부분입니다. 플레이어들이 뽑은 카드를 players_cards에 저장해주시고, 뽑을 때마다 어떠한 카드를 뽑았는지 출력하는 코드를 작성해주세요.
# Write code here..
##### END OF TODO 3-(2) (문제와 본 라인 사이에 코드를 작성하세요.) #####
# TODO 3-(3) : 가장 큰 숫자를 뽑은 플레이어가 점수를 얻는 코드를 작성해주세요.
# 점수 계산 방식 : 본인의 카드에 적힌 숫자 - 플레이어들이 뽑은 카드 중 가장 숫자가 작은 카드에 적힌 숫자
# Write code here..
##### END OF TODO 3-(3) (문제와 본 라인 사이에 코드를 작성하세요.) #####
def play_game(self):
"""
- [ 게임 진행 ] 부분을 담당하는 함수 입니다.
- 동일 클래스의 game()에서 호출됩니다.
"""
for round_num in range(1, 5):
self.set_play_order(round_num)
print("===========================")
print(f" ROUND {round_num} - START")
print("===========================")
self.play_round()
print("===========================")
print(f" ROUND {round_num} - END")
print("===========================")
# 라운드 종료 후 각 플레이어들의 현재 점수
for order, player in enumerate(self.players, 1):
print(f"{order}. {player} : {player.score}점")
print()
def game_result(self):
# TODO 4-(1) : 점수 순으로 결과값을 출력해주세요.
# 내가 선택한 캐릭터 이름 앞뒤에는 *을 붙여주세요.
# sort 와 lambda 함수에 대해 공부해보세요. 사용하지 않아도 좋습니다.
print("=============================")
print(" 게임 순위 - 점수")
print("=============================")
# Write code here..
##### END OF TODO 4-(1)(문제와 본 라인 사이에 코드를 작성하세요.) #####
# TODO 4-(2) : 승리 횟수 순으로 결과값을 출력해주세요.
# 내가 선택한 캐릭터 이름 앞뒤에는 *을 붙여주세요.
# sort 와 lambda 함수에 대해 공부해보세요. 사용하지 않아도 좋습니다.
print("=============================")
print(" 게임 순위 - 승리 횟수")
print("=============================")
# Write code here..
##### END OF TODO 4-(2)(문제와 본 라인 사이에 코드를 작성하세요.) #####
def game(self):
"""
- 게임 운영을 위한 함수입니다.
- 별도의 코드 작성이 필요 없습니다.
"""
self.start_game()
self.play_game()
self.game_result()
if __name__ == "__main__":
"""
- 코드를 실행하는 부분입니다.
- 역시 별도의 코드 작성이 필요 없습니다.
"""
game = Game()
game.game()
TODO list
플레이어 순서 정렬 (1R: 이름 순, 2R ~: 점수 낮은 순)
3-1. 카드를 뽑기 전에 deck을 랜덤으로 섞기
3-2. 플레이어별로 카드를 deck의 뒤에서부터 뽑고 출력하기
3-3. 라운드 종료 후 플레이어별로 점수 계산해서 업데이트 후 출력하기
4-1. 점수 순으로 결과값 출력하기
⇒ 점수가 같다면 이름순 출력
4-2. 게임 종료 후 승리 횟수 순으로 결과값 출력하기
⇒ 승리 횟수가 같다면 이름순 출력
입출력케이스
===========================
ROUND 1 - START
===========================
게임은 김용현,박신빈,윤정원,임담희 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 김용현 (현재 점수: 0)
>> 뽑은 카드: 5
>> 박신빈 (현재 점수: 0)
>> 뽑은 카드: 11
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 6
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 2
>>>> 박신빈님이 9 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 1 - END
===========================
1. 김용현 : 0점
2. 박신빈 : 9점
3. 윤정원 : 0점
4. 임담희 : 0점
===========================
ROUND 2 - START
===========================
게임은 김용현,윤정원,임담희,박신빈 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 김용현 (현재 점수: 0)
>> 뽑은 카드: 9
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 10
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 8
>> 박신빈 (현재 점수: 9)
>> 뽑은 카드: 4
>>>> 윤정원님이 6 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 2 - END
===========================
1. 김용현 : 0점
2. 윤정원 : 6점
3. 임담희 : 0점
4. 박신빈 : 9점
===========================
ROUND 3 - START
===========================
게임은 김용현,임담희,윤정원,박신빈 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 김용현 (현재 점수: 0)
>> 뽑은 카드: 12
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 5
>> 윤정원 (현재 점수: 6)
>> 뽑은 카드: 7
>> 박신빈 (현재 점수: 9)
>> 뽑은 카드: 3
>>>> 김용현님이 9 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 3 - END
===========================
1. 김용현 : 9점
2. 임담희 : 0점
3. 윤정원 : 6점
4. 박신빈 : 9점
===========================
ROUND 4 - START
===========================
게임은 임담희,윤정원,김용현,박신빈 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 12
>> 윤정원 (현재 점수: 6)
>> 뽑은 카드: 3
>> 김용현 (현재 점수: 9)
>> 뽑은 카드: 11
>> 박신빈 (현재 점수: 9)
>> 뽑은 카드: 7
>>>> 임담희님이 9 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 4 - END
===========================
1. 임담희 : 9점
2. 윤정원 : 6점
3. 김용현 : 9점
4. 박신빈 : 9점
=============================
게임 순위 - 점수
=============================
1등 - *김용현* : 9점
2등 - 박신빈 : 9점
3등 - 임담희 : 9점
4등 - 윤정원 : 6점
=============================
게임 순위 - 승리 횟수
=============================
1등 - *김용현* : 1번
2등 - 박신빈 : 1번
3등 - 윤정원 : 1번
4등 - 임담희 : 1번
===========================
ROUND 1 - START
===========================
게임은 김용현,박신빈,윤정원,임담희 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 김용현 (현재 점수: 0)
>> 뽑은 카드: 3
>> 박신빈 (현재 점수: 0)
>> 뽑은 카드: 10
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 8
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 3
>>>> 박신빈님이 7 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 1 - END
===========================
1. 김용현 : 0점
2. 박신빈 : 7점
3. 윤정원 : 0점
4. 임담희 : 0점
===========================
ROUND 2 - START
===========================
게임은 김용현,윤정원,임담희,박신빈 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 김용현 (현재 점수: 0)
>> 뽑은 카드: 11
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 7
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 2
>> 박신빈 (현재 점수: 7)
>> 뽑은 카드: 4
>>>> 김용현님이 9 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 2 - END
===========================
1. 김용현 : 9점
2. 윤정원 : 0점
3. 임담희 : 0점
4. 박신빈 : 7점
===========================
ROUND 3 - START
===========================
게임은 윤정원,임담희,박신빈,김용현 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 1
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 11
>> 박신빈 (현재 점수: 7)
>> 뽑은 카드: 10
>> 김용현 (현재 점수: 9)
>> 뽑은 카드: 7
>>>> 임담희님이 10 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 3 - END
===========================
1. 윤정원 : 0점
2. 임담희 : 10점
3. 박신빈 : 7점
4. 김용현 : 9점
===========================
ROUND 4 - START
===========================
게임은 윤정원,박신빈,김용현,임담희 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 8
>> 박신빈 (현재 점수: 7)
>> 뽑은 카드: 2
>> 김용현 (현재 점수: 9)
>> 뽑은 카드: 9
>> 임담희 (현재 점수: 10)
>> 뽑은 카드: 7
>>>> 김용현님이 7 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 4 - END
===========================
1. 윤정원 : 0점
2. 박신빈 : 7점
3. 김용현 : 16점
4. 임담희 : 10점
=============================
게임 순위 - 점수
=============================
1등 - 김용현 : 16점
2등 - *임담희* : 10점
3등 - 박신빈 : 7점
4등 - 윤정원 : 0점
=============================
게임 순위 - 승리 횟수
=============================
1등 - 김용현 : 2번
2등 - 박신빈 : 1번
3등 - *임담희* : 1번
4등 - 윤정원 : 0번
===========================
ROUND 1 - START
===========================
게임은 김용현,박신빈,윤정원,임담희 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 김용현 (현재 점수: 0)
>> 뽑은 카드: 13
>> 박신빈 (현재 점수: 0)
>> 뽑은 카드: 7
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 8
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 8
>>>> 김용현님이 6 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 1 - END
===========================
1. 김용현 : 6점
2. 박신빈 : 0점
3. 윤정원 : 0점
4. 임담희 : 0점
===========================
ROUND 2 - START
===========================
게임은 박신빈,윤정원,임담희,김용현 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 박신빈 (현재 점수: 0)
>> 뽑은 카드: 13
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 10
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 4
>> 김용현 (현재 점수: 6)
>> 뽑은 카드: 2
>>>> 박신빈님이 11 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 2 - END
===========================
1. 박신빈 : 11점
2. 윤정원 : 0점
3. 임담희 : 0점
4. 김용현 : 6점
===========================
ROUND 3 - START
===========================
게임은 윤정원,임담희,김용현,박신빈 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 2
>> 임담희 (현재 점수: 0)
>> 뽑은 카드: 9
>> 김용현 (현재 점수: 6)
>> 뽑은 카드: 5
>> 박신빈 (현재 점수: 11)
>> 뽑은 카드: 6
>>>> 임담희님이 7 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 3 - END
===========================
1. 윤정원 : 0점
2. 임담희 : 7점
3. 김용현 : 6점
4. 박신빈 : 11점
===========================
ROUND 4 - START
===========================
게임은 윤정원,김용현,임담희,박신빈 순으로 진행됩니다.
===========플레이어가 뽑은 카드============
>> 윤정원 (현재 점수: 0)
>> 뽑은 카드: 1
>> 김용현 (현재 점수: 6)
>> 뽑은 카드: 6
>> 임담희 (현재 점수: 7)
>> 뽑은 카드: 5
>> 박신빈 (현재 점수: 11)
>> 뽑은 카드: 11
>>>> 박신빈님이 10 점을 얻었습니다 \^_^/ <<<<
===========================
ROUND 4 - END
===========================
1. 윤정원 : 0점
2. 김용현 : 6점
3. 임담희 : 7점
4. 박신빈 : 21점
=============================
게임 순위 - 점수
=============================
1등 - 박신빈 : 21점
2등 - 임담희 : 7점
3등 - *김용현* : 6점
4등 - 윤정원 : 0점
=============================
게임 순위 - 승리 횟수
=============================
1등 - 박신빈 : 2번
2등 - *김용현* : 1번
3등 - 임담희 : 1번
4등 - 윤정원 : 0번
코드 로직
파이썬 잘 못하는데 재미있었다.
추가로 공부해야할 부분들
1)람다 함수,sorted: 인터넷에 올라온데로 막 썼는데 정확한 동작원리를 모르겠다.
if round_num == 1:
self.players = sorted(self.players, key=lambda x: x.name)
elif round_num > 1:
self.players = sorted(self.players, key=lambda x: x.score)
2) for문 enumerate가 뭔지
for i, player in enumerate(self.players):
if self.deck[-(i+1)] == MaxCard:
MaxPlayer = player
MaxPlayer.score += MaxCard - MinCard
MaxPlayer.round_wins += 1
3)
def __str__(self) -> str:
return f"{self.name}"
def __repr__(self):
return f"{self.name}"
4)
if __name__ == "__main__":
"""
- 코드를 실행하는 부분입니다.
- 역시 별도의 코드 작성이 필요 없습니다.
"""
game = Game()
game.game()
5)
play_order = ",".join(map(str, self.players))