TIL 240223

hyeo71·2024년 2월 23일
0

2024 내배캠 AI 트랙

목록 보기
37/108

파이썬 개인 과제

2) 가위 바위 보 게임 만들기

파이썬을 사용하여 가위바위보 게임을 만들어 볼게요. 가위, 바위, 보 중 하나를 선택하여 컴퓨터와 대결합니다!

필수 기능

  • 플레이어가 가위, 바위, 보 중 하나를 입력합니다.
  • 컴퓨터도 무작위로 가위, 바위, 보 중 하나를 선택합니다.
  • 플레이어와 컴퓨터의 선택을 비교하여 승패를 판정합니다.
  • 결과를 출력하여 플레이어가 이겼는지, 컴퓨터가 이겼는지, 비겼는지를 알려줍니다.
  • 게임을 반복하거나 종료할 수 있는 기능을 추가하세요.

추가 기능

  • 게임의 승, 패, 무승부 횟수를 기록하고, 게임 종료 시에 플레이어에게 통계를 제공하세요.
  • 플레이어가 입력할 때 대소문자를 구분하지 않도록 프로그램을 개선하세요.
  • 플레이어가 게임을 반복하고 싶을 경우, 게임 재시작 여부를 묻고 그에 따라 게임을 초기화하거나 종료하는 기능을 추가하세요.

풀이

가위, 바위, 보 선택지 중 하나의 값을 골라 저장하기

RPS = ("가위", "바위", "보")

computer = random.choice(RPS)

가위, 바위, 보 라는 값은 중간에 바뀌지 않기 때문에 tuple을 사용
random.choice: list, tuple 중 무작위로 한 개의 값을 가져오는 기능

플레이어의 입력값이 유효한지 확인하기

player = input("가위, 바위, 보 중 하나를 선택하세요: ").strip()

if player in RPS:
	(내용)
else:
	print("유효한 입력이 아닙니다.")

input() 을 통해 사용자의 입력값 저장
in : 왼쪽 변수가 오른쪽 변수 안의 데이터 중 일치하는 데이터가 존재하는가?

대소문자 구분 없이 게임 재시작 여부 물어보기

if input("다시 하시겠습니까? (y/n): ").lower() == "y":
	continue
else:
    print("게임을 종료합니다.")
    print(f"승: {player_win} 패: {computer_win} 무승부: {draw}")
    break

str.lower(): 알파벳을 모두 소문자로 변환
게임을 다시 하고 싶다면 Y or y를 입력하면 게임 재시작, 그 외의 입력이 들어온다면 지금까지의 게임 통계를 보여주고 게임을 종료

그 외 승리자 판별, 통계는 가위, 바위, 보의 경우의 수가 별로 없기 때문에 하드 코딩

가위 바위 보 소스코드


3) 클래스 사용해보기

간단한 소셜 미디어 플랫폼의 회원과 게시물을 관리하는 프로그램을 개발합니다.

필수 기능

  • Member 클래스와 Post 클래스를 정의하세요.
  • Member 클래스에는 다음과 같은 속성을 가지고 있어야 합니다.
    • 회원 이름 (name)
    • 회원 아이디 (username)
    • 회원 비밀번호 (password)
  • Member 클래스에는 다음과 같은 메소드를 가지고 있어야 합니다.
    • 회원 정보를 print해주는 display (회원이름과 아이디만 보여주고 비밀번호는 보여줘서는 안됩니다!)
  • Post 클래스에는 다음과 같은 속성을 가지고 있어야 합니다.
    • 게시물 제목 (title)
    • 게시물 내용 (content)
    • 작성자 (author) : 회원의 username 이 저장되어야 함!
  • 회원 인스턴스를 세개 이상 만들고 members 라는 빈리스트에 append를 써서 저장해주세요
    1. members 리스트를 돌면서 회원들의 이름을 모두 프린트 해주세요
  • 각각의 회원이 게시글을 세개 이상 작성하는 코드를 만들어주세요.(회원이 세명이명 총 9개 이상의 post 인스턴스가 만들어져야 합니다). 만들어진 게시글 인스턴스들은 posts 빈리스트에 append를 써서 저장해주세요
    1. for 문을 돌면서 특정유저가 작성한 게시글의 제목을 모두 프린트 해주세요
    2. for문을 돌면서 ‘특정 단어’가 content에 포함된 게시글의 제목을 모두 프린트 해주세요

추가 기능

  • input을 이용하여 Member 인스턴스 만드는것을 사용자가 터미널에서 할 수 있게 해주세요.
  • post도 터미널에서 생성할 수 있게 해주세요.
  • (심화)비밀번호 해싱이 무엇인지 공부한 후 hashlib 라이브러리를 써서 회원 비밀번호를 해시화하여 저장하게 해주세요.

풀이

클래스 정의

class Member:

    def __init__(self, name, username, password):
        self.name = name
        self.username = username
        self.password = password

    def display(self):
        print(f"이름: {self.name}, ID: {self.username}")


class Post:

    def __init__(self, title, content, author):
        self.title = title
        self.content = content
        self.author = author

숫자 제한 없이 회원 추가하기 & 비밀번호 Hash

import hashlib

# 숫자 제한 없이 회원 추가
while 1:
    name = input("이름을 입력해주세요: ").strip()
    username = input("ID를 입력해주세요: ").strip()
    if username in members_username:
        print("해당 ID는 사용중입니다. 다른 ID를 사용해주세요.")
        continue
    password = input("패스워드를 입력해주세요: ").strip()
    password_hash = hashlib.sha256(password.encode("utf-8")).hexdigest()

    members.append(Member(name, username, password_hash))
    members_username.append(username)

    if input("회원을 계속 추가하시겠습니까? (y/n): ").lower() == "y":
        print()  # 프롬프트에서 가독성을 위해 사용
        continue
    else:
        break

name, username, password를 입력받고 이를 members라는 list에 class를 추가
클래스는 기본적으로 member1 = Member(name, username, password_hash)의 형태로 사용하지만 바로 list에 추가하여 인스턴스의 주소값을 list에 저장하여 반복적으로 클래스를 만드는 것을 구현

비밀번호는 일반적으로 값을 그대로 저장하지 않고 보안적인 측면에서 hash 처리를 하고 저장
hashlib을 사용하여 sha-256 암호화 방법을 사용하여 hash 처리한 password를 클래스에 저장
encode(): hash 값을 계산하기 위해 데이터를 바이트 시퀸스로 변환하기 위해 사용, 문자열을 바이트로 변환
hexdigest(): 저장, 출력이 쉽도록 hash값을 16진수 문자열로 변환

members_username: ID만을 모으는 리스트로 중복 여부, 추후 검색 시 아이디 존재 여부를 확인할 때 사용

숫자 제한 없이 게시물 추가 기능은 위와 거의 동일

전체 회원 리스트 출력하기

# 전체 회원의 이름 출력
print(f"회원 리스트(총 인원: {len(members)}명)")
for member in members:
    member.display()

members 리스트에 저장된 클래스를 반복하면서 클래스의 method를 사용하여 전체 회원의 이름, ID 출력

특정 회원의 게시물 검색하기

while 1:
    cnt = 0
    list_num = 1
    search_username_post = input("검색하고 싶은 ID를 입력하세요: ")
    if search_username_post in members_username:
        for post in posts:
            if post.author == search_username_post:
                print(f"{list_num} {post.title}")
                list_num += 1
                cnt += 1
        if cnt == 0:
            print("해당 회원님이 작성한 게시물이 존재하지 않습니다.")
    else:
        print("해당 ID를 가진 회원이 존재하지 않습니다.")

    if input("ID 검색을 계속 하시겠습니까? (y/n): ").lower() == "y":
        print()
        continue
    else:
        break

검색을 위해 입력한 회원의 ID가 존재해도 게시물이 존재하지 않을 수도 있기 때문에 cnt 변수를 사용하여 회원은 존자하지만 게시물이 없을 경우에 대한 출력 구현

특정 단어가 포함된 게시물 검색도 위와 거의 동일

클래스 사용해보기(회원과 게시물을 관리) 소스코드

0개의 댓글