Skip to content
Open
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 자동차 경주 게임

## 기능 목록

1. **자동차 이름 입력**
- 사용자가가 쉼표(`,`)로 구분된 자동차 이름을 입력
- 각 자동차 이름은 1~5자의 문자
- 잘못된 입력일 경우 `ValueError`를 발생시키고 프로그램을 종료

2. **이동 횟수 입력**
- 사용자가 몇 번의 이동을 할 것인지 숫자로 입력
- 1 이상의 정수를 입력해야 하며, 잘못된 입력 시 `ValueError` 발생

3. **자동차 이동 로직**
- 각 자동차는 매 턴마다 0~9 사이의 무작위 값을 얻음
- 값이 4 이상이면 자동차는 한 칸(`-`) 전진
- 값이 3 이하이면 그대로 멈춤

4. **경기 진행 및 결과 출력**
- 입력받은 횟수만큼 경기를 진행
- 매 턴마다 각 자동차의 진행 상태를 출력

5. **우승자 선정**
- 가장 멀리 간 자동차가 우승자
- 우승자가 여러 명일 경우 쉼표(`,`)로 구분하여 출력

6. **예외 처리**
- 잘못된 자동차 이름(1~5자 초과 또는 공백) 입력 시 `ValueError` 발생
- 이동 횟수를 1 이상의 정수로 입력하지 않으면 `ValueError` 발생
75 changes: 68 additions & 7 deletions src/racingcar/main.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,73 @@
import random



Comment on lines +7 to +8

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

불필요한 빈 줄을 제거해주세요.

PEP8 스타일 가이드에 따라 불필요한 빈 줄을 제거해야 합니다.

 RANDOM_MAX = 9

-

 def get_car_names():
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
RANDOM_MAX = 9
def get_car_names():
# ... function implementation ...

def get_car_names():
Comment on lines +1 to +9

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

PEP8 스타일 가이드에 따라 빈 줄을 수정해주세요.

import 문과 첫 번째 함수 사이에는 두 줄의 공백만 있어야 합니다.

 import random


-

-
 def get_car_names():
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import random
def get_car_names():
import random
def get_car_names():
🧰 Tools
🪛 GitHub Actions: Check PEP8 Style

[error] 5-5: E303 too many blank lines (3)

names = input("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)\n").split(",")
names = [name.strip() for name in names]

if not names or any(len(name) > 5 or not name for name in names):
raise ValueError("자동차 이름은 1~5자의 문자여야 합니다.")

return names



def get_attempt_count():
try:
count = int(input("시도할 횟수는 몇 회인가요?\n"))
if count <= 0:
raise ValueError
return count
except ValueError as e:
raise ValueError("올바른 횟수를 입력하세요. (양의 정수)") from e



def move_car():
if random.randint(0, 9) >= 4:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

숫자상수는, 매직넘버상수로 바꾸고 전방선언 해주는 것이 좋습니다.

return "-"
return ""



def run_race(cars, attempts):
results = {car: "" for car in cars}

print("\n실행 결과")
for _ in range(attempts):
for car in cars:
results[car] += move_car()
for car, progress in results.items():
print(f"{car} : {progress}")
print()
return results
Comment on lines +32 to +48

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

후행 공백을 제거해주세요.

43번 줄의 후행 공백을 제거해야 합니다.

        print()
-    
+
     return results
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def run_race(cars, attempts):
results = {car: "" for car in cars}
print("\n실행 결과")
for _ in range(attempts):
for car in cars:
results[car] += move_car()
for car, progress in results.items():
print(f"{car} : {progress}")
print()
return results
def run_race(cars, attempts):
results = {car: "" for car in cars}
print("\n실행 결과")
for _ in range(attempts):
for car in cars:
results[car] += move_car()
for car, progress in results.items():
print(f"{car} : {progress}")
print()
return results
🧰 Tools
🪛 GitHub Actions: Check Indentation Depth

[warning] 43-43: Trailing whitespace

🪛 GitHub Actions: Check PEP8 Style

[error] 32-32: E302 expected 2 blank lines, found 1


[warning] 43-43: W293 blank line contains whitespace




def get_winners(results):
max_distance = max(len(progress) for progress in results.values())
winners = [
car for car, progress in results.items()
if len(progress) == max_distance
]
Comment on lines +46 to +56

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

가독성을 위한 줄바꿈이 좋습니다!

리스트 컴프리헨션을 여러 줄로 나누어 가독성을 높였습니다. 다만, 49번 줄의 후행 공백을 제거해주세요.

    return [
-        car for car, progress in results.items() 
+        car for car, progress in results.items()
        if len(progress) == max_distance
        ]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def get_winners(results):
max_distance = max(len(progress) for progress in results.values())
return [
car for car, progress in results.items()
if len(progress) == max_distance
]
def get_winners(results):
max_distance = max(len(progress) for progress in results.values())
return [
car for car, progress in results.items()
if len(progress) == max_distance
]
🧰 Tools
🪛 GitHub Actions: Check Indentation Depth

[warning] 49-49: Trailing whitespace

🪛 GitHub Actions: Check PEP8 Style

[error] 46-46: E302 expected 2 blank lines, found 1


[warning] 49-49: W291 trailing whitespace

return winners



def main():
Comment on lines +3 to +59

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

함수 정의 사이의 공백을 수정해주세요.

PEP8 스타일 가이드에 따르면 함수 정의 사이에는 두 줄의 공백이 필요합니다.

다음과 같이 수정해주세요:

 import random


 def get_car_names():
     # ... function implementation ...


 def get_attempt_count():
     # ... function implementation ...


 def move_car():
     # ... function implementation ...


 def run_race(cars, attempts):
     # ... function implementation ...


 def get_winners(results):
     # ... function implementation ...


 def main():
     # ... function implementation ...
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def get_car_names():
names = input("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)\n").split(",")
names = [name.strip() for name in names]
if not names or any(len(name) > 5 or not name for name in names):
raise ValueError("자동차 이름은 1~5자의 문자여야 합니다.")
return names
def get_attempt_count():
try:
count = int(input("시도할 횟수는 몇 회인가요?\n"))
if count <= 0:
raise ValueError
return count
except ValueError as e:
raise ValueError("올바른 횟수를 입력하세요. (양의 정수)") from e
def move_car():
if random.randint(0, 9) >= 4:
return "-"
return ""
def run_race(cars, attempts):
results = {car: "" for car in cars}
print("\n실행 결과")
for _ in range(attempts):
for car in cars:
results[car] += move_car()
for car, progress in results.items():
print(f"{car} : {progress}")
print()
return results
def get_winners(results):
max_distance = max(len(progress) for progress in results.values())
winners = [
car for car, progress in results.items()
if len(progress) == max_distance
]
return winners
def main():
import random
def get_car_names():
names = input("경주할 자동차 이름을 입력하세요.(이름은 쉼표로 구분)\n").split(",")
names = [name.strip() for name in names]
if not names or any(len(name) > 5 or not name for name in names):
raise ValueError("자동차 이름은 1~5자의 문자여야 합니다.")
return names
def get_attempt_count():
try:
count = int(input("시도할 횟수는 몇 회인가요?\n"))
if count <= 0:
raise ValueError
return count
except ValueError as e:
raise ValueError("올바른 횟수를 입력하세요. (양의 정수)") from e
def move_car():
if random.randint(0, 9) >= 4:
return "-"
return ""
def run_race(cars, attempts):
results = {car: "" for car in cars}
print("\n실행 결과")
for _ in range(attempts):
for car in cars:
results[car] += move_car()
for car, progress in results.items():
print(f"{car} : {progress}")
print()
return results
def get_winners(results):
max_distance = max(len(progress) for progress in results.values())
winners = [
car for car, progress in results.items()
if len(progress) == max_distance
]
return winners
def main():
# ... function implementation ...
🧰 Tools
🪛 GitHub Actions: Check PEP8 Style

[error] 3-3: E302 expected 2 blank lines, found 1


[error] 12-12: E302 expected 2 blank lines, found 1


[error] 21-21: E302 expected 2 blank lines, found 1


[error] 26-26: E302 expected 2 blank lines, found 1


[error] 38-38: E302 expected 2 blank lines, found 1


[error] 46-46: E302 expected 2 blank lines, found 1

"""
프로그램의 진입점 함수.
여기에서 전체 프로그램 로직을 시작합니다.
"""
# 프로그램의 메인 로직을 여기에 구현
print("프로그램이 시작되었습니다.")
try:
cars = get_car_names()
attempts = get_attempt_count()
results = run_race(cars, attempts)
winners = get_winners(results)
print(f"최종 우승자 : {', '.join(winners)}")
except ValueError as e:
print(f"입력 오류: {e}")
raise
Comment on lines +57 to +68

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제일 깔끔하게 작성한 것 같아요 👍

Comment on lines +45 to +68

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

에러 처리 방식을 개선해주세요.

현재 구현은 에러 메시지를 출력한 후 다시 예외를 발생시키고 있습니다. 사용자 경험을 위해 다음과 같이 개선하는 것이 좋습니다:

  1. 에러 발생 시 프로그램을 종료하지 않고 재시도 기회 제공
  2. 구체적인 에러 메시지 제공
 def main():
-    try:
-        cars = get_car_names()
-        attempts = get_attempt_count()
-        results = run_race(cars, attempts)
-        winners = get_winners(results)
-        print(f"최종 우승자 : {', '.join(winners)}")
-    except ValueError as error:
-        print(f"입력 오류: {error}")
-        raise
+    while True:
+        try:
+            cars = get_car_names()
+            attempts = get_attempt_count()
+            results = run_race(cars, attempts)
+            winners = get_winners(results)
+            print(f"최종 우승자 : {', '.join(winners)}")
+            break
+        except ValueError as error:
+            print(f"입력 오류: {error}")
+            retry = input("다시 시도하시겠습니까? (y/n): ")
+            if retry.lower() != 'y':
+                break
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def main():
try:
cars = get_car_names()
attempts = get_attempt_count()
results = run_race(cars, attempts)
winners = get_winners(results)
print(f"최종 우승자 : {', '.join(winners)}")
except ValueError as error:
print(f"입력 오류: {error}")
raise
def main():
while True:
try:
cars = get_car_names()
attempts = get_attempt_count()
results = run_race(cars, attempts)
winners = get_winners(results)
print(f"최종 우승자 : {', '.join(winners)}")
break
except ValueError as error:
print(f"입력 오류: {error}")
retry = input("다시 시도하시겠습니까? (y/n): ")
if retry.lower() != 'y':
break
🧰 Tools
🪛 GitHub Actions: Check PEP8 Style

[error] 45-45: E302 expected 2 blank lines, found 1





if __name__ == "__main__":
# 프로그램이 직접 실행될 때만 main() 함수를 호출
main()