메뉴 건너뛰기

창작에 관련된 질문이나 간단한 팁, 예제를 올리는 곳

-- 플레이어 위치를 저장하는 변수
-- 초기 시작지점은 5, 5로 설정.
playerx = 5
playery = 5

-- 박스의 위치를 저장하는 배열.
box = {}

-- 박스 목표 지점의 위치를 저장하는 배열.
goal = {}

-- 움직인 횟수 저장
moves = 0

-- 맵 데이터를 저장하는 8*8의 2차원 배열 Map 생성
map = {}
for a = 1, 8 do
    map[a] = {}
    for b = 1, 8 do
        map[a][b] = 0
    end
end

function makebox(x, y)
-- 새 박스를 만든다.
    box[#box + 1] = {}
    box[#box]["x"] = x
    box[#box]["y"] = y
end

function makegoal(x, y)
-- 새 목표 지점을 만든다.
    goal[#goal + 1] = {}
    goal[#goal]["x"] = x
    goal[#goal]["y"] = y
end

function successed()
-- 모든 박스가 목표 지점 위에 놓여 있는가?
for a = 1 , #goal do
    if boxexist(goal[a]["x"], goal[a]["y"]) == 0 then
        return false
    end
end
return true
end

-- 맵 데이터 초기화
for a = 1, 8 do
    for b = 1, 8 do
        if (a == 1 or a == 8 or b == 1 or b == 8) then
            map[a][b] = 1
        end
    end
end

makebox(4,3)
makebox(4,6)

makegoal(5, 3)
makegoal(5, 6)

function boxexist(x, y)
    for a = 1, #box do
        if (box[a]["x"] == x and box[a]["y"] == y) then
            return a
        end
    end
    return 0
end

function love.load()
    tile = love.graphics.newImage("nokoban.png")
    -- 쿼드 만들기
    tileq = {}
    for a = 1, 6 do
        tileq[a] = love.graphics.newQuad(32 * (a - 1), 0, 32, 32, 192, 32)
    end
end

function love.draw()
    tempbuffer = 0
    for a = 1, 8 do
        for b = 1, 8 do
            if (map[a][b] == 0) then
                tempbuffer = 3
            elseif (map[a][b] == 1) then
                tempbuffer = 2
            end
           
            for c = 1, #box do
                if (box[c]["x"] == b and box[c]["y"] == a) then
                    tempbuffer = 5
                    break
                end
            end
           
            for c = 1, #goal do
                if (goal[c]["x"] == b and goal[c]["y"] == a) then
                    if (tempbuffer == 5) then -- 상자와 목표 지점이 겹친다면
                        tempbuffer = 6
                    else
                        tempbuffer = 4
                    end
                    break
                end
            end
           
            if (playerx == b and playery == a) then
                tempbuffer = 1
            end
           
            -- 그린다
            love.graphics.drawq(tile, tileq[tempbuffer], (b - 1) * 32, (a - 1) * 32)
        end
    end
end

function love.keypressed(key)
    if (key == "a") then
        if (map[playery][playerx - 1] == 0) then
            if (boxexist(playerx - 1, playery) ~= 0) then
                if (boxexist(playerx - 2, playery) == 0) then
                    if map[playerx - 2][playery] == 0 then
                        box[boxexist(playerx - 1, playery)]["x"] = box[boxexist(playerx - 1, playery)]["x"] - 1
                        playerx = playerx - 1
                        moves = moves + 1
                    end
                end
            else
                playerx = playerx - 1
                moves = moves + 1
            end
        end
    elseif (key == "s") then
        if (map[playery + 1][playerx] == 0) then
            if (boxexist(playerx, playery + 1) ~= 0) then
                if (boxexist(playerx, playery + 2) == 0) then
                    if map[playerx][playery + 2] == 0 then
                        box[boxexist(playerx, playery + 1)]["y"] = box[boxexist(playerx, playery + 1)]["y"] + 1
                        playery = playery + 1
                        moves = moves + 1
                    end
                end
            else
                playery = playery + 1
                moves = moves + 1
            end
        end
    elseif (key == "d") then
        if (map[playery][playerx + 1] == 0) then
            if (boxexist(playerx + 1, playery) ~= 0) then
                if (boxexist(playerx + 2, playery) == 0) then
                    if map[playerx + 2][playery] == 0 then
                        box[boxexist(playerx + 1, playery)]["x"] = box[boxexist(playerx + 1, playery)]["x"] + 1
                        playerx = playerx + 1
                        moves = moves + 1
            end
                end
            else
                playerx = playerx + 1
                moves = moves + 1
            end
        end
    elseif (key == "w") then
        if (map[playery - 1][playerx] == 0) then
            if (boxexist(playerx, playery - 1) ~= 0) then
                if (boxexist(playerx, playery - 2) == 0) then
                    if map[playerx][playery - 2] == 0 then
                        box[boxexist(playerx, playery - 1)]["y"] = box[boxexist(playerx, playery - 1)]["y"] - 1
                        playery = playery - 1
                        moves = moves + 1
                    end
                end
            else
                playery = playery - 1
                moves = moves + 1
            end
        end
    end
end



역시 변경된 부분만 설명드리겠습니다.



function love.keypressed(key)
    if (key == "a") then
        if (map[playery][playerx - 1] == 0) then
            if (boxexist(playerx - 1, playery) ~= 0) then
                if (boxexist(playerx - 2, playery) == 0) then
                    if map[playerx - 2][playery] == 0 then
                        box[boxexist(playerx - 1, playery)]["x"] = box[boxexist(playerx - 1, playery)]["x"] - 1
                        playerx = playerx - 1
                        moves = moves + 1
                    end
                end
            else
                playerx = playerx - 1
                moves = moves + 1
            end
        end
    elseif (key == "s") then
        if (map[playery + 1][playerx] == 0) then
            if (boxexist(playerx, playery + 1) ~= 0) then
                if (boxexist(playerx, playery + 2) == 0) then
                    if map[playerx][playery + 2] == 0 then
                        box[boxexist(playerx, playery + 1)]["y"] = box[boxexist(playerx, playery + 1)]["y"] + 1
                        playery = playery + 1
                        moves = moves + 1
                    end
                end
            else
                playery = playery + 1
                moves = moves + 1
            end
        end
    elseif (key == "d") then
        if (map[playery][playerx + 1] == 0) then
            if (boxexist(playerx + 1, playery) ~= 0) then
                if (boxexist(playerx + 2, playery) == 0) then
                    if map[playerx + 2][playery] == 0 then
                        box[boxexist(playerx + 1, playery)]["x"] = box[boxexist(playerx + 1, playery)]["x"] + 1
                        playerx = playerx + 1
                        moves = moves + 1
            end
                end
            else
                playerx = playerx + 1
                moves = moves + 1
            end
        end
    elseif (key == "w") then
        if (map[playery - 1][playerx] == 0) then
            if (boxexist(playerx, playery - 1) ~= 0) then
                if (boxexist(playerx, playery - 2) == 0) then
                    if map[playerx][playery - 2] == 0 then
                        box[boxexist(playerx, playery - 1)]["y"] = box[boxexist(playerx, playery - 1)]["y"] - 1
                        playery = playery - 1
                        moves = moves + 1
                    end
                end
            else
                playery = playery - 1
                moves = moves + 1
            end
        end
    end
end


쓸데없이 코드 양은 많은데 바뀐 건 없습니다, 복사/붙여넣기니까요.

io.read()를 사용해서 입력을 받다가 이제 love.keypressed 콜백으로 받습니다.

key 변수에 무슨 키를 눌렀는지를 입력받게 되고

a, s, d, w에 맞는 처리를 하게 됩니다.


왠지 날로 먹는 이 날의 글은 이것으로 끝. 이거 구현하는데 몇일 걸린 걸 생각하면 그저 엉엉.

다음부터는 옮긴 횟수와 설명을 보여주고, 모든 상자가 제 자리로 돌아가면 끝내는 걸 마지막으로 끝내겠습니다.

소코반 끝내고 다음에 뭐 만들지? 슈팅 게임이라도 만들까? 아니면 5분짜리 RPG 같은 것?
조회 수 :
832
등록일 :
2013.09.18
08:04:21 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703965
List of Articles
번호 제목 글쓴이 조회 수 추천 수 날짜 최근 수정일sort
65 똥똥배의 게임대회 이야기(4) [1] 혼돈 2881   2007-02-10 2011-02-11 12:52
4. 공모전도 커뮤니케이션 게임을 만들기 전에 먼저 생각해야 하는 것은 게임을 하는 사람들입니다. 그래서 게임회사라면 시장조사가 가장 먼저 해야 할 일입니다. 회사에서 만든 게임을 얼마나 많은 게이머들이 즐길지 알고 예상되는 수익을 계산하고 거기에 ...  
64 똥똥배의 게임대회 이야기(3) [1] 혼돈 3007   2007-02-08 2011-02-11 12:53
3. 아마추어다운 게임이란 무엇인가? 아마추어는 자유롭습니다. 자신이 원한다면 무엇이든 표현할 수 있습니다. (심하게 비윤리적이라면 문제가 되겟지만) 하지만 프로는 그렇지 못합니다. 일단 상업성 때문에 '돈이 되는' 게임을 만들어야 하고, 수많은 사람...  
63 똥똥배의 게임대회 이야기(2) [2] 혼돈 2816   2007-02-07 2008-03-17 04:37
2. 100KB 공모전의 추억 1회 규칙이 10M로 제한 된 것은 과거 100KB 공모전이 담겨있어서 입니다. 과거 100KB 공모전이라고 있었는데, 그 제한된 용량을 이용해서 다양한 작품이 나왔었죠. 그 중에 우수상을 탔던 것이 '삭제 되었수다'로서 오히려 제한된 용량...  
62 똥똥배의 게임대회 이야기(1) 혼돈 2953   2007-02-06 2008-03-17 04:37
지금부터 제 이야기를 잘 들어 두시는 게 수상의 열쇠가 될지도 모릅니다. 제가 끝판 보스도 아니고, 공지 내놓고 마감일까지 기다리는 것은 지루하니 이런 저런 이야기를 들려 드리도록 하죠. 1. 지금 여러분이 해야 할 일 지금 개학인데 왜 하필 시작하냐는 ...  
61 안녕하세요~ 질문하러 왔습니다. [6] X-tra 1894   2008-03-09 2008-03-17 04:37
소리재생에 문제가 생겨서 질문드립니다. 제가 대화가 넘어갈때마다 소리를 재생하기 위해서 @소리 1, "MAIN\SE\스킵.ogg" 대화가나불나불~ @소리재생 1 를 메모장에 적었습니다. 그런데 소리가 나오지 않는겁니다. 버그리포트에는 "사운드 파일을 찾을 수 없...  
60 질문 하나더. [3] 흑곰 1715   2008-02-13 2008-03-17 04:37
1 아무 것도 없이 빈 줄 혹은 주석이 속도에 영향을 미치는지. @이동 등에서 영향을 미칠 것으로 추측됨. 2 @이동 -1 을 하면 무시되어 다음 줄을 읽게 되나요? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:26)  
59 갑자기 급질문.. 궤레브 1737   2008-02-08 2008-03-17 04:37
별 특별한건 아니구요 변수 강좌 보니까 ? 가 사용되더라구요? ?는 무슨 의미인가요? [분기] ([레벨]==16)?91:[분기] [분기] ([레벨]==15)?92:[분기] [분기] ([레벨]==14)?93:[분기] [분기] ([레벨]<=13)?94:[분기] @이동 [분기] 여기서 보면 [레벨]==16 이런...  
58 [re] 갑자기 급질문.. [1] 똥똥배 1548   2008-02-08 2008-03-17 04:37
>별 특별한건 아니구요 >변수 강좌 보니까 ? 가 사용되더라구요? >?는 무슨 의미인가요? > >[분기] ([레벨]==16)?91:[분기] >[분기] ([레벨]==15)?92:[분기] >[분기] ([레벨]==14)?93:[분기] >[분기] ([레벨]<=13)?94:[분기] >@이동 [분기] > >여기서 보면 >[...  
57 마우서 포인트 바꾸기 질문 다시 ㄱ- [2] 장펭돌 1807   2008-02-05 2008-03-17 04:37
똥똥배님이 알려주신대로, DATA 폴더내에 mlc 파일을 하나 생성하고, 커서에 "파일명" 이렇게 재대로 했는데.. 안됩니다. 똥똥배님은, Global.mlc 를 이용할수 있지만, 저는 Global.mlc 내에 그림파일을 추가시킬수가 없어서 안되는거 아닙니까? * 똥똥배님에 ...  
56 마우스 포인터 바꾸기가 안되네요... +질문2 장펭돌 1748   2008-02-04 2008-03-17 04:37
어떻게 해도 자꾸 마우스 모양이 안보이길래... 아예 mlc 파일을 DATA폴더 밖으로 꺼내고... System.txt와 같이 둔 상태로 그림 파일명이 "마우스" 이므로.. {#커서} "마우스" 이렇게 해봤는데도 안되네요... 으음,, 어떻게 해야하는겁니까... ㅇ 질문 2 "DIVX...  
55 {질문}그림에대한 질문일세. [5] 슈퍼타이 1703   2008-01-30 2008-03-17 04:37
뭐 만화에서보면 눈이 빛나거나 빠르게 달리는것처럼 효과주고 점프할때 바닥에 ^^ 이런식으로 효과 주는거나 빙글빙글돌때는 주변에 원같은거 그려주고 그런걸 뭐라고 하죠? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:26)  
54 혼돈님께 질문 흑곰 1596   2007-12-25 2008-03-17 04:37
혼돈님의 경우에는 게임 그래픽을 언제, 어떻게 준비하나요? 음... 그러니까 대충 뼈대 그래픽을 그려놓고 게임을 완성한 후 그래픽을 고친다 라던가, 그래픽을 전부 작성해두고 게임을 완성한다, 혹은 그래픽을 만들어가며 게임을 제작한다 등등... 다년간의 ...  
53 [re] 혼돈님께 질문 혼돈 2048   2007-12-25 2008-03-17 04:37
옛날에 뼈대를 그려놓고 일단 게임을 만들자는 주의였는데 나중에 완성하고 나면 고치기도 귀찮고, 그 그래픽에 맞춰 만든 거라서 그냥 그대로 쓰게 되는 경우가 많았음. 그래서 그 다음부터는 처음부터 그래픽 소스를 제대로 준비한 뒤 시작하는 식으로 했습...  
52 홍크립트에 질문이 있어서 왔스므니다. [3] X-tra 1699   2007-12-07 2008-03-17 04:37
제가 홍크립트로 와이드 화면의 게임이 만들고 싶어 질문하러 왔습니다. 메모장으로 해결이 가능 하면 좋겠으나 아마도 무리 겠죠 ㅡ.ㅡ;; 소스를 건드려야 하면 어디를 건드려야 하는지 알려 주셨으면 합니다. 직접 건드리고 싶어서도 문제가 발생하면 많은 ...  
51 질문 2가지+1 [2] file Wonder 1964   2007-11-30 2008-03-17 04:37
 
50 혼돈형에게 질문! [3] 장펭돌 1851   2007-11-28 2008-03-17 04:37
만화를 그릴때, 우선 손으로 그리지 않습니까 그럼 그린뒤에 스캔해서 컴퓨터로 옮긴뒤에 펜으로 그려진 선을 잘 보정해 줘야 채색이 가능할텐데, 어떻게 선을 다시 컴퓨터로 그려주나여 그냥, 노가다로 마우스로 원래 펜으로 그린 선을 따라서 그려주는 겅미?...  
49 혼돈형한테 질문 (페인트샾 관련) [2] file 장펭돌 939   2007-11-19 2008-03-17 04:37
 
48 스크립트 질문좀 하겠습니다....이벤트에 대한것!! [2] 여유 1859   2007-04-23 2008-03-17 04:37
Class Quick_status < Game_Player 아니면 Class Quick_status < Game_Event 어떤걸로 하는것이 옳은 선택일까요 그리고 이벤트의 X,Y좌표 이벤트의 Screen_x,y좌표(화면 XY좌표) 이벤트의 ID 이벤트의 이름 이것들을 나타낼 수 있는 방법을 알려주세요 예) a...  
47 [질문]알만툴 게임 [1] 허클베리핀 1974   2006-12-28 2008-03-17 04:37
처음 키면 ascll 로고뜨고 eb!회사 로고뜨는 나오는거 그림 어케바꾸나욤?? * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 14:24)  
46 여러분 질문있어요. 성심성의껏좀 알려주세요 흑흑 [6] 케르메스 2022   2006-02-11 2008-03-17 04:37
sw = 0; for (j=2; j<WWT; j++) { if ((WWT%j) == 0) { sw = 1; } } if(sw ==1) { cout << "WWT는 정수입니다" } if(sw ==0) { cout << "WWT는 정수가 아닙니다" } -------------------------------------------------------------- 이건 변수인 WWT가 정수인...