Giter Club home page Giter Club logo

snakegame's Introduction

CLI-Snake

Requirements

  • Windows OS
  • MinGW32/64

Build

mingw32-make

Run

snake

Screenshot

Screenshot

snakegame's People

Contributors

hongyj9823 avatar mellime avatar sonhyewon avatar mtnight avatar dzutrinh avatar

Watchers

 avatar  avatar  avatar

snakegame's Issues

팀 내 협의한 프로젝트 수행 규칙

세종대학교 2020-1 오픈소스SW개론 5조

SnakeGame 클린코드 개선 및 기능 추가 프로젝트

회의를 거쳐 팀 전원이 동의한 수행 규칙을 댓글로 추가합니다.

mapArray 배열의 위치 변경

##문제 파트 및 상황 서술##
프로젝트 진행 중 mapArray 배열이 전역 변수로 선언되어 있지만 drawUI 함수에서만 사용하고 있는 것을 발견했습니다. 이에, mapArray 배열을 drawUI 함수의 지역 변수로 선언하는 것이 어떨지 팀원 분들의 의견을 구해보고자 합니다.

##원하는 작동 방식##
mapArray 배열이 지역 변수로써 drawUI 함수가 끝나면 사라졌으면 합니다.

##추가로 서술을 원하는 내용##
mapArray 배열을 지역 변수로 넣게 되면 drawUI 함수의 길이가 너무 길어져 오히려 가독성이 떨어지는 것이 아닌가 하는 우려가 들어, 지역 변수로 선언 시 두 가지 구현 방식 중 어느 것이 좋을지도 여쭤보고 싶습니다.

  1. 전역 변수로 선언된 내용 그대로 drawUI 함수 안에 넣는다.
  2. mapArray 배열을 지우고, 원본 코드의 box 함수처럼 for문을 통해 맵을 출력한다.

ui 헤더파일과 object헤더파일의 함수 이동

##문제 파트 및 상황 서술##

저는 스크린 구조체를 인자로 하는 함수들을 object 헤더 파일에 포함시키려 합니다. 그렇다면 오브젝트 헤더파일에 ui 헤더 파일을 인클루드 시켜야 하는데, 인클루드 후 컴파일 시켜보니 헤더 파일이 서로 충돌하여 오류가 납니다.

##해당 사항 개선을 위해 본인이 수행했던 내용(없을 시 생략)##

ifndef, define, endif 를 사용하여 헤더 파일들의 중복을 막으려 했지만, 헤더 파일 두 개가 서로를 참조하는 경우라 해결이 되지 않았습니다. #pragma once를 사용해 보려 했지만 이 또한 컴파일 오류를 일으켰습니다.

##원하는 작동 방식##

현재 ui 헤더 파일에서는 CELL 구조체만 필요하는 상황이라 CELL 구조체를 ui 헤더 파일로 옮기고 object 헤더 파일에 ui 헤더 파일을 인클루드 시킨 후, ui 헤더 파일은 아무것도 인클루드 하지않는 상태로 만드는 것이 어떨까 합니다.

뱀의 머리 방향을 바꾸는 조건 수정

##문제 파트 및 상황 서술##

main.c의 뱀의 머리 방향을 바꾸는 파트를 changeDir 함수로 함수화하던 중, 뱀의 현재 머리 방향이 바꾸고자 하는 방향과 반대 방향(ex. 위와 아래)이 아니라면 머리 방향을 지정한 값으로 변경하도록 설정이 되어 있는 것을 확인했습니다.
기존 snake game의 규칙에 따라 위와 같은 코드가 작성되어 있는 것은 이해했으나, 뱀의 현재 머리 방향이 바꾸고자 하는 방향과 같을 경우에도 값을 변경하는 것은 의미 없이 알고리즘이 돌아가는 경우라고 생각하였습니다. 따라서 뱀의 현재 머리 방향이 바꾸고자 하는 방향과 같거나 반대 방향이 아닐 때 머리 방향 값을 변경하는 것은 어떨지 팀 분들께 의견을 여쭤보고자 합니다.

##해당 사항 개선을 위해 본인이 수행했던 내용(없을 시 생략)##

changeDir 함수에서 뱀의 현재 머리 방향이 바꾸고자 하는 방향과 반대 방향인지 확인하는 조건문에 바꾸고자 하는 방향과 같은 방향인지 확인하는 조건을 && 연산자를 사용해 추가해보았습니다. 해당 코드가 문제 없이 작동하는 것은 확인하였습니다.

##원하는 작동 방식##

뱀의 현재 머리 방향과 바꾸고자 하는 방향이 같을 때, 뱀의 머리 방향 값을 바꾸는 알고리즘이 실행되지 않았으면 합니다.
해당 기능 구현이 바람직하다고 생각하신다면 구현 방식에 대한 의견 또한 여쭤보고자 합니다.

  1. changeDir 함수 내 조건문에 조건을 추가하는 방법.
    > 1번의 경우, 조건문을 함수화할 수도 있습니다.
  2. main 함수의 switch문에서 changeDir 함수 사용 전에 조건문을 추가하는 방법.
    위의 두 방법 외 다른 방법에 대한 의견이 있다면 감사히 받겠습니다.

mapArray 배열의 빌드 오류 문제

##문제 파트 및 상황 서술##
저는 vs2017에서 Pull requset #25 코드 리뷰를 진행하던 중 빌드 오류가 발생하는 것을 확인했습니다.
ui.c 파일에서 발생하는 오류 및 경고는 다음과 같습니다.

경고
C4045 mapArray: 배열 범위에 오버플로가 발생했습니다.
C4819 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.

오류
C2001 상수에 줄 바꿈 문자가 있습니다.

##해당 사항 개선을 위해 본인이 수행했던 내용(없을 시 생략)##
mapArray를 주석 처리하면 C4819 경고는 발생하나, 빌드는 정상적으로 되는 것을 확인했습니다.
mapArray 배열에 유니코드 문자를 사용했기 때문에 발생한 문제로 추측됩니다.

##원하는 작동 방식##
다른 팀원분들은 문제 없이 코드 리뷰를 진행하신 것을 확인했습니다. 따라서 제가 소스코드를 유니코드로 인코딩 한 후 진행할 수도 있겠으나, 모든 환경에서 실행할 수 있는 프로그램을 고려할 때 mapArray의 문자를 수정하는 것이 어떨까 하는 의견을 드립니다.

##추가로 서술을 원하는 내용(없을 시 생략)##
오류 C4819의 microsoft 공식 설명서 링크를 첨부합니다.
https://docs.microsoft.com/ko-kr/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4819?view=vs-2017

게임 오버 시 오브젝트 겹침 현상

##문제 파트 및 상황 서술##
현재 벽이 부딪히거나 뱀의 몸통에 닿으면 게임 오버가 되는데, 이 때 부딪힌 벽이나 몸통과 뱀 머리가 위치가 겹치게 됩니다. 보통은 겹치기 직전까지 화면이 그려지고, 겹치는 순간 사망 처리가 되어 겹친 상태까지는 그려지지 않긴 하지만... 이는 약간 주관적인 견해가 많이 포함될 여지가 있는 부분이라 팀원 분들의 의견을 듣고 싶습니다.

  1. 현재 상태 유지 (사망 원인과 뱀 머리 겹침)
  2. 변경 (사망 직전 상태 표시)

##원하는 작동 방식##
main.c 의 drawObject함수 호출 직전에 quit 변수를 확인해서 drawObject함수를 실행하지 않으면 상술한 상태를 그릴 수 있습니다.

##추가로 서술을 원하는 내용##
이것만 해서 사망 확인이 잘 안될 것 같다고 생각하시면, drawObject 함수에 quit을 인자로 준 다음 사망 시 뱀 색깔을 빨갛게 칠한다던가...? 와 같은 여러 방법이 있을 것 같습니다.

과일이 뱀의 몸통 부분에 생성되는 문제

##문제 파트 및 상황 서술##
게임에서 과일이 생성은 createFruit 함수에서 수행됩니다.
이때, createFruit 함수에서 과일의 좌표 할당 조건은 '맵 내부에 위치할 것' 뿐입니다.
때문에 뱀의 몸통 부분에 과일이 생성되기도 하고, 그럴 경우 사용자는 아무 방향으로 뱀을 이동시켜 과일의 위치를 확인한 후 다시 이동해야 하는 문제가 발생합니다.

##원하는 작동 방식##
createFruit 함수 내부, 혹은 새로운 함수를 작성하여 과일에 뱀의 기존 몸통 위치와 겹치지 않는 좌표를 할당하는 것이 필요합니다.

##추가로 서술을 원하는 내용(없을 시 생략)##
이는 추가 기능으로, 구현에 대한 아이디어는 자유롭게 토론해주시면 됩니다.

과일 x좌표의 짝수 보정 연산법 수정

##문제 파트 및 상황 서술##
저는 main.c에서 과일의 x, y, color 값을 설정하는 부분을 createFruit 함수로 분리하는 중입니다.
이때 과일의 x좌표는 짝수 값을 가져야 하고, 이를 위해 원본 코드에서 사용한 연산은 다음과 같습니다.

fruit.x = (rand() % screen.width) & ~1; /* force x even and within [0, MAXX-1] */

저희는 가독성 증진을 목적으로 코드를 개선중이기 때문에, 팀 회의에서 위의 연산법을 수정하자고 결론냈습니다. 그러나 구체적인 방법에 대해서는 논의하지 않은 듯 하여 이슈를 작성하게 되었습니다.

##원하는 작동 방식##
제가 생각한 방법은 다음과 같습니다.

bool isEven(int number){
	인자로 받은 수가 짝수인지 검사 후 
	짝수면 true, 홀수면 false 반환
}

void createFruit(SCREEN screen, FRUIT* fruit){
	//x좌표 연산만 표현
        CELL endP = screen.endPoint
	int tmpX

	tmpX = 과일의 x좌표를 우선 rand() % (endP.x) 로 생성
	fruit->x = ( isEven(tmpX) ? tmpX : (tmpX - 1) );

        //이후 y, color 값 등을 연산
}

숫자가 짝수인지 판단해주는 isEven 함수를 생성하여 createFruit에서 호출하는 방법입니다.
createFruit 함수에서는 먼저 임시로 tmpX에 랜덤 값을 저장하고, isEven의 반환값에 따라 삼항 연산자로 짝수 보정을 실행하는 것은 어떨까요?
다른 방법이나, 변수 이름에 대한 조언 등이 있다면 감사히 받겠습니다.

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.