[WIL] 3주차 - 과제리뷰

sudog·2023년 8월 27일
0

WIL

목록 보기
3/4

이번 주는 파이썬 과제를 만들어 제출했다.
파이썬을 기존에 알고 있었기 때문에 과제가 어렵지는 않았다.

과제는 총 3가지였는데, 하나씩 리뷰하고자 한다.


업다운 게임

컴퓨터가 임의의 숫자를 생성하고 사용자가 입력하는 숫자보다 높으면 업, 낮으면 다운을 반복적으로 출력하는 문제이다.
random 모듈을 사용해 임의의 숫자를 생성할 수 있었다.

게임을 여러 번 반복하기 위해 함수를 만들어 반복문이 돌면 함수를 호출하게 구현했다. 함수는 입력횟수를 반환해서 최고 기록을 갱신하도록 한다.

함수 구현부에 상수가 들어가는 것이 마음에 들지 않아서 숫자 범위를 인자로 받게 만들었다.

import random


def updown(min_count, l, r):
	# 최고 시도 횟수는 100보다 클 수 없다.
    if min_count < r - l + 1:
        print(f"\n\n최고 시도 횟수: {min_count}")
    target = random.randint(l, r)
    count = 1
    while True:
        try:
            n = int(input("\n숫자를 입력해주세요: "))
        except ValueError:
            print("숫자만 입력 가능합니다.")
            continue
        if not l <= n <= r:
            print(f"{l} 부터 {r} 사이의 숫자를 입력해주세요.")
            continue
        if n < target:
            print("Up")
        elif n > target:
            print("Down")
        else:
            print(f"정답입니다! 시도한 횟수는 {count}번 입니다.")
            break
        count += 1
    return count


def play(l, r):
    min_count = r - l + 1
    while True:
        min_count = min(min_count, updown(min_count, l, r))
        print()
        res = input("한 번 더 하시겠습니까? (Y/n) ")
        if res == "n":
            break
    print("\n게임이 종료되었습니다.")


play(1, 100)

가위바위보

컴퓨터의 선택을 구현하기 위해 바위, 보, 가위의 원소를 가진 배열을 구현하고 인덱스를 0-2 사이의 숫자로 랜덤 생성하였다.

승패조건을 잘 생각해보면 [바위, 보, 가위] 배열이 존재할 때 컴퓨터의 인덱스보다 1이 크면 승리하고, 2가 크면 패배한다.

따라서 복잡한 조건문 없이도 인덱스의 차이만 가지고 승패여부를 가릴 수 있다.

import random


def play():
	# 사용자 입력을 숫자로 매핑한다.
    rps_map = {"rock": 0, "paper": 1, "scissors": 2}
    arr = ["바위", "보", "가위"]
    win = 0
    lose = 0
    draw = 0
    while True:
    	# 딕셔너리 인덱스 매핑이 실패하면 에러
        try:
            a = rps_map[input("\n가위 바위 보! (Rock, Paper, Scissors): ").lower()]
        except KeyError:
            print("(Rock, Paper, Scissors) 중 하나를 입력해주세요.")
            continue
        b = random.randint(0, 2)
        res = (3 + b - a) % 3
        print(f"당신 - {arr[a]} | 컴퓨터 - {arr[b]}")
        if res == 1:
            lose += 1
            print("패배했습니다!")
        elif res == 2:
            win += 1
            print(f"승리했습니다!")
        else:
            draw += 1
            print("비겼습니다!")
        if input("\n재도전 하시겠습니까? (Y/n) ") == "n":
            break
    print(f"\n승리: {win} | 패배: {lose} | 무승부: {draw}")


play()

게시판 클래스

유저 인터페이스를 만들어 원하는 메뉴를 선택하면 해당 메뉴를 구현한 함수를 실행하는 방식으로 구현하였다.

글을 쓰기 위해서는 쓰는 사람이 누구인지 인증이 필요하므로 아이디와 비밀번호를 입력받는다. 비밀번호는 해시를 통해 암호화해서 저장해서 평문을 알 수 없도록 한다.

import hashlib


class Member:
    def __init__(self, name, username, password):
        self.name = name
        self.username = username
        m = hashlib.sha256()
        m.update(password.encode("utf-8"))
        ## __는 private을 의미한다.
        self.__password = m.hexdigest()

    def display(self):
        print(f"\n이름: {self.name}\n아이디: {self.username}")
	
    # 인증을 위한 메소드
    def auth(self, password):
        m = hashlib.sha256()
        m.update(password.encode("utf-8"))
        if self.__password == m.hexdigest():
            return True
        else:
            return False


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


member_data = [
    {"name": "민수", "username": "ms1608", "password": "alstn0"},
    {"name": "진호", "username": "jh3370", "password": "wlsgh1"},
    {"name": "수빈", "username": "sb4511", "password": "tnqls2"},
]

post_data = [
    {
        "title": "안녕하세요!",
        "content": "게시판 여러분들 반갑습니다.",
        "author": "ms1608",
    },
    {
        "title": "라면 끓이는 법",
        "content": "라면 끓이는 법 좀 알려주세요. 배고파요.",
        "author": "ms1608",
    },
    {
        "title": "수학 질문",
        "content": "1 더하기 1은 얼마인가요?",
        "author": "ms1608",
    },
    {
        "title": "모두들 반갑습니다!",
        "content": "좋은 게시판 문화 만들어가요!",
        "author": "jh3370",
    },
    {
        "title": "운동 메이트 구함",
        "content": "매일 공원에서 달리기 하실 분 구합니다.",
        "author": "jh3370",
    },
    {
        "title": "맛집 좀 알려주세요",
        "content": "근처 맛집 이름과 메뉴추천 부탁드립니다.",
        "author": "jh3370",
    },
    {
        "title": "첫 글 써봅니다!",
        "content": "글 쓰는 건 처음인데 인사드립니다.",
        "author": "sb4511",
    },
    {
        "title": "컴퓨터가 안됩니다.",
        "content": "갑자기 컴퓨터가 부팅이 되지 않습니다. 어떻게 해야 하나요?",
        "author": "sb4511",
    },
    {
        "title": "오늘 점심 메뉴 추천",
        "content": "점심 메뉴로 뭐가 좋을지 추천 부탁드려요.",
        "author": "sb4511",
    },
]

members = [Member(**md) for md in member_data]
print(members)
posts = [Post(**pd) for pd in post_data]

# 회원가입
def create_member():
    name = input("이름: ")
    username = input("아이디: ")
    password = input("비밀번호: ")
    member = Member(name, username, password)
    members.append(member)
    print(f"가입을 환영합니다 {member.name}님!")

# 멤버 아이디와 이름 출력
def show_member_name():
    for member in members:
        member.display()

# 아이디로 게시글 검색
def search_by_id():
    username = input("조회할 아이디 입력: ")
    print()
    flag = 0
    for post in posts:
        if post.author == username:
            flag = 1
            print(f"- {post.title}")
    if not flag:
        print("검색 결과가 없습니다.")

# 내용으로 게시글 검색
def search_by_keyword():
    keyword = input("조회할 단어 입력: ")
    print()
    flag = 0
    for post in posts:
        if keyword in post.content:
            flag = 1
            print(f"- {post.title}")
    if not flag:
        print("검색 결과가 없습니다.")

# 게시글 작성
def create_post():
    print("인증이 필요한 메뉴입니다.\n")
    username = input("아이디: ")
    count = 0
    for member in members:
        if member.username == username:
            while count < 5:
                count += 1
                password = input("패스워드: ")
                if member.auth(password):
                    break
                print("잘못된 비밀번호입니다. 다시 입력해주세요.\n")
            if count >= 5:
                print("비밀번호를 5회 이상 틀렸습니다.")
                return
            break
    else:
        print("존재하지 않는 아이디입니다.")
        return
    print("\n인증되었습니다! 게시글 작성이 가능합니다.\n")
    title = input("제목: ")
    content = input("내용: ")
    posts.append(Post(title, content, username))
    print("작성이 완료되었습니다!")


def main():
    menu_name = [
        "회원가입",
        "회원목록 조회",
        "아이디로 게시글 조회",
        "키워드로 게시글 조회",
        "게시글 작성",
    ]
    menu = [
        create_member,
        show_member_name,
        search_by_id,
        search_by_keyword,
        create_post,
    ]
    print("\n게시판에 오신 것을 환영합니다!")
    while True:
        print("\n원하는 메뉴를 선택하세요!\n")
        for i in range(len(menu_name)):
            print(f"{i+1}. {menu_name[i]}")
        n = int(input("\n메뉴번호: ")) - 1
        print()
        if n > len(menu):
            print("잘못된 번호가 입력되었습니다.")
            continue
        menu[n]()
        if input("\n처음 화면으로 돌아가기 (Y/n): ") == "n":
            print("\n이용해 주셔서 감사합니다.!")
            break


main()
profile
안녕하세요

0개의 댓글