게임 로직은 제외하고 그래픽만 비슷하게 따라해보기


확대해보니 pixelated돼있었다.
Figma로는 구현하기가 어려울듯.
그럼 aseprite?

aseprite에서 한다고 되는게 아니라 적절한 해상도를 찾아야 픽셀이 살아있을듯
그리고 셰이더나 이런게 아니라 그냥 위아래 그어놓은 선 2개만으로 tiled하고 대각선으로 회전시키면 되지 않을까
그건 아닌듯 그러면 aseprite에서도 직선으로 그려짐
aseprite 사용법을 모르니까 간단한 레이어 작업도 버벅인다 강좌를 한 번 보자
https://www.youtube.com/watch?v=7cz3msdSHDE

캔버스 사이즈 바꾸기 : Sprite > Sprite Size 또는 Canvas Size
원하는 영역만 남기고 자르기 : 영역 선택 > Sprite > Crop
그려진 영역만 남기고 영역 다듬기 : 레이어 선택 > Sprite > Trim
픽셀 단위로 격자 표시 : View > Show > Pixel Grid
원하는 크기로 격자 표시 : View > Show > Grid
브러시 크기 조절 : -/+ 키
브러시 모양 변경 : 좌측 상단 크기 px 표시 왼쪽 아이콘
타블렛 필압 설정 : 크기 px 표시 오른쪽 2번째 아이콘
픽셀아트식 명암 표현 : 좌측 상단 No Dithering > Bayer Matrix 고르기
Alt키를 눌러서 사용 가능
그림이 속해있는 레이어 자동 선택 : 좌측 상단 Auto Select Layer 토글
추가 선택 : 선택한 후 Shift 누르고 추가 선택
선택 취소 : 선택한 후 마우스 우클릭 누르고 영역 선택
(Magic Wand에서도 비슷하게 영역 추가 선택 및 취소 가능)
Contigous 토글 : 인접한 색만 선택할건지 / 레이어 상의 비슷한 색깔들도 다 선택할건지
(Gradient, Paint Bucket에도 같은 토글 존재)
레이어의 전체 이미지 선택 : Ctrl + T
이 상태에서 늘리거나 줄이거나 회전시키거나 비틀 수 있다
내가 지금 뭐 하고 있는건지 목적 의식을 잃은 것 같아서 일단 여기까지.

뭔가... 뭔가 찍히고 있음
재미는 있긴 한데 본격적으로 뭔가 만들려면 qwerty 키보드 말고 신디사이저나 마스터 키보드가 무조건 있어야할 것 같다는 생각밖에 안 듬.
당장은 그거 놓을 자리도 없고 음악이나 효과음은 우선순위가 저 뒤에 있어서 일단 보류. 가끔씩 멜로디 떠오르면 기록 정도는 해둘 수 있을듯.
프로그래머식 설명 : "3D 컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색을 정해주는 함수"
아티스트식 설명 : "그래픽 데이터의 음영과 색상을 계산하여 다양한 재질을 표현하는 계산 방법"
def dfs(i,j,cnt):
global N, M
if not (0<=i<N and 0<=j<M): return 0
if chk_board[i][j] == True: return 0
if cnt == 4: return 0
chk_board[i][j] = True
add=0
add=max(add,dfs(i+1,j,cnt+1))
add=max(add,dfs(i-1,j,cnt+1))
add=max(add,dfs(i,j+1,cnt+1))
add=max(add,dfs(i,j-1,cnt+1))
chk_board[i][j] = False
return board[i][j] + add
N,M=map(int,input().split())
board = [list(map(int,input().split())) for _ in range(N)]
chk_board = [[False for _ in range(M)] for _ in range(N)]
res=0
for i in range(N):
for j in range(M):
res = max(res,dfs(i,j,0))
print(res)
백트래킹 dfs로 하려고 했는데 ㅗ모양 테트로미노를 검증해주지 못함
해당 사례에 대해서 하드 코딩 하는 거 아니면 이 방법으론 불가능. 특정 방향으로 이미 뻗어나갔다면 다른 방향으로 뻗어나오는 것이 불가능하기 때문.
def dfs(i,j,cnt):
global N, M
dfs=[(i,j)]
res=0
cnt=0
layer=[]*4
layer[0]=board[i][j]
while(dfs):
x,y=dfs.pop()
layer[cnt]=board[x][y]
cnt+=1
깊이별 layer를 나눠서 dfs를 하는 방식으로 해보려다가 시간이 너무 늦어져서 그냥 답 봄
N, M = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range (N)]
v= [[0] * M for _ in range (N)] # dfs 방문 표시 배열
# 각 행에서 최대값을 찾은 뒤, 그 중 전체 배열의 최댓값을 찾음
mx = max(map(max, arr))
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def dfs(n, temp, lst) :
global ans
# 가지치기
if temp + (4-n) * mx <= ans : # 나머지 블럭이 모두 최댓값이어도 현재 ans 값보다 작다면 dfs 순회 정지
return
# 종료 조건
if n == 4 :
ans = max(temp, ans)
return
# 재귀 함수 호출 (자기 위치에서 뻗어나가기, 백트래킹)
for cx, cy in lst :
for i in range (4) :
nx, ny = cx + dx[i], cy + dy[i]
# 범위, 방문 검사
if 0 <= nx < N and 0<= ny < M and v[nx][ny] == 0 :
v[nx][ny] = 1
dfs(n+1, temp + arr[nx][ny], lst + [(nx, ny)])
v[nx][ny] = 0 # 방문표시 해제로 백트래킹
ans = 0
for i in range (N) :
for j in range (M) :
v[i][j] = 1
dfs(1, arr[i][j], [(i,j)])
print(ans)
백트래킹으로도 풀 수 있었다.
말도 안되게 비효율적인 코드이긴 한듯. 뻗어나간 모든 점에 대해 매번 상하좌우를 다시 검사해본다.

https://cobokjang.tistory.com/9
그냥 ad-hoc 때리는 방법도 있었다.
다른 코드들도 살펴보니까 이게 정석이긴 한듯.