반응형

전체 글 148

15퍼즐 — 풀이 가능성을 보장하는 셔플 방식

오프라인 인디팩 · 개발일지15퍼즐 — 풀이 가능성을 보장하는 셔플 방식2026-06-08 · v1.0 · 퍼즐 게임 / 알고리즘요약 — 4×4 슬라이딩 퍼즐. 타일을 완전 무작위로 배치하면 절반의 확률로 풀 수 없는 배치가 나오기 때문에, 항상 완성 상태에서 시작해 유효한 이동만 반복해서 섞는다.완성 상태에서 거꾸로 섞기15퍼즐은 무작위 순열의 절반이 풀이 불가능하다(치환의 우기성 때문). 이걸 수학적으로 검증하는 대신, 애초에 항상 풀 수 있는 완성 상태에서 시작해 빈 칸과 인접한 타일을 400번 무작위로 교환한다 — 실제 게임처럼 손으로 섞는 것과 같은 원리다.for (int i = 0; i n != lastSwapped).toList(); final pick = neighbors[_ra..

[C# WPF] DesktopPet: 원하는 이미지를 항상 맨 위에 띄우는 프로그램

DesktopPet 소스 코드 다운로드아래 ZIP 파일에서 DesktopPet의 C# 소스를 내려받을 수 있습니다. Program.cs, 프로젝트 파일, 아이콘 리소스, README, .gitignore를 포함했습니다.실행 파일이 아닌 소스 공유용 ZIP입니다. Windows와 .NET 8 SDK가 필요하며, 압축을 푼 DesktopPet 폴더에서 dotnet build -c Release로 빌드하세요. 자세한 사용법과 자동 실행 주의 사항은 ZIP 안의 README.md에 정리했습니다. 빌드 결과물, 백업 파일, 개인 설정은 제외했습니다.개인 프로젝트 · 프로그램 소개DesktopPet: 원하는 이미지를 항상 맨 위에 띄우기Windows · C# · WPF · .NET 8요약 : DesktopPet은 ..

C# 2026.10.20

스택볼 — 12시 방향 세그먼트 판정과 각도 정규화

오프라인 인디팩 · 개발일지스택볼 — 12시 방향 세그먼트 판정과 각도 정규화2026-06-12 · v1.0 · 아케이드 / 각도 계산요약 — 회전하는 원판을 부수며 아래로 내려가는 게임. 공은 항상 화면 12시 방향에서 부딪히고, 그 순간 원판의 어느 세그먼트가 12시에 있는지를 역산해서 안전/위험을 판정한다.월드 각도에서 로컬 세그먼트 인덱스로12시 방향의 월드 각도(3π/2)에서 현재 회전값을 빼면 원판 기준 로컬 각도가 나온다. 이걸 세그먼트 하나의 각도 폭으로 나누면 인덱스가 나오는데, 음수가 나올 수 있어서 2π를 더한 뒤 다시 모듈로 연산으로 양수 범위로 맞춘다.final local = (worldAtTop - rotation) % (2 * pi);final positive = (lo..

계단 오르기 — 시간 게이지와 좌우 입력 매칭

오프라인 인디팩 · 개발일지계단 오르기 — 시간 게이지와 좌우 입력 매칭2026-05-29 · v1.0 · 아케이드 / 리듬요약 — 캐릭터가 좌/우로 번갈아 나오는 계단을 정확한 방향으로 밟아 올라가는 게임. 시간 게이지가 계속 줄어들고, 계단을 밟을 때마다 조금 회복된다.큐(queue) 기반 계단 관리앞으로 나올 계단들을 미리 생성해서 큐에 쌓아두고, 한 칸 오를 때마다 맨 앞을 빼고 뒤에 새 계단을 추가한다. 항상 일정 개수(12개)의 다음 계단을 미리 볼 수 있어서 UI가 예측 가능한 애니메이션을 그릴 수 있다.bool tap(StairDir input) { final next = nextDir; if (input != next) { gameOver = true; return false;..

스틱 히어로 — 상태 머신으로 표현한 막대 던지기

오프라인 인디팩 · 개발일지스틱 히어로 — 상태 머신으로 표현한 막대 던지기2026-06-08 · v1.0 · 아케이드 / 정밀 타이밍요약 — 탭을 누르고 있으면 막대가 자라고, 떼면 쓰러져서 다리가 되는 게임. ready → growing → falling → walking으로 이어지는 5단계 상태 머신으로 전체 흐름을 관리한다.5단계 phase로 나눈 전체 흐름각 단계는 update(dt) 안의 switch문에서 자기 역할만 담당한다. growing은 길이만 늘리고, falling은 각도만 90도까지 회전시키고, walking은 목표 x까지 이동만 시킨다. 단계 전환은 각 단계의 완료 조건에서만 일어난다.case StickHeroPhase.falling: stickAngle += (fallS..

스트룹 테스트 — 색상/글자 불일치로 인지 부하 만들기

오프라인 인디팩 · 개발일지스트룹 테스트 — 색상/글자 불일치로 인지 부하 만들기2026-06-02 · v1.0 · 두뇌 트레이닝 / 인지심리요약 — "빨강"이라는 글자가 파란색으로 쓰여 있을 때 색을 답할지 글자를 답할지 묻는 스트룹 효과 게임. 색상 모드, 글자 모드, 매 문제 무작위로 바뀌는 혼합 모드를 제공한다.30% 확률로 일치하는 쉬운 문제 섞기매번 색과 글자가 다르면 너무 어렵기만 하니, 30% 확률로 일부러 일치하는 문제(빨강이라 쓰고 빨간색)를 섞어 완급을 조절한다. 나머지 70%는 do-while로 일치하지 않을 때까지 재추첨한다.if (_random.nextDouble() 혼합 모드는 매 문제 질문 대상이 바뀜mixed 모드에서는 이번 문제가 "색을 맞히는 문제"인지 "글자를 ..

대리점 전용 API를 별도 패키지로 분리하기 — 같은 서버, 다른 권한 경계

실무 프로젝트 · 개발일지 대리점 전용 API를 별도 패키지로 분리하기 — 같은 서버, 다른 권한 경계 Spring Boot · 멀티 테넌트형 API 요약 — 일반 사용자/파트너 API와 완전히 분리된 패키지에 대리점(지사) 관리자 전용 API를 모아뒀다. 지역 코드 하나로 그 지사 소속 데이터만 조회되도록 파라미터 경계를 명확히 뒀다. 1. 지역 코드를 모든 조회의 필수 파라미터로 지사 홈 화면의 "우수 영업자 조회", "가입수 조회" 같은 API는 전부 {jisa_code}를 경로 파라미터로 받는다. 이 코드가 없으면 조회 자체가 불가능한 구조라, 다른 지사의 데이터를 실수로 노출할 여지를 API 설계 단계에서부터 차단한다. @RequestMapping("/jisa_v..

SpringBoot (JAVA) 2026.10.11

스도쿠 — 시드 그리드 변형으로 무한한 유효 보드 생성

오프라인 인디팩 · 개발일지스도쿠 — 시드 그리드 변형으로 무한한 유효 보드 생성2026-06-08 · v1.0 · 퍼즐 게임 / 조합론요약 — 매번 새로운 스도쿠를 생성하기 위해, 검증된 시드 그리드 하나를 숫자 치환·행/열 셔플·전치 등 6단계 변형을 거쳐 완전히 다른 유효한 보드로 바꾼다.6단계 변형: 치환 → 밴드 내 셔플 → 스택 내 셔플 → 밴드 셔플 → 스택 셔플 → 전치스도쿠는 특정 변형을 가해도 유효성이 깨지지 않는 성질이 있다. 숫자 1~9를 다른 숫자로 통째로 바꿔도, 같은 3행 묶음(밴드) 안에서 행 순서를 바꿔도, 대각선 전치를 해도 여전히 스도쿠 규칙을 만족한다. 이 6가지를 순서대로 적용하면 원본과 전혀 달라 보이는 새 보드가 나온다.// 1) 숫자 치환final per..

공통 텍스트 스타일 — 크기별 네이밍 규칙으로 200개 가까운 스타일 관리하기

실무 프로젝트 · 개발일지 공통 텍스트 스타일 — 크기별 네이밍 규칙으로 200개 가까운 스타일 관리하기 Flutter · GetX 요약 — 색상+굵기+크기 조합을 매번 TextStyle로 새로 만들지 않고, "색상Bold크기" 형태의 명명 규칙을 가진 필드로 미리 다 정의해둔 스타일 클래스. 플랫폼별 폰트 크기 보정도 이 안에서 흡수한다. 1. 네이밍 규칙 하나로 어떤 스타일인지 바로 유추 가능 black14는 검정색 14사이즈, blackBold16은 검정 굵게 16사이즈처럼, 필드 이름만 보고 색상·굵기·크기를 바로 알 수 있게 통일했다. 새 스타일이 필요하면 기존 패턴을 따라 필드 하나만 추가하면 되니 디자인 시스템처럼 일관성을 유지하기 쉽다. TextStyle b..

Flutter & Dart 2026.10.10

v1에서 v2로 — 기존 컨트롤러를 참조하며 점진적으로 옮겨간 버전 관리

실무 프로젝트 · 개발일지 v1에서 v2로 — 기존 컨트롤러를 참조하며 점진적으로 옮겨간 버전 관리 Spring Boot · REST API 버전 관리 요약 — v2 컨트롤러는 처음부터 새로 짜지 않고, v1의 컨트롤러/서비스를 생성자로 주입받아 재사용하면서 새 응답 구조나 추가 로직만 v2 계층에 얹는 방식으로 마이그레이션했다. 1. v2가 v1을 주입받아 감싸는 구조 BaseController2는 자체 서비스(BaseService2)뿐 아니라 v1의 PortOneController, MessageController, AuthController까지 생성자로 주입받는다. 완전히 새로 구현하는 대신 검증된 v1 로직을 그대로 호출하고, v2에서 달라져야 하는 부분만 새로 얹는..

SpringBoot (JAVA) 2026.10.09
반응형