Cocos2D를 설치하고 프로젝트를 만들어 실행해보자.

1. 파이썬 설치

우선 파이썬을 설치해야 한다. cocos2D-X는 파이썬 2.x 버전을 사용하여야 하며, 3.x 와 2.x버전의 파이썬은 크게 다르므로 3.x 버전을 사용할 시 터미널에서 raw input을 인식하지 못한다는 오류가 발생하게 된다.

https://www.python.org/downloads/release/python-2715/

 

Python Release Python 2.7.15

The official home of the Python Programming Language

www.python.org

필자는 2.7.15 버전을 사용하였다.

설치가 완료되면 환경 변수 설정을 해 주어야 한다. 

제어판 -> 시스템 및 보안 -> 시스템 

-> 고급 시스템 설정 -> 고급 -> 환경 변수 

로 들어가 사용자 변수와 시스템 변수 둘 다의 path를 편집하여 파이썬 2.x 버전이 설치된 경로를 추가해 주어야 한다.

파이썬 2.7의 경우 c:\Python27 에 설치된다.

설치 후 터미널에서 python을 입력해 2.x버전이 설치되었는지 확인하길 바란다.

2. cocos2d-x 다운로드

https://www.cocos.com/en/cocos2dx-download

 

Cocos - The world's top 2D&3D engine, game / smart cockpit /AR/VR/ virtual character / education

The world's top lightweight, efficient, cross-platform digital content development platform can meet different development needs for 3D, 2D, AR&VR and other unique content creation, and can provide complete solutions in frontier fields such as smart cockpi

www.cocos.com

cocos creator과 다르다.

cocos2dx는 3.x버전이 문서가 가장 많다고 하여 3.17.2로 진행하였다. 파일을 다운로드하고 압축을 해제한 뒤 파일 내의 setup.py를 실행한다.

 

이것을 파이썬으로 실행해 주면 터미널로 진입한다. 

ndk는 안드로이드 ndk를 말하는 것으로 안드로이드 개발 시 필요한 패키지인데 추후 필요할 경우 설치하면 된다. 지금은 기본적인 프로젝트를 위해 엔터를 눌러 스킵해준다.

과정이 끝나고 pc를 재부팅하면

사용자 변수에 COCOS_CONSOL...등 변수가 추가된다. 이 과정 후에도 터미널에 cocos를 입력하여 제대로 설치되었는지 확인하여야 한다.

제대로 설치되었다면 위처럼 나오게 된다. 

3. 프로젝트 생성

터미널에서 [cd 경로] 를 입력해 해당 경로로 이동하거나 원하는 경로에서 터미널을 열고, 새로운 프로젝트를 생성해 줄 것이다. 필자는 cpp으로 진행하였다.

cocos new [프로젝트 이름] -p [패키지 이름] -l [언어] 를 입력하면 정해진 경로에 프로젝트 폴더가 생성된다.

만들어진 폴더 내의 proj.win32로 진입하면 

이런식으로 파일들이 생성되어 있는 것을 확인할 수 있다. sln (솔루션)파일을 열고 확인을 눌러준 뒤 디버그를 진행하면

cocos2dx가 실행된다. 

1052번: 물병 (acmicpc.net)

 

1052번: 물병

지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번

www.acmicpc.net

1리터의 물이 들어있는 n개의 물병을 이용해 k개를 넘지 않는 비어있지 않은 물병을 만드는 문제이다. k개 이하의 물병을 만들기 위해서 상점에서 추가적으로 1리터의 물이 들어있는 n개의 물병을 사올 수 있는데, 이때 최소한으로 사오는 갯수를 구하여야 한다.

물은 아래와 같이 재분배한다.

먼저 같은 양의 물이 들어있는 물병 두 개를 고른다. 그 다음에 한 개의 물병에 다른 한 쪽에 있는 물을 모두 붓는다. 이 방법을 필요한 만큼 계속 한다.

.

#include <iostream>

using namespace std;

int test(int a) {
	int b = 0;
	while (1) {
		if (a == 1) {
			b++;
			break;
		}
		if (a % 2 == 1) {
			a--;
			b++;
		}
		else {
			a = a / 2;
		}
	}
	return b;
}

int main() {
	int n, k,a=0,b=1;
	cin >> n >> k;
	if (k >= n) {
		cout << 0;
	}
	else {
		while (1) {
			if (test(n)<=k) {
				break;
			}
			if (n % 2 == 0) {
				n = n / 2;
				b = b * 2;
			}
			else {
				n = n + 1;
				a = a + b;
			}
			
		}
		cout << a;
	}
}

 

나의 접근 방식은, 우선 같은 양의 물을 합칠 수 있을 만큼 합친 후, 홀수개가 되어 물병이 남게 될 경우 상점에서 추가로 물병을 사와 짝수개로 만들어주어 다시 합치는 방식으로 구현하였다. 예를 들어 100개의 물병이 있을 때 25개까지 합칠 수 있는데, 이 25개의 물병 각각의 물 양은 4리터가 될 것이다. 따라서 물병을 26개로 만들기 위해 상점에서 1리터 *4개의 물병을 사왔다.  이 과정에서 2,4,8,16,... 등 2의 제곱수만큼의 물병이 사올 때 마다 더해지게 된다.

루프 중 합쳐진 물병의 개수가 주어진 k개 이하로 나누어질 수 있는 경우 (이는 test함수를 구현하여 확인함. test의 경우 n을 2로 나눌 수 있을 만큼 나누고, 홀수가 된 경우 물병 하나를 빼는것과 동일하게 n에 -1을 해주었다. 최종적으로 n을 1까지 나누면 빼둔 물병에 n+1을 해주면 n개 물병을 합친 최솟값을 구할 수 있다.) 루프를 탈출하고 최종적으로 값을 출력하면 된다.

'백준' 카테고리의 다른 글

백준 1074번 - Z  (0) 2023.07.25
백준 1291번 - 이면수와 임현수  (0) 2023.07.24
백준 1002번 - 터렛  (0) 2023.07.23
백준 1051번 - 숫자 정사각형  (0) 2023.07.21
백준 2108번 - 통계학  (0) 2023.07.21

아이디어


개구리가 점프할 때 힘을 모아 한번에 멀리 점프하는 것을 보고 게임 진행 방식을 떠올림.

과정


개발 언어 : 파이썬

추후 유니티로 개발할 게임의 프로토타입으로 개발하였음.

아래는 원본 코드

froggame.py
0.02MB

 

게임 디자인과 구조

우선 게임을 시작하기 전 따로 바탕화면을 만들어서 play 버튼을 눌러 게임을 시작할 수 있도록 하였습니다.

조작할 키는 스페이스 바 뿐이기에, 게임이 시작되면 게임 내에 메시지를 띄워 간단한 조작법을 알려주었습니다. 스페이스바를 꾹 누르면 아래 게이지가 충전됩니다.

기본 땅과 공중에 떠있는 땅 두가지와 장애물들을 통해 스테이지를 구성했고, 보라색의 장애물에 닿으면 캐릭터가 일정 거리만큼 뒤로 밀려납니다. 점프하는 순간과 장애물에 닿는 순간에는 효과음을 추가해 주었습니다.

중간에 비어 있는 구멍으로 떨어지면 아래에 용암이 기다리고 있고, 이 용암에 닿으면 Game Over 가 화면 중앙에 표시됩니다. 이 경우 Restart 버튼을 눌러 게임을 다시 시작할 수 있도록 하였습니다.

모든 장애물을 통과한 뒤 결승 지점까지 도달하면, 화면 중간에 Clear!!!을 표시하고 움직임을 멈추게 됩니다.

2022년 1학년 1학기 여름방학 때 과 동기 5명과 모여 참가하였습니다.

복셀 에디터로 직접 랜드마크 건물들을 만들고, 이 건물들을 이용해 Unity에서 직접 미래의 서울시를 구현하는 과제를 맡았습니다.

아래는 당시 본인이 제작했던 건물들입니다.

 

 

시연영상 유튜브 링크 : https://youtu.be/5oRRIJMuRW4

깃허브 : 

프로젝트명 : Dignite

개발 기간 : 13일

Unity 엔진을 통해 개발하였음.

게임 소개 : '차원 변환 3D 플랫폼 퍼즐 게임'

아이디어


  • 슈퍼마리오와 같은 2d 플랫폼 게임에서 2.5d로 바뀌는 기믹을 생각해 내었고, 특정 장치를 통해 중력을 바꾸어 평소에 가지 못하던 곳에 갈 수 있도록 설계함.

조작법


이동: 방향키

점프: 스페이스 바

상호작용: F 키

게임 특징


  • 스토리 애니메이션 존재

게임 시작 시 1회에 한해 스토리와 함께 맵 전체를 보여줌

  • 세 가지 테마의 맵 (각 테마별 맵 4~5개 존재)
  1. Forest: 기본 테마로, 특별한 요소 없이 게임에 적응하는 단계이다.

간단한 퍼즐 위주이며, 게임에 적응할 수 있는 단계

    2. Winter: 두번째 테마로, 눈이 내려서 바닥이 미끄럽다는 특징이 있다.

컨트롤 실력을 조금 더 요구하는 맵

    3. Dungeon: 마왕에게 도달하기 직전의 테마로, 유령이 소환되어 플레이어를 쫓아간다.

높은 컨트롤 실력 뿐 아니라 동선을 효율적으로 잘 구성해야 클리어가 가능한 맵.

  • 차원을 바꿔주는 불
  1. 빨간불: 차원을 3D로 전환한다.
  2. 파란불: 차원을 2D로 전환한다.
  • 클리어 방법

장애물을 피하며 마왕이 만든 상자를 모두 열고, 골인 지점이 요구하는 차원의 상태로 골인 지점으로 가서 상호작용

(마왕이 만든 상자는 2D 상태에서만 열 수 있다.)

  • 레벨 선택 공간

레벨을 직접 선택하는 방식으로, 아직 클리어하지 못한 맵이 있다면 더 이상 나아가지 못한다.

이미 클리어한 맵도 다시 플레이가 가능하며, 모두 클리어 시 1회에 한해 엔딩 크레딧 이벤트 발생.

맵을 클리어하거나 중간에 다시 나오면 마지막에 들어간 맵에서 시작하도록 구현

  • 게임 시작 시 페이드 아웃 및 접근성 UI 구현, 배경음악과 효과 사운드 전체 구현, 자동 세이브 로드 기능 구현
  • 게임의 전체적인 시스템 구현에 초점을 두어 실제 완성된 콘솔 게임을 즐기는 것과 같은 경험을 제공하고자 하였음.

팀원 : 박형준(경희대 22, 본인), 김수연(경희대 22)

깃허브 링크 : https://github.com/spoiuy3/PuzzleGame

데모영상 유튜브 링크 : https://www.youtube.com/watch?v=dlWiOy2vUEU

당 팀 프로젝트는 Figma를 사용하여 2022년 후반기에 진행하였으며, 총 6명의 조원과 함께하였습니다.

애플리케이션 주제 : 카카오톡이나 다른 메신저의 대화 내용을 ai가 분석하고, 원활한 인간관계를 위해 적절한 솔루션을 제공, 대화 분석을 통해 타인과 나의 관계를 파악

 

정보 보안에 민감하기 때문에 face id로 로그인하는 방식을 고안하였음.

회원가입 시 필수 약관에 모두 동의하여야 진행 가능. 자세히 보기를 누를 시 약관 전체 표시

 

 

인물을 추가하거나 변경할 수 있으며, 아래쪽 메뉴 바에 여러 기능들 고안. (순서대로 연애 관련 정보 검색, 금주의 사례, 앱 설정, 종료)

연애와 관련된 키워드나 정보를 검색할 수 있는 기능 고안

메신저나 카카오톡, DM에서의 대화내용을 불러와 분석할 대상을 선택 가능.

대화 분석을 통해 간단한 솔루션을 제공하고, 자세히 보기를 통해 자세한 내용 확인 가능. 아래쪽에서 현재 관계를 확인할 수 있으며, 발전하고 싶은 관계를 수정함에 따라 솔루션을 다시 받을 수 있도록 고안.

 

본인이 수행한 역할 : 앱 기능 고안, 클릭하였을 때 창이 열리거나 다음으로 넘어가는 등의 스크립트 구현, 전체적인 디자인

 

https://www.acmicpc.net/problem/1074

 

1074번: Z

한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. N > 1인 경우, 배열을

www.acmicpc.net

크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 하는데, 예를 들어 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양으로 탐색하는 것이라고 한다.

이게 n이 3일때의 방문 순서도이다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;



int main() {
	int n;
	int r, c;
	vector< long long > range;
	cin >> n >> r >> c;
	int a = pow(2, n);
	int b = 0;
	int d = pow(2, n);
	int e = 0;
	range.push_back(0);
	range.push_back(pow(2, 2*n)-1);
	while (n>0) {
		long long x = range[1] - range[0] + 1;
		if (r >= (a+b)/2 && c >= (d+e)/2) {
			range[0] = range[0] + 3 * x / 4;
			b = (a + b) / 2;
			e = (d+e) / 2;
		}
		else if (r >= (a + b) / 2 && c < (d + e) / 2) {
			range[0] = range[0] + 2 * x / 4;
			range[1] = range[0] + x / 4 - 1;
			b = (a+b) / 2;
			d = (d+e) / 2;
		}
		else if (r < (a + b) / 2 && c >= (d + e) / 2) {
			range[0] = range[0] + x / 4;
			range[1] = range[0] + x / 4 - 1;
			a = (a + b) / 2;
			e = (d + e) / 2;
		}
		else {
			range[1] = range[0] + x / 4 - 1;
			a = (a + b) / 2;
			d = (d + e) / 2;
		}
		n--;
	}
	cout << range[0];
}

우선 본인은 숫자의 범위를 정해 놓고, n을 줄여가며 사분면에 따라서 수의 위치를 분류하는 방법을 사용했다. r,c의 범위에 따라서 사분면을 정하고, 그 사분면의 숫자들을 범위를 통해 다시 저장해 주는 방법을 사용했다.

'백준' 카테고리의 다른 글

백준 1052번 - 물병  (0) 2024.01.19
백준 1291번 - 이면수와 임현수  (0) 2023.07.24
백준 1002번 - 터렛  (0) 2023.07.23
백준 1051번 - 숫자 정사각형  (0) 2023.07.21
백준 2108번 - 통계학  (0) 2023.07.21

+ Recent posts