2013-08-04 5 views
0

배치 스크립트를 사용하여 텍스트 어드벤처 게임을 만들고 있는데 특정 시점에 자동 저장하도록 프로그램하는 방법이 있는지 알고 싶습니다.
내가 최근에 읽은대로 은 자신의 RPG 중 하나를 자동 저장하도록 코딩 한 적이 있지만 공개적으로 공개하지는 않았습니다.배치 기반 텍스트 어드벤처 게임으로 자동 저장 하시겠습니까?

배치 RPG/텍스트 모험으로 자동 저장을 게시하는 방법이 있습니까? 그렇다면 어떻게해야할까요?

+0

실제 프로그래밍 언어로 마이그레이션하는 것으로 시작하십시오. – Blender

+0

배치를 아는 다른 프로그래밍 언어를 공부해야한다는 뜻입니까? –

+0

@JacksonFydor - 아니요, 그는 Python, Java 등의 언어로이 RPG 어드벤처 게임을 만드는 것을 말합니다. 그런데 RPG 태그는 ** Role Playing Game이 아닌 ** Report Program Generator ** 용입니다. . – s0d4pop

답변

0

MS-DOS 배치 스크립트보다 모험 게임에 더 적합한 수백 가지 언어가 있습니다. Python, TCL, Lua, Java, C# 또는 일괄 처리 외 다른 언어를 사용해보십시오. 모델링을 잘 수행 할 수 있기 때문에 객체 지향 언어는 종종 판타지 어드벤처 게임에 사용됩니다. 지속성 프레임 워크 (예 : Hibernate)가있는 언어는 자동 저장에 편리 할 수 ​​있습니다. 그러나 이는 관계형 데이터베이스에 데이터를 저장하는 경향이 있으며 이는 모델링에도 유용합니다. 그러나 한 번에 너무 많이 물지 않으려 고 노력하지 마십시오.

매우 간단한 언어로 텍스트 기반 게임을 시도 할 마음이 있습니다. TCL로 잘 할 수 있습니다. 그러나 제가 말했듯이, 좋은 선택의 점수가 있습니다. 일괄 처리는 그 중 하나로 간주되지 않습니다.

+0

고마워요! 나는 ++를 약간 알고 있고, 그 언어로 코딩 할 수있는 프로그램을 가지고 있기 때문에 ether C++ 또는 C#으로 갈 수도있다. –

2

다른 사람의 진실성에 대한 집착을 추구 할 이유는 없습니다. 다른 언어와 마찬가지로 일괄 처리는 단점을 가지고 있지만 근본적인 방법론은 일반적입니다.

절차 언어에서는 수십 년 동안 비슷한 구조를 따랐습니다. 핵심은 단순히 사용자와 상호 작용하는 하나의 프로 시저 만 가질 수 있다는 것입니다. 나머지 프로그램은 사용자의 입력에 응답하여 한 상태에서 다음 상태로 진행되는 상태 머신이됩니다. 조금 익숙해 져야 할 수도 있지만, 배치, cobol, 파스칼, 기본, 진행, mantis 등에서이 원칙을 사용하여 성공적으로 (그리고 신속하게) 프로그램을 개발했습니다.

@ECHO OFF 
SETLOCAL 
SET state=0 
SET "savefile=" 
:mainloop 
CALL :state%state% 
IF %state% neq 999999 GOTO mainloop 
GOTO :EOF 

:: 
:: USER I/O 
:: 

:userio 
IF NOT DEFINED savefile GOTO useriolp 
set>%savefile% 
:useriolp 
SET "response=" 
SET /p response="%message% ? " 
IF NOT DEFINED response GOTO useriolp 
SET response=%response: =_% 
FOR %%r IN (EXIT quit) DO IF /i %response%==%%r SET state=999999&GOTO :EOF 
SET "state=" 
FOR %%r IN (%vr%) DO IF DEFINED state (
IF /i %%r==%response% GOTO :EOF 
SET "state=" 
) ELSE (SET state=%%r) 
IF DEFINED state GOTO :eof 
ECHO Invalid response 
GOTO useriolp 

::State 0 - get username 

:state0 
SET "vr=100" 
SET message=Your name 
GOTO userio 

:: State 100 - have username. 
:: Load user's savefile if it exists 

:state100 
SET savefile=%response% 
IF exist %savefile% GOTO S100.1 

:: New game - initialise data 
:: set start-state in STATE 

SET example=exampledata 

SET state=1000 
GOTO :eof 

:: Load game - including STATE 

:S100.1 
SET "state=" 
FOR /f "tokens=1*delims==" %%i IN (%savefile%) DO IF NOT defined %%i SET %%i=%%j 

GOTO :eof 

:: State 1000 - start game 

:state1000 

:: ** Just for a demo, show example as loaded from savefile 

ECHO example=%example% 

ECHO You see a shimmering blue-hued house with four doors numbered 1,2,3 and 4 
SET "vr=1001 1 1002 2 1003 3 1004 4 1001 one 1002 two 1003 three 1004 four" 
SET message=Which door do you choose 
GOTO userio 

:: State 1001 - door 1 

:state1001 
ECHO You see John Lodge 
SET example=John Lodge 
:: OK, from here, you're on your own. I'll force a state and loop 
SET state=1000 
GOTO :eof 


:: State 1002 - door 2 

:state1002 
ECHO You see Graeme Edge 
SET example=Graeme Edge 
:: OK, from here, you're on your own. I'll force a state and loop 
SET state=1000 
GOTO :eof 


:: State 1003 - door 3 

:state1003 
ECHO You see Justin Hayward 
SET example=Justin Hayward 
:: OK, from here, you're on your own. I'll force a state and loop 
SET state=1000 
GOTO :eof 


:: State 1004 - door 4 

:state1004 
ECHO You see Ray Thomas 
SET example=Ray Thomas 
:: OK, from here, you're on your own. I'll force a state and loop 
SET state=1000 
GOTO :eof 

위의 코드를 사용하면 스켈레톤을 볼 수 있습니다. :mainloop은 단순히 'exit until exit structure, where EXIT'이 state = 999999 인 것을 반복합니다. 나는 주 (state)에 숫자를 사용했지만, 이것은 선택의 문제 일뿐입니다. 유효 응답 세트 (vrvalid_responses보다 입력하는 것이 더 쉽습니다) - 어떤 특정 상태에 대한

, (선택적으로) 당신이 뭔가를 할 다음 프롬프트 메시지를 (즉, 배치 키워드의 prompt를 호출하지 않음) 설정 다음 응답을 허용 한 후 :mainloop에 반환 :userio 절차 (로 이동합니다.

:userio는 (따라서에 "자동 저장 '기능을 가진) 현재의 전체 환경을 저장하는 메시지와 함께하라는 메시지를 표시하고 응답을 acepts. Set /presponse을 떠나 이 입력되면을 입력하면 변경되지 않으므로을 설정하십시오. [nothing]에을 먼저 입력하면 을 입력하면 이전 응답이 반복되지 않습니다.

나는 어떤 문자가 밑줄로 입력 공간을 대체하기 위해 선택한 - 이것은 당신이 (이 완료 아니에요 문자열에 공백에 대해 걱정할 필요가 없습니다으로 쉽게 처리 할 수 ​​있습니다 - 쉼표, 탭 및 세미콜론, 리디렉터와 앰퍼샌드 수를 도) ... 문제가 될

다음에, 사용자는 또는 가 승강 상태가 할당 QUIT EXIT 들어가면.

그렇지 않으면 유효한 응답이 수신 된 응답과 일치합니다. vr 문자열은 단순히

nextstate ifthisresponse nextstate ifthisresponse nextstate ifthisresponse nextstateotherwise 

nextstateotherwise 표시 할 필요가 없다하고, 그렇지 않은 경우, invalid response 메시지가 생성되고 입력이 다시 요청했다.

상태 0부터, 당신은 당신의 이름을 약속 받았으며 다음 상태는 100이됩니다.

State100은 사용자의 응답 (이름)을 설정하고 해당 파일이있는 경우 savefile에 기록 된 모든 변수가 환경에 다시로드되어 프로그램이 마지막으로 실행 된 시간과 동일한 상태로 복원됩니다. EXIT ed. 파일이 존재하지 않는다면 필요한 게임 데이터를 만들 수있는 기회가 생깁니다. 이제 방금 변수로 example을 설정했습니다.

State1000이 게임을 시작합니다. 데모 용으로 example 값을 표시했습니다. state100-no-savefile에 설정된대로 exampledata으로 시작해야합니다. - 시나리오 설명을 얻고 프롬프트 메시지를 설정하면 vr은 응답이 (1 또는1) 인 경우 다음 상태를 1001로 정의합니다. 1002 (2 또는 2) ...

1,2,3 또는 4를 선택하면 다음 상태로 전환됩니다. example 문자열이 변경되고 - 음, 나는 state1000을 대상으로 지정했습니다. 당신이 할 일은 state1000에서 튀는 공을 따라 가기 만하면됩니다.

이제 - exit을 입력하면 프로그램이 종료됩니다. 다시 실행하고 동일한 사용자 이름을 입력하면 example의 값이 마지막으로 설정된 값으로 표시되고 savefile에서 복원됩니다.

조금 확장으로, 당신은 help 시스템을 추가 할 수 있습니다 - 단순히 FOR %%r IN (EXIT quit) ... 줄 끝에서

IF /i %response%==help call :help&goto useriolp 

에 추가하여. 현재 위치를 알려주는 값이 state이므로 :help 루틴을 상황에 맞는 루틴으로 만들 수 있습니다.

원한다면 같은 원칙으로 look 시스템을 구현할 수 있습니다.

모두 일괄 처리됩니다. 전혀 다른 언어는 필요 없습니다 ... :)

+0

위의 예와 관련된 문제가 있는데, "example ="행을 계속 보여주고 싶습니다. 또한 게임에 대한 기본 메뉴가 있으며 마지막으로 저장 한 점을로드 할 수있는 문자 나 숫자를 입력 할 수 있는지 알고 싶습니다. –

+0

아직 거기 있니? –

+0

나는 정말로 당신의 문제를 이해하지 못합니다. 나는 사용자 입력 (state0, state100)을 수락하고 처리하는 방법과 메뉴를 만들고 선택한 선택을 처리하는 방법을 시연 해 보았습니다. (State1000, state1001..1004) State100에서는 게임을 다시로드하는 방법을 보여줍니다. 나는 당신의 게임의 메커니즘이 무엇인지 전혀 모른다. 나는 변경 될 수 있고 게임이 다시 시작될 때 다시로드되는 변수의 예로'example'을 사용하고 있습니다. 'example'의 값을 표시하고 싶지 않으십니까? 벌금. 'example'에 대한 모든 참조를 제거하고'gold' 또는'credits' 또는'buckets_of_fish' 등을 처리하십시오. – Magoo

0

저장하려는 변수의 수에 따라 많은 양의 공간이 필요하지만 실제로는 매우 간단합니다. 실행중인 배치 파일과 동일한 디렉토리에 다른 배치 파일을 갖고 싶습니다. 이 배치 파일의 이름은 save.bat, variables.bat 등이 될 수 있습니다. 완료된 모든 작업에 대해 해당 배치 파일에 변수를 저장해야합니다. 예를 들어,

@echo off 
call save.bat 
:direction 
cls 
echo. 
echo Would you like to 
echo 1) go north 
echo 2) go south 
set /p answer=: 
if %answer% equ 1 goto north 
if %answer% equ 2 goto south 
cls 
echo. 
echo That command isn't recognized. 
echo. 
pause 
goto direction 
:north 
echo set /a money=%money%>>save.bat 
echo set /a health=%health%>>save.bat 
echo set /a mana=%mana%>>save.bat 
cls 
echo. 
echo You head North. 
echo. 
pause 
exit 
:south 
echo set /a money=%money%>>save.bat 
echo set /a health=%health%>>save.bat 
echo set /a mana=%mana%>>save.bat 
cls 
echo. 
echo You head South. 
echo. 
pause 
exit 

save.bat에 변수를 저장하는 방법을 알 수 있습니다.이 변수는 게임 시작시 호출됩니다. >>는 파일에 새 행을 추가 함을 나타냅니다. > 하나만 사용하면 이전부터 모든 것을 삭제하고 변수를 파일에 추가합니다. 모든 작업 후에 변수를 저장해야하지만, 그만한 가치가 있습니다.

@echo off 
call save.bat 
:direction 
cls 
echo. 
echo Would you like to 
echo 1) go north 
echo 2) go south 
set /p answer=: 
if %answer% equ 1 goto north 
if %answer% equ 2 goto south 
cls 
echo. 
echo That command isn't recognized. 
echo. 
pause 
goto direction 
:north 
call autosave.bat 
cls 
echo. 
echo You head North. 
echo. 
pause 
exit 
:south 
call autosave.bat 
cls 
echo. 
echo You head South. 
echo. 
pause 
exit 

을 그리고 autosave.bat의 내부 : 당신이 공간을 절약하려는 경우, 당신이 할 수

echo set /a money=%money%>>save.bat 
echo set /a health=%health%>>save.bat 
echo set /a mana=%mana%>>save.bat 

그래서 그래, 당신이 게임을 자동 저장하는 방법입니다.

관련 문제