Coder Social home page Coder Social logo

ios-rock-paper-scissors's Introduction

README

1. 제목: 묵찌빠 게임


2. 소개:

가위바위보를 통해 이긴사람이 묵찌빠 턴을 쥡니다. 묵찌빠는 승자가 나올때 까지 진행합니다!


3. 팀원

zhilly rhovin
profile1 rhovin

4. 타임라인

STEP-1 STEP-1

STEP-2 STEP-2


5. 시각화된 프로젝트 구조

File Tree

.
├── Case
│   ├── RockPaperScissorCase.swift
│   ├── TurnCase.swift
│   └── WinLoseDrawCase.swift
├── Library
│   └── RockPaperScissorsLibrary.swift
├── Protocol
│   └── RockPaperScissorsLibraryProtocol.swift
└── main.swift

Flow Chart

STEP-1

RPS-STEP-1

STEP-2

RPS-STEP-2


6. 실행 화면(기능 설명)

메뉴선택 & 가위바위보

사용자가 메뉴를 선택 가능하게 합니다. 사용자가 0번을 입력하면 프로그램을 종료합니다. 잘못된 입력을 하면 경고를 출력하고 다시 입력을 받습니다. 승패 결과가 나오게 되면 이긴사람이 턴을 쥐고 묵찌빠가 시작됩니다.


기능-종료


기능-1

묵찌빠

턴을 쥔 쪽을 출력해주고 사용자에게 입력을 받습니다. 사용자가 잘못된 입력을 하게 되면 턴은 컴퓨터에게 넘어가고 다시 입력을 받습니다. 마찬가지로 0을 입력받게 되면 프로그램을 종료합니다. 묵찌빠 승패 결과가 결정되면 누구의 승리인지 출력하고 게임을 종료합니다.


Cursor_및_RockPaperScissors_—_RockPaperScissorsLibrary_swift


기능-2


7. 트러블 슈팅

  • 캡슐화, 은닉화, 접근제어 Protocol과 접근제어를 통해 프로그램을 어떻게 캡슐화, 은닉화 할지 고민 했습니다.

    어떻게 캡슐화 했나?

    사용자에게 제공하는 인터페이스 함수를 제외한 모든 함수들을 RockPaperScissorsLibrary 로 패키징 해서 캡슐화 시켰습니다. 또한 RockPaperScissorsLibrary가 인터페이스 함수가 정의된 RockPaperScissorsLibraryProtocol 를 채택하도록 해서 패키징된 함수를 사용할 수 있게 했습니다.


    Protocol을 사용했나?

    Protocol을 사용함으로 사용자에게 프로그램의 인터페이스를 제시해 준다는 목적으로 사용했습니다.


    Extension을 사용했나?

    Extension을 사용한 이유는 RockPaperScissorsLibraryRockPaperScissorsLibraryProtocol 를 준수하도록 하기 위해 작성하였습니다.


    접근 제어는?

    RockPaperScissorsLibrary 내부에 있는 callStartGame()를 제외한 메스드들은 외부 소스파일에서 접근 및 사용되면 안되므로 private 접근제어자를 통해 내부 메서드들을 은닉화 시켜주었습니다.


  • 매직넘버

    소스 코드 안에 작성된 구체적인 숫자값 또는 문자열을 매직넘버, 매직리터럴 이라고 합니다. 여기서의 1, 2, 3 값에 대한 의미는 코드작성자가 아니고서야 한눈에 알아보기 힘들 것 같습니다. 어떻게 바꿔줄 수 있을까요?

    사용자 입력, 게임 승패, 게임 턴 케이스로 나누기 위해 열거형을 정의하여 가독성을 높힐 수 있도록 리펙토링 하였습니다.

    enum RockPaperScissorCase {
    	  case end
        case scissor
        case rock
        case paper
    }
    enum WinLoseDrawCase {
        case lose
        case win
        case draw
    }
    enum TurnCase: String {
        case ComputerTurn = "컴퓨터"
        case UserTurn = "사용자"
    }

  • 함수의 기능분리

    어떠한 기준으로 기능 분리를 하였나?

    하나의 함수는 하나의 기능만을 실행할 수 있다. 라는 기준을 잡고 최대한 함수들이 한 가지 기능만 실행할 수 있도록 기능 분리를 하였습니다. 따라서 코드의 가독성이 향상되고 유지보수에도 용이해졌습니다.


  • 게임 시작하는 함수 호출

    내부 로직에서 startGame() 이라는 함수가 조건에 맞게 계속 호출 되었어야 했습니다. 따라서 while문을 사용해서 호출을 할지 재귀함수를 이용해서 startGame() 내부에서 호출을 할지 고민을 했습니다. 프로젝트 단위가 크다고 생각하지 않고, 가독성을 위해서 재귀함수를 사용하는 방법을 이용해서 호출하였습니다.


  • 네이밍, 컨벤션

    함수의 역할을 의도에 맞게 전달될 수 있고, 함수 이름과 파라미터가 자연스럽게 읽혀질 수 있는 명확한 이름을 짓기 위해 고민했습니다.


  • if와 switch

    userHand와 computerHand를 각각 변수로 받아 if-else 문로 비교해서 게임 결과를 반환했는데, userHand와 computerHand를 hand라는 튜플로 묶어 swith문으로 분기처리 하였습니다.


8. 프로젝트 수행 중 핵심 경험

  • 열거형을 switch 문에 활용하기
  • class, struct에 대한 이해
  • protocol, extension에 대한 이해
  • 접근 제어자 5가지에 대한 이해
  • Swift Convention Guide를 지키며 코드 작성하기
  • 캡슐화, 은닉화 고민하며 코드 작성하기
  • 함수는 하나의 기능만 실핼할 수 있도록 기능분리하기
  • API Design Guidlines을 지키며 네이밍 정하기
  • Git Commit 단위 고민하기
  • 소스파일 역할에 따라 그룹화

9. 참고 링크

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.