250804

lililllilillll·2025년 8월 4일

개발 일지

목록 보기
253/350

✅ 한 것들


  • 백준


🕹️ GMTK Game Jam 2025


포스트모템

  • 1일 차에 기획을 빠르게 정했어야 함. 최대 2시간내에 기획을 정하는 연습을 해야 함.
  • 기획의 스코프는 최대한 작아야 함. 스케일이 커지면 퀄리티를 다듬기 힘들기 때문. 다음에는 좀 더 간단하게 만들자.
  • 주제 해석이 참신하기만 하고 재미가 떨어졌던 것 같다.
    • 농사 게임이 잘 팔리는 이유는 노가다 이후 업그레이드에서 오는 성취감인데, 거기서 노가다만 가져온 뒤 특정 금액 달성이라는 목표를 억지로 이어붙여버림.
    • 사실 목표도 이해 못하고 2번 정도 죽고 꺼버렸을듯. 게임을 시작한 후에 좀 친절하게 안내를 하거나, 그럴 필요가 없을 정도로 간단했어야 했다. 게임잼에 적합하지 않은 복잡성과 초반 난이도였다.
    • 목표가 최종 금액 하나이니 성취감을 얻기 전의 모든 경험이 불쾌함이었다. 작은 성취의 경험을 줬어야 함.
  • 게임이 좀 무거울 것 같아서 웹 버전 업로드를 안 했는데, 플레이 접근성 면에서 엄청난 차이가 난다. 시간 남았었을 때 일단 웹으로 빌드해서 테스트는 해봤어야 함.
  • 웬만하면 스테이지 형식이 좋다. 질리지 않고 견고한 성취감을 줄 수 있기 때문. 간단한 기믹을 우려먹기에도 좋고.
  • 내러티브는 "Show, don't tell" 할 거 아니면 신경 안 쓰는게 나을 것 같다. 영어권 원어민이 아니기 때문.
  • 코드 퀄리티를 희생하고 개발 속도를 우선했는데도, 실전 경험치와 구현 자신감이 많이 쌓였다.
  • 픽셀 아트나 UGUI에 대한 경험치가 쌓이는게 실시간으로 보였다. 귀중한 성과다.
  • 3D, 벡터 그래픽 등 아트 장르를 하나 정해서 그럭저럭 봐줄만한 수준으로 끌어 올려야 한다. 아니면 아트를 구하던가.
  • 게임잼 하던 열정의 절반만 실제 출시에 사용해도 인디로도 충분히 먹고 살 수 있을듯. 더 열심히 하자는 뜻.
  • 랜덤 정렬 덕에 최소한의 유입은 보장된다. 게임만 잘 만들면 된다.
  • 게임잼 맞춤형 게임과 워크플로우가 싫어도 2달에 1번 정도는 나가자. 나같은 경쟁, 도파민 중독자에게 좋은 자극이다.


⚔️ 백준


2933 미네랄

bfs를 상,하,좌,우에 대해 해본다
상,하,좌,우 네 방향의 클러스터가 bfs 하다가 땅을 만나면 (i가 N-1인 블럭이 있다면) 떨어뜨리지 않음.
bfs의 방문 체크는 던지는 방향(0 또는 1로 표시)을 bool값에 넣는다.
bfs할 땐 크기 C인 vector 2개에 각 j에 대한 i의 최대치와 최소치를 갱신한다.
i의 최소치에서부터  다음 유효 블럭 까지의 거리를 구하고, 만약 최소치가 갱신됐다면 기준 낙하 위치를 갱신한다.
최대치와 최소치에 있는 블럭들을 최소 낙하 거리만큼 아래로 내린다.
(클러스터가 떨어지는 순서가 달라지면 모양도 달라지는 경우가 있는데, 문제에서 클러스터 2개가 동시에 떨어지는 일은 없다고 제한해줌.)
클러스터를 하나 떨어뜨리면 그 다음 막대 던지기로 넘어가도 된다.
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef vector<vector<int>> vvi;
typedef vector<vector<bool>> vvb;
typedef pair<int,int> pii;

int R,C,N,H; // H는 idx+1임
vvi cave;
vvi visited;
pii[4] dirArr = {{-1,0},{0,1},{1,0},{0,-1}};
queue<pii> q;

// 던지는 방향을 visit_flag로써 사용한다
bool isGrounded(int target, pii dir, int visit_flag, &pii minFallPoint)
{
    bool grounded = false;
    vector<int> maxHeight = new vector<int>(C,0);
    vector<int> minHeight = new vector<int>(C,100);
    
    // bfs 했는데 땅을 만나면 true, 못 만나면 false
    q.push({H-1+dir.first,target+dir.second});
    while(!q.empty())
    {
        pii ij = q.front(); q.pop();
        
        if(maxHeight[ij.second] <= ij.first) 
            maxHeight[ij.second] = ij.first;
        else if(minHeight[ij.second] >= ij.first)
            minHeight[ij.second] = ij.first;
        
        if(ij.first == 0) grounded = true;
        
        for(int i=0; i<3; i++)
        {
            int newi = ij.first + dirArr[i].first;
            int newj = ij.second + dirArr[i].second;
            if(0<=newi && newi<R; 0<=newj && newj<C
              && visited[newi][newj] != visit_flag)
            {
                q.push({newi,newj});
                visited[newi][newj] = visit_flag;
            }
        }
    }
    
    if(grounded) return true;
    
    // minFallPoint 구하기
    for(int j=0; j<C; j++)
    {
        for(int nc=minHeight[j]-1; -1<nc; nc--)
        {
            if(cave[nc][j] == 'x')
        }
    }
    
    
    
    return false;    
}

void Simulate(int leftOrRight)
{
    int target = -1;
    if(leftOrRight == 0)
        for(int j=0; j<R; i++)
            if(cave[H-1][j] == 'x') {target = j; break;}
    if(leftOrRight == 1)
        for(int j=R-1; -1<j; i--)
            if(cave[H-1][j] == 'x') {target = j; break;}
    
    pii minFallPoint = {-1,-1};
    for(int i=0; i<3; i++)
        if(isGrounded(target,dirArr[i],leftOrRight,&minFallPoint))
}

void Input()
{
    cin >> R >> C;
    cave = new vvi(R,vector<int>(C));
    visited = new vvb(R,vector<bool>(C,1));
    
    for(int i=0; i<R; i++)
        for(int j=0; j<C; j++)
            cin >> cave[i][j];
    cin >> N >> H;
}

int main()
{
    Input();
    for(int i=0; i<N; i++) Simulate(i%2);
}

내일 마저



profile
너 정말 **핵심**을 찔렀어

0개의 댓글