백엔드 파이썬 7일차 가위바위보 주사위 코딩

박재정·2025년 1월 13일

학습정보

목록 보기
7/29

1.파이썬에서의 기본적인 예외 방법은?

  • pass: 생략해놓고 나중에 작성합니다.
  • try: 예외가 발생할 수 있는 코드를 작성합니다.
  • except: 예외가 발생했을 때 처리할 코드를 작성합니다.
  • else: 예외가 발생하지 않았을 때 실행될 코드를 작성합니다.
  • finally: 예외 발생 여부와 관계없이 반드시 실행될 코드를 작성합니다.

2. try excetion finally를 설명하시오.

1.과 동일

3. ramdom 모듈의 아래의 함수에 대하여 설명하시오.

  • shuffle
  • randrange
  • randint
  • choice
  • random
shuffle 무작위로 섞는다.
import random
lst = [1, 2, 3, 4, 5]
random.shuffle(lst)
print(lst)  # 예: [3, 1, 5, 4, 2]

randrange(start,stop,step) start에서 stop까지의 값 중 step 간격으로 선택합니다.
print(random.randrange(1, 10, 2))  # 1, 3, 5, 7, 9 중 하나 반환

randint 두 정수 a, b 사이의 임의의 정수를 반환 a, b 모두 포함 
import random
print(random.randint(1, 10))  # 1부터 10 사이의 정수 반환

random 0이상1 미만의 부동소수점 숫자를 임의로 반환합니다. 
import random
lst = [10, 20, 30, 40]
print(random.choice(lst))  # 예: 20

4. 다음 로또

#1.리스트로 뽑아낼것
#2.중복을 제거 할것
#3.로직 작성시 for 문으로 리스트에서 제공하는 함수등으로 구성할것

lotto = LottoNum()
print(lotto,get_lotto_nums()) # [1,2,3,4,5,6]


# LottoNum 클래스 정의
class LottoNum:
    def __init__(self):
        self.nums = random.sample(range(1, 46), 6)  # 1부터 45까지의 숫자 중 6개를 랜덤으로 뽑는다.
    
    def get_lotto_nums(self):
        return self.nums

# 중복 제거 함수
def remove_duplicates(lst):
    unique_lst = []  # 중복 제거된 리스트를 저장할 리스트
    for num in lst:  # 반복문 for 
        if num not in unique_lst:  #unique_list에 num이  없다면 = 중복값이 없다면
            unique_lst.append(num) # num을 리스트에 더한다 
    return unique_lst

# 로또 번호 생성 및 중복 제거
lotto = LottoNum()  #lotto에 LottoNum()이라는 클래스 할당 
lotto_nums = lotto.get_lotto_nums() #lotto 클래스에 접근해서 

# 출력 
print("원래 로또 번호:", lotto_nums)
print("중복 제거 후 로또 번호:", remove_duplicates(lotto_nums))  # 중복 제거 함수 호출
#lotto_nums는 변수에 함수 리턴값을 할당 즉, random.sample(range(1,46),6) 이고, 
#remote_duplecates는 변수에 함수 리턴값이 아니고, 그냥 호출 remote~ unique_lst까지 실행 

5.예외처리 구문을 넣으시오.

def main():

 while True:
        kor = int(input("국어 점수 입력 : "))
        eng = int(input("영어 점수 입력 : "))
        math = int(input("수학 점수 입력 : "))

        grade = Grade(kor,eng,math)  #클래스 인스턴스 생성      
        
        print("국어 : ",grade.kor)

        print("총점 : ",grade.get_total())
        print("평균 : ",grade.get_avg())
        print("학점 : ",grade.get_grade())

        continue_yn = input("계속 하시겠습니까? (y/n) : ")
        #y,yes,Yes,Y,yes
        if continue_yn.upper() != 'Y' and continue_yn.upper() != 'YES' :
            break
    
    print("프로그램 종료")

main()

위의 코드를 예외처리 추가하면

코드의 일관성과 명확성을 높이기 위해, 객체 지향 프로그래밍(OOP)패러다임에 맞게 정의하여 더 명확한 구조와 재사용성을 제공

className을 사용하여 HTML의 속성과 혼동을 피하기 위해 사용

class Grade:
    def __init__(self, kor, eng, math):
        self.kor = kor
        self.eng = eng
        self.math = math

    def get_total(self):
        return self.kor + self.eng + self.math

    def get_avg(self):
        return self.get_total() / 3

    def get_grade(self):
        avg = self.get_avg()
        if avg >= 90:
            return 'A'
        elif avg >= 80:
            return 'B'
        elif avg >= 70:
            return 'C'
        else:
            return 'F'

def main():
    while True:
        try:
            kor = int(input("국어 점수 입력 : "))
            eng = int(input("영어 점수 입력 : "))
            math = int(input("수학 점수 입력 : "))
        except ValueError:
            print("잘못된 입력입니다. 숫자만 입력해주세요.")
            continue

        grade = Grade(kor, eng, math)  # 클래스 인스턴스 생성
        
        print("국어 : ", grade.kor)
        print("총점 : ", grade.get_total())
        print("평균 : ", grade.get_avg())
        print("학점 : ", grade.get_grade())

        continue_yn = input("계속 하시겠습니까? (y/n) : ")

        # y, yes, Yes, Y, yes 모두 처리
        if continue_yn.upper() not in ['Y', 'YES']:
            break

    print("프로그램 종료")

main()
  1. 아래의 업다운 게임을 짜시오
    예외처리 꼭 부탁드립니다.

내용:
시도 횟수는 10번으로 정하도록 하겠습니다.

플레이어와 컴퓨터가 참여하는 업다운 게임을 만드세요.
프로그램은 다음과 같은 기능을 포함해야 합니다.
컴퓨터는 1부터 100 사이의 랜덤한 숫자를 생성합니다.
플레이어는 숫자를 입력하고, 입력한 숫자와 컴퓨터의 숫자를 비교하여 "업" 또는 "다운" 힌트를 제공합니다.
플레이어가 컴퓨터의 숫자를 정확히 맞히면 시도한 횟수를 알려줍니다.
플레이어가 숫자를 맞힐 때까지 위 과정을 반복합니다.

시도횟수가 10번이 지나면 게임 실패 입니다.

game = UpDownGame()
game.run()

출력
91
1~100 사이의 숫자를 입력하세요. 90
UP

1~100 사이의 숫자를 입력하세요. 92
DOWN

1~100 사이의 숫자를 입력하세요. 91
정답입니다.


import random

#업다운 게임 클래스 정의 
import random

# 업다운 게임 클래스 정의
class UpDownGame:
    def __init__(self):
        self.max_attempts = 10  # 시도 횟수를 10번으로 설정
        self.target_number = random.randint(1, 100)  # 1부터 100까지 랜덤 숫자 생성

    def run(self):
        print("업다운 게임을 시작합니다! (1~100 사이의 숫자를 맞춰보세요!)")
        attempts = 0  # 시도 횟수 초기화

        while attempts < self.max_attempts:
            try:
                user_input = input(f"1~100 사이의 숫자를 입력하세요. 시도 {attempts + 1}/{self.max_attempts}: ")
                guess = int(user_input)
                # 숫자 범위 체크
                if guess < 1 or guess > 100:
                    raise ValueError("숫자는 1과 100 사이여야 합니다.")
            except ValueError as ve:
                print(f"잘못된 입력입니다: {ve}")
                continue  # 잘못된 입력 시 다시 시도

            attempts += 1

            if guess < self.target_number:
                print("UP")
            elif guess > self.target_number:
                print("DOWN")
            else:
                print(f"정답입니다! {attempts}번 만에 맞추셨습니다.")
                return

        print(f"게임 실패! 정답은 {self.target_number}였습니다.")

7.로또 번호를 리스트로 출력하시오

import random
def lotto_numbers():
	lotto_numbers = random.sample(range(1, 46), 6)
	return lotto_numbers

lotto_list = lotto_numbers()
print("로또 번호:",lotto_list)

8.가위 바위보 게임을 만드시오
예외처리 꼭 부탁드립니다.

game = RSPGame()
game.run()

가위 바위 보 게임
가위 바위 보를 하는 게임 입니다.

가위 바위 보 중 하나를 입력하세요: 가위
컴퓨터는 가위를 냈습니다.

플레이어는 가위를 냈습니다.
무승부

계속 하시겠습니까? yes

가위 바위 보 게임
가위 바위 보를 하는 게임 입니다.

가위 바위 보 중 하나를 입력하세요: 가위
컴퓨터는 가위를 냈습니다.

플레이어는 가위를 냈습니다.
무승부

계속 하시겠습니까? no

게임이 끝났습니다.


import random #컴퓨터가 무작위로 가위 바위 보를 내기 때문에

# 가위 바위 보 게임 클래스
class RSPGame:
    def __init__(self): #초기화 메서드 
        self.choices = ["가위", "바위", "보"] #가위, 바위, 보 경우의 수를 저장
        self.running = True #게임 실행 여부를 나타내는 변수

    def run(self): #게임 실행 메서드
        print("가위 바위 보 게임을 시작합니다!")
        
        while self.running: #self.running이 True 
            print("\n가위 바위 보 중 하나를 입력하세요:")
            player_choice = input("당신의 선택: ").strip() #strip 공백제거
            
            # 입력 검증
            if player_choice not in self.choices:
                print("잘못된 입력입니다. 가위, 바위, 보 중에서 선택하세요.")
                continue

            computer_choice = random.choice(self.choices)
            print(f"컴퓨터는 {computer_choice}를 냈습니다.")
            print(f"플레이어는 {player_choice}를 냈습니다.")

            # 게임 로직
            if player_choice == computer_choice:
                print("무승부")
            elif (player_choice == "가위" and computer_choice == "보") or \
                 (player_choice == "바위" and computer_choice == "가위") or \
                 (player_choice == "보" and computer_choice == "바위"):
                print("플레이어가 승리했습니다!")
            else:
                print("컴퓨터가 승리했습니다!")

            # 게임 종료 여부 확인
            again = input("\n계속 하시겠습니까? (yes/no): ").strip().lower()
            if again != "yes":
                print("\n게임이 끝났습니다.")
                self.running = False

# 게임 실행
game = RSPGame()
game.run()
  1. print(len(t)) 를 스페셜 메소드로 직접 호출해 보시오.
    t = (1,2,3)
    print(len(t))
t = (1,2,3)
print(len(t))
t = (1, 2, 3)

print(len(t))         # 기본 len() 함수 호출
print(t.__len__())    # 스페셜 메소드 __len__() 직접 호출

# 출력값은 둘 다 3으로 같다.

10.아래가 에러가 나는 이유와 에러가 나지 않게 수정하시오.?

class Sentence :
def init(self, s) :
self.words = s.split()

s = Sentence('Sometimes bad things happen to good people’)

print(len(s)) # TypeError: object of type 'Sentence' has no len()

11. 아래를 코딩 하시오

    c = Car("32러5234")
print(len(c)) #7 = 차량 번호의 길이가 반환됨
print(str(c)) # 차량번호는 32러5234 입니다


class Car:
    def __init__(self, plate_number):  # 객체 생성 시 호출되는 초기화 함수                                                    plate_number
        self.plate_number = plate_number  # 차량 번호를 인스턴스 변수에 저장
                                             self.plate_number에
    def __len__(self):  # `len()` 함수가 호출되면 실행되는 메서드
        return len(self.plate_number)  # 차량 번호 문자열의 길이를 반환

    def __str__(self):  # `str()` 함수가 호출되거나 print() 시 문자열 형태 반환
        return f"차량번호는 {self.plate_number} 입니다."  # 포맷된 문자열 반환


# 코드 실행 예시
c = Car("32러5234")  # 차량 번호 "32러5234"를 가진 Car 객체 생성
print(len(c))  # __len__ 메서드 호출 -> 차량 번호 "32러5234"의 길이 7 반환
print(str(c))  # __str__ 메서드 호출 -> "차량번호는 32러5234 입니다." 출력

12. 아래의 주사위 게임을 짜시오.

주사위 게임
첫번째의 참가자의 이름을 입력하세요.
영희
두번째의 참가자의 이름을 입력하세요.
철수
영희 주사위 숫자는 : 6
철수 주사위 숫자는 : 5
영희가 이겼습니다.
dice_game = DiceGame()
dice_game.run()


import random

# 주사위 게임 클래스
class DiceGame:
    def __init__(self):
        self.player1_name = ""
        self.player2_name = ""

    def run(self):
        print("주사위 게임을 시작합니다!")
        
        # 참가자 이름 입력
        self.player1_name = input("첫 번째 참가자의 이름을 입력하세요: ").strip()
        self.player2_name = input("두 번째 참가자의 이름을 입력하세요: ").strip()

        # 주사위 숫자 생성 (1~6 사이 랜덤 숫자)
        player1_dice = random.randint(1, 6)
        player2_dice = random.randint(1, 6)

        print(f"\n{self.player1_name} 주사위 숫자는: {player1_dice}")
        print(f"{self.player2_name} 주사위 숫자는: {player2_dice}")

        # 승리 여부 판단
        if player1_dice > player2_dice:
            print(f"\n{self.player1_name}가 이겼습니다!")
        elif player1_dice < player2_dice:
            print(f"\n{self.player2_name}가 이겼습니다!")
        else:
            print("\n무승부입니다!")

# 게임 실행
dice_game = DiceGame()
dice_game.run()

강사님 세줄요약
세줄요약:
스페셜 메소드란 함수명 이다.
예외처리 구문은 try except finally 이다.
클래스를 구성시, 데이터타입 리스트,튜플,딕셔러니도 잘 활용해보고, 메서드도 기능별로 나누어서 구성해 보자.

세줄요약 일주일 느낀점 적기

클래스 부터 너무 너무 어렵다
잘하는 사람도 많고 chatGPT도 너무 유용해서 내가 필요할까 의구심이든다.
그럼에도 그에 맞춰 가치있는 개발자가 되어야겠다.

profile
파이썬, SQL 개발

0개의 댓글