-
가위 바위 보 게임 코드 만들기Python 2024. 7. 4. 03:22
컴퓨터와 유저가 대결을 하는 가위바위보 게임이다.
가장 먼저 컴퓨터가 가위 바위 보 중 하나를 랜덤으로 뽑아야 해서 random 모듈을 import 했다.
import random print("게임을 시작합니다.")
오늘 세션 이후 추가해준 코드
win = 0 lose = 0 draw = 0 option: ["가위", "바위", "보"]
["가위", "바위", "보"]가 반복적으로 여러번 나오니까 option list로 묶어줬고
마지막에 승, 패, 무승부 결과를 알려주기 위해 win, lose, draw 변수를 추가했다.
get_computer_choice() : 컴퓨터가 선택한 가위 바위 보 함수로, 가위 바위 보 중 하나를 랜덤으로 뽑아야하므로 option을 인수로 받는 random.choice를 썼다.
get_player_choice(): 유저가 선택한 가위 바위 보 함수로, while True 반복문으로 option 중 하나를 제대로 입력할 때까지 무한 반복하고, 제대로 입력된 값은 player_choice 라는 이름의 변수로 반환하도록 했다.
def get_computer_choice(): return random.choice(option) def get_player_choice(): while True: player_choice = input("가위, 바위, 보 중 하나를 입력하세요: ").strip() if player_choice in option: return player_choice else: print("입력이 올바르지 않습니다.")
이제 누가 이겼는지를 결정하는 함수를 만들어준다. 코드컨벤션 강의 때문인지 변수와 함수, 클래스 등을 네이밍하는게 생각보다 고민이 됐다.
경우의 수를 따져보면 총 9가지인데,
1. if player_choice == computer_choice 가 무승부 (둘다 같은 걸 낸 경우의 수 3가지)
2. elif 어떤 걸 내도 유저가 이기는 경우의 수 3가지
그럼 3. else 에는 남은 경우의 수인 유저가 무조건 지는 경우 3가지, 즉 컴퓨터가 이기는 경우의 수가 나온다.
def determine_winner(player_choice, computer_choice): if player_choice == computer_choice: draw += 1 return "무승부!" elif ( (player_choice == "바위" and computer_choice == "가위") or (player_choice == "가위" and computer_choice == "보") or (player_choice == "보" and computer_choice == "바위") ): win += 1 return "이겼습니다" else: lose += 1 return "졌습니다"
이제 게임 함수를 만든다. 각각 뭐를 냈는지, 결과가 뭔지를 보여주도록 했다.
def play_game(): player_choice = get_player_choice() computer_choice = get_computer_choice() play_result = determine_winner(player_choice, computer_choice) print(f"나: {player_choice}, 컴퓨터: {computer_choice} \n{play_result}") return play_result
여기서 get_player_choice()와 get_computer_choice()함수를 호출하도록 player_choice와 computer_choice로 변수를 지정해주고, 승패 결과인 play_result를 determine_winner(player_choice, computer_choice)함수의 리턴값으로 반환하도록 했다.
유저와 컴퓨터가 각각 뭘 냈는지도 출력해주면 직관적으로 알 수 있다.
이제 마지막.
while True 반복문으로 게임을 더 할지 말지를 결정하면 되는데, 난 무승부일 경우 선택권 없이 자동으로 한 판이 더 진행되도록 만들었다.
그래서 앞 반복문에 play_game함수의 결과가 "무승부!"일 경우 continue를 줘서 아래는 다 건너뛰고 반복문 맨 처음으로 가도록 했다.
이기거나 지면, 정상적으로 게임을 한 판 더 할건지 물어보고 대답 옵션으로 ["예", "ㅇ", "아니오", "ㄴ", "노"]를 넣어줬다.
왜냐하면 코드를 실행해서 게임을 해보니까 이 질문이 나왔을때 귀찮아서 예 대신 ㅇ을 치게 되고 아니오 대신 ㄴ 이나 노를 치게 됐기 때문이다. if문에서 리스트 옵션 안에 있는 것만 입력하면 일단 break로 다 빠져나오게 하고 예, ㅇ는 다시 반복문으로 돌아가서 게임을 진행하게 하고 아니오, ㄴ, 노 는 아래의 if문으로 빠져서 break로 끝이 난다.
그리고 그 외에 다른 문자를 입력하면 예외없이 다시 입력하도록 했다.. 잘못된 값을 계속 입력하면 영원히 게임 안에서 살아야함...
while True: result = play_game() if result == "무승부!": print("한 판 더 진행합니다.") continue while True: play_again = input("한 판 더? (예/아니오): ").strip() if play_again in ["예", "ㅇ", "아니오", "ㄴ", "노"]: break else: print("잘못된 입력입니다. 다시 입력해주세요.") if play_again in ["아니오", "ㄴ", "노"]: break print("게임을 종료합니다!") print(f"결과: 승:{win}, 패:{lose}, 무승부:{draw}")
그리고 앞에서 추가해줬던 통계자료를 마지막에 출력해서 보여준다.
코드를 실행시키고 게임을 진행해보면?
UnboundLocalError 라는 에러가 뜬다. 전역변수 지역변수 오류였다.
위에서 이렇게 전역변수를 지정해줬는데
win = 0 lose = 0 draw = 0 option: ["가위", "바위", "보"]
난 determine_winner()함수 안에서 얘네를 쓰려고 해서 발생한 문제였다.
그래서 global을 써서 함수 안에서 win, lose, draw를 쓸 수 있게 만들어줬다.
def determine_winner(player_choice, computer_choice): global win, lose, draw if player_choice == computer_choice: draw += 1 return "무승부!" elif ( (player_choice == "바위" and computer_choice == "가위") or (player_choice == "가위" and computer_choice == "보") or (player_choice == "보" and computer_choice == "바위") ): win += 1 return "이겼습니다!" else: lose += 1 return "졌습니다.."
이러면 문제없이 돌아간다.
전체코드
import random print("게임을 시작합니다.") option = ["가위", "바위", "보"] def get_computer_choice(): return random.choice(option) def get_player_choice(): while True: player_choice = input("가위, 바위, 보 중 하나를 입력하세요: ").strip() if player_choice in option: return player_choice else: print("입력이 올바르지 않습니다.") win = 0 lose = 0 draw = 0 def determine_winner(player_choice, computer_choice): global win, lose, draw if player_choice == computer_choice: draw += 1 return "무승부!" elif ( (player_choice == "바위" and computer_choice == "가위") or (player_choice == "가위" and computer_choice == "보") or (player_choice == "보" and computer_choice == "바위") ): win += 1 return "이겼습니다!" else: lose += 1 return "졌습니다.." def play_game(): player_choice = get_player_choice() computer_choice = get_computer_choice() play_result = determine_winner(player_choice, computer_choice) print(f"나: {player_choice}, 컴퓨터: {computer_choice} \n{play_result}") return play_result while True: result = play_game() if result == "무승부!": print("한 판 더 진행합니다.") continue while True: play_again = input("한 판 더? (예/아니오): ").strip() if play_again in ["예", "ㅇ", "아니오", "ㄴ", "노"]: break else: print("잘못된 입력입니다. 다시 입력해주세요.") if play_again in ["아니오", "ㄴ", "노"]: break print("게임을 종료합니다!") print(f"결과: 승:{win}, 패:{lose}, 무승부:{draw}")
실행시켜서 게임을 진행해보면 잘된다.
'Python' 카테고리의 다른 글
파이썬, class로 sns platform 코드2 input으로 객체 생성 (0) 2024.07.06 python, class, 인스턴스 생성 - 간단한 sns platform 코딩 (2) 2024.07.05 파이썬으로 업다운 게임 만들기 (0) 2024.07.02 파이썬 문법 심화 (1) 2024.06.30 파이썬 문법 기초 (0) 2024.06.28