메뉴 건너뛰기

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

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

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

-- 움직인 횟수 저장
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 printmap()
-- 맵을 표시하는 printmap 함수
    tempstr = ""

    for a = 1, 8 do
        for b= 1, 8 do
            tempbuffer = ""
            if (map[a][b] == 0) then
                tempbuffer = " "
            elseif (map[a][b] == 1) then
                tempbuffer = "#"
            end
           
        for c = 1, #box do
            if (box[c]["x"] == b and box[c]["y"] == a) then
                tempbuffer = "o"
                break
            end
        end
           
        if (playerx == b and playery == a) then
            tempbuffer = "P"
        end
       
        tempstr = tempstr..tempbuffer
        end
        print(tempstr)
        tempstr = ""
    end
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)

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

while(true) do
    -- 메인 무한 루프
    os.execute("clear") -- 화면을 지운다. OS가 아닌 Scite 환경에서는 제대로 동작하지 않음.
    printmap()
    print("")
    print("움직임: "..moves)
    print("어느 방향으로 이동할까요?")
    print("a: 왼쪽 d: 오른쪽 w: 위 s: 아래 q: 종료 :")
    choose = io.read()
    if (choose == "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 (choose == "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 (choose == "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 (choose == "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
    elseif (choose == "q") then
        os.execute("clear")
        print("그럼 안녕!")
        io.read()
        return
    end
end



제목이 꽤 길죠? 그만큼 많은 일을 했습니다. 이 부분이 소코반의 핵심 아니겠어요?


코딩은 안 어려운데 설명이 영... 하지만 까라면 까야죠, 뭐!

그냥 공장 견학하는 기분으로 설명합니다.


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


테이블인데 주석은 배열이에요. 그냥 써요(...)

루아의 테이블은 숫자 안에 문자열로도 인덱스를 넣을 수 있어서

box[1]["x"] = 1 이런것도 가능해요.


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


새 박스를 만드는 거.

#box 하면 지금 box가 몇개인지 알려줍니다.

그래서 새로운 박스를 하나 더 만들고 박스의 x값과 y값을 집어넣습니다.


        for c = 1, #box do
            if (box[c]["x"] == b and box[c]["y"] == a) then
                tempbuffer = "o"
                break
            end
        end


printmap 함수에서 발췌.

주인공 그리는것과 같은 방법으로 박스를 그립니다.


makebox(4,3)

makebox(4,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


x, y 좌표에 박스가 존재하는지 돌려주는 함수.

박스가 존재한다면 0이 아닌, box 테이블에 저장된 인덱스를 돌려줍니다.

박스가 존재하지 않으면 0을 돌려줌.


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


움직임 처리에서의 조건문들이 좀 많이 복잡해졌는데..

일단 플레이어의 앞에 벽이 없는 경우에만 처리합니다.

플레이어의 앞에 박스가 없으면 그냥 움직입니다.

박스가 있다면 플레이어의 앞 앞에 박스 혹은 벽이 없다면 박스를 옮기고 플레이어도 움직입니다.

더 효율적으로 처리할 수 있을지도 모르겠습니다만 게을러서 이런 걸 4개나 만들어놓고 말았습니다.


다음엔 목표 지점을 만들고, 목표 지점에 모든 상자가 옮겨지면 앤딩을 보여주도록 하겠습니다.

대망의 앤딩입니다~ 끝을 보자!


+

    코드의 양과 작업시간은 비례하지 않습니다.
    높으신 분들이 하시는 착각 중 하나.
    저 코드도 사실 복붙해서 만들었습니다.

    저런 코드는 나중에 변경 사항이 생기면 4단 모두 변경해줘야 하는데 까먹고 하나를 안 변경한다면 충격과 공포... 버그가 생기는 겁니다. 그러므로 저런 비효율적인 코딩보다는 효율적으로 여차저차 하는게 더 좋은데 그건 나중에 시간되면 보여드리겠습니다.

조회 수 :
677
등록일 :
2013.09.17
08:32:36 (*.209.135.92)
엮인글 :
게시글 주소 :
https://hondoom.com/zbxe/index.php?mid=study&document_srl=703462
List of Articles
번호 제목 글쓴이 조회 수sort 추천 수 날짜 최근 수정일
145 또질문 [2] 쿠로쇼우 2854   2008-09-29 2008-09-29 06:43
#include <stdio.h> int main (void) { int i=1,a=1,b=0,c=0,d=0; char ch[50]; char ca=0; FILE * file = fopen("a.txt", "rt"); if(file==NULL){ printf("NULL"); return 1; } while(1) { fgets(ch, 50, file); if(feof(file)!=0){ break;} else { fscanf(fi...  
144 똥똥배의 게임대회 이야기(2) [2] 혼돈 2816   2007-02-07 2008-03-17 04:37
2. 100KB 공모전의 추억 1회 규칙이 10M로 제한 된 것은 과거 100KB 공모전이 담겨있어서 입니다. 과거 100KB 공모전이라고 있었는데, 그 제한된 용량을 이용해서 다양한 작품이 나왔었죠. 그 중에 우수상을 탔던 것이 '삭제 되었수다'로서 오히려 제한된 용량...  
143 DirectX 창모드에서 화면 지워지는 문제 [7] file 똥똥배 2790   2010-12-12 2010-12-19 03:36
 
142 질문요.C++ [7] 질문자01 2729   2007-05-10 2008-04-03 05:32
도대체 파라미터가 뭔지 모르겠어요.  
141 SRPG을 구현하게 되면 ... [3] 짜스터 2708   2010-10-05 2013-11-23 04:38
지금 도트 제작단계로 넘어갈 예정인데 SRPG 시스템을 지원 해주실거면 무슨 툴로 하실건가요? 해상도에 따라서 도트 크기도 맞춰야 하는터라. 혹시나 생각하신것이 있으면 알려주세요.  
140 퀴즈소스입니다 허클베리핀님 라컨 2546   2005-08-23 2008-03-17 04:37
Private Sub Form_Click() If 시작 <= 1 Then MsgBox ("이제 왔군 학생") MsgBox ("이번이 시험인건 알고 있겠지?") MsgBox ("문제를 낼테니 잘 풀어라") 문제 = InputBox("흑곰의 이전 닉네임은 무엇이였나?") If 문제 = "답" Then MsgBox ("맞았군") Cls Pri...  
139 2중 for문을 돌릴 때 [3] 똥똥배 2539   2011-04-06 2011-04-07 17:08
제 경우, 원래는 이렇게 해야 정석인 코드를 for(int j = 0; j < y_size; ++j) { for(int i = 0; i < x_size; ++i) { //내용 } } 보기가 싫다는 이유로 for(int j = 0; j < y_size; ++j) for(int i = 0; i < x_size; ++i) { //내용 } 이런 식으로 적곤 ...  
138 이상하군요. [2] 대슬 2490   2008-05-16 2009-01-07 22:05
MIDI 음악을 메인 루프 앞에서 재생시킨 후 다른 음악을 재생시키려고 했더니 그 다음부턴 음악이 정지만 하고 재생이 되지를 않네요. 예전에 배고파요 만들었을 때는 비슷하게 해도 별 문제가 없었던 것 같은데, 왜 이러는지 잘 모르겠습니다. void bgm(int ...  
137 그림 출력의 순서를 알고 싶습니다. [3] X-tra 2466   2008-03-12 2008-03-17 04:37
제 글이 연구소로 가서 이번에는 신경써서 제목을 적었습니다 ㅡ.ㅡb 채색을 제외하면 전투도 70%정도 완성되었는데 자잘한 버그가 발생해서요. 제 스스로 알아 내려 했지만 확실하게 하기 위해서 물어 봅니다. 정확히 어떤 그림이 앞에 출력이 되고 어떤 그...  
136 데이터 축소에 대하여 [2] 짜스터 2430   2010-10-13 2013-11-23 04:38
환상수호전 : 티어크라이스 라는 닌텐도 게임을 알게 됬는데 컴퓨터 확장자 nds로 용량이 240메가 정도 밖에 안되는데 영상이나 성우 음성이 거의 풀로 유지되더군요. 데이터 품질을 최하로 해서 어느정도 볼만한 그래픽만 유지해서 용량을 최대한 축소시킨것 ...  
135 흥크립트 기초 질문. [2] 장펭돌 2430   2007-12-03 2008-03-17 04:37
지금 슬슬 설명서를 읽어나가는중... 기본 원리에서 다른건 대충 전부다 이해가 가지만, 몇가지 이해가 안가는 것이 있어서 질문 합니다. 우선 그림파일은 mlc로, 텍스트 파일은 dlg로 바꾸는것이 맞지요? 그렇다면, '게임 전체적으로 쓸 그림이라면 DATA폴더...  
134 흥크립트 키입력 질문 [1] A.미스릴 2363   2008-03-15 2008-03-17 04:37
키 클릭을 누르고 누른상태로 있는것도 인식할 수 있나영? 어떻게 하나요 ㅡ,.ㅡ  
133 흥크립트 0.9 새 기능 소개 [3] file 혼돈 2289   2007-10-15 2008-03-17 04:37
 
132 저는 사실 이걸 잘 못해요. [3] 앟랄 2282   2008-03-26 2008-04-18 07:45
알만툴 액알. 원리가 도저히 이해가 안 갑니다. 그림넣어서 설명해주세요. 그 뭐시기 그냥 근접공격만 일단. 나중가서 원거리를 합시다.  
131 명령문 질문드립니다. [1] X-tra 2244   2008-03-26 2008-03-27 00:40
변해서 게시판 찾기 어려울것 같았는데 이상하게 한번에 찾아 버렸네요. 연구소라고 적혀 있어서요... 이번건 질문이라고 하기에는 좀 애매합니다. 예전에 흥크립트의 모든 명령어가 적혀 있던 파일을 본 기억이 납니다. 하지만 아무리 찾아도 없더군요. 블로...  
130 '@클릭'이거 어떻게 사용하는거죠? [4] 네모상자 2244   2008-01-26 2008-03-17 04:37
'@영역선택'사용법은 역전심판 뜯어봐서 알 수 있겠는데, 이건 던전 앤 러버를 뜯을 수도 없고 해서 잘 모르겠네요. * 똥똥배님에 의해서 게시물 이동되었습니다 (2008-03-11 17:11)  
129 흥크립트 Ver0.9 변수 안의 변수 기능 [2] 혼돈 2208   2007-10-16 2008-03-17 04:37
상당히 고급기능이라 꼭 알 필요는 없지만, 잘 활용하면 배열이나 구조체 비슷하게 활용 가능합니다. 참고로 []를 쓰는 숫자변수와 {}를 쓰는 문자변수는 서로 다른 테이블을 쓰므로 이름이 겹쳐도 상관없습니다. [변수X] 1 [변수[변수X]] 10 {변수} "변수" {...  
128 조금씩 게임 소스가 완성 되어 가는데요. [2] 짜스터 2188   2010-11-16 2010-11-16 09:10
기획하고 연출 에서 직접 표현할려고 하는데 전투 시스템을 혹시 알만툴 XP 스크립트를 제작해주시는거는 안되시나요? 연출쪽까지 맡으셔서 하시면 무척 힘들어질듯 하는데, 구디스 씨라고 외국에서 만든 SRPG 스크립을 구하기는 해봤지만 창세기전 처럼 케릭...  
127 웹 프로그래밍을 배우려고 합니다. [2] Kadalin 2171   2008-03-22 2008-03-22 23:37
사용하는 형식에 따라 꽤 분야가 많은 것으로 알고 있습니다. 각각의 특징을 설명해 주세요.  
126 Divx6를 받아서 인코딩을 하려는데... 에러뜸... [3] 장펭돌 2154   2008-02-09 2008-03-17 04:37
Divx 공식 홈페이지를 가보니, 6가 있길래 받아서 동영상파일 (AVI)를 열면 이렇게 에러가 뜨는군여... ----------------------------------------------------------------- Invalid VIdeo Stream DivX Converter cannot encode the in put file: C:\Document...