批量Roguelike游戏

时间:2013-12-14 22:38:51

标签: batch-file roguelike

我一直在学习一些批量编程,并决定制作一个roguelike,因为它是我最喜欢的游戏类型之一。我已经研究了批量生产roguelike的任何信息,但是没有找到太多。从我收集的一点点来看,这是我到目前为止的代码:

@echo off

rem init starting position
set pos=6

:level
set c1=#
set c2=#
set c3=#
set c4=#

set c5=#
set c6=.
set c7=.
set c8=#

set c9=#
set c10=.
set c11=.
set c12=#

set c13=#
set c14=#
set c15=#
set c16=#

echo %c1%%c2%%c3%%c4%
echo %c5%%c6%%c7%%c8%
echo %c9%%c10%%c11%%c12%
echo %c13%%c14%%c15%%c16%

这个到目前为止工作,并绘制了简单的4x4房间。我只为4x4房间进行测试,所以很简单。

现在我正处于一个我不确定如何写其余部分的地方。我知道我需要调用子程序,并获取输入(WASD),但我不知道如何在文件中构造这些子程序。我很感激任何人的帮助,如何构建批量roguelike,获取输入以移动播放器,甚至只是关于什么可行的想法。

感谢。

2 个答案:

答案 0 :(得分:3)

我在这里给你一个没有CHOICE且没有外部命令的技术。 它使用Xcopy来获取INPUT(W,A,S,D)。在这个例子中我不做任何位置测试(你的对象在屏幕上的位置),所以要测试它在第一个右边(D)。 这只是一个帮助你的例子。

@echo off

:level
set c1=#
set c2=#
set c3=#
set c4=#

set c5=#
set c6=.
set c7=.
set c8=#

set c9=#
set c10=.
set c11=.
set c12=#

set c13=#
set c14=#
set c15=#
set c16=#


@echo off
setlocal enableextensions enabledelayedexpansion

set haut=        
set larg=

:boucle
cls
echo WASD TO MOVE THE CURSOR Q TO QUIT&echo.
for %%a in ( !haut! ) do echo.
call:aff
Set "Key="
For /F "delims=" %%# In ('Xcopy /W "%~f0" "%~f0" 2^>Nul') Do If Not Defined Key Set "Key=%%#"
Set "Key=%Key:~-1%"
if /i %key%==q (exit /b)
if /i %key%==w goto:UP
if /i %key%==s goto:DOWN
if /i %key%==a goto:LEFT
if /i %key%==d goto:RIGHT

:LEFT
set larg=!larg:~0,-1!
goto boucle

:RIGHT
set larg= !larg!
goto boucle

:UP
set haut=!haut:~0,-2!
goto boucle

:DOWN
set haut=!haut! a
goto boucle


:aff
echo !larg!%c1%%c2%%c3%%c4%
echo !larg!%c5%%c6%%c7%%c8%
echo !larg!%c9%%c10%%c11%%c12%
echo !larg!%c13%%c14%%c15%%c16%

答案 1 :(得分:1)

@ECHO OFF
setlocal enableextensions enabledelayedexpansion

SET /a maxx=13
SET /a maxy=7
SET /a level=1
:: current x,y position in cx, cy - set start position
SET /a cx=3
SET /a cy=2

SET objdesc16=*Book of something
CALL :putobjects 1 6 3 16

SET userprompt=Q always Quits - MOVE WASD
SET moveoptions=wasd

:newlevel
:: Set physical map
CALL :map%level%
:loop
CALL :showmap
CALL :getmove
IF /i "%key%"=="Q" GOTO :eof
CALL :makemove
GOTO loop

:getmove
ECHO(%userprompt%
SET "userprompt="
:getmovel
Set "key="
For /F "delims=" %%Z In ('Xcopy /W "%~f0" "%~f0" 2^>Nul') Do If Not Defined Key Set "key=%%Z"
IF NOT DEFINED key GOTO getmovel
Set "key=%key:~-1%"
IF /i "%key%"=="Q" GOTO :eof
IF /i "%moveoptions%"=="!moveoptions:%key%=!" GOTO getmovel
GOTO :eof

:: make a move given KEY

:makemove
if /i %key%==w CALL :movedir 0 -1
if /i %key%==a CALL :movedir -1 0
if /i %key%==s CALL :movedir 0 1
if /i %key%==d CALL :movedir 1 0
GOTO :eof

:movedir
SET /a $m=%1+%cx%
SET /a $n=%2+%cy%
CALL :mapsquare %$m% %$n%
IF "%$s%"=="." SET cy=%$n%&SET cx=%$m%&CALL :setprompt wasd&GOTO :EOF
IF "%$s%"=="#" CALL :setprompt ouch&GOTO :EOF
GOTO :eof

:: standard userprompts

:setprompt
IF /i "%1"=="wasd" SET userprompt=MOVE WASD&GOTO :EOF 
IF /i "%1"=="ouch" SET userprompt=OUCH!&GOTO :EOF 
GOTO :EOF


:map1
CALL :initmap
:: Special map symbols for level 1 (stairs, etc)
CALL :mapsymbol 4 2 ?

GOTO :eof

:mapsymbol
SET "c_%1_%2=%3"
GOTO :eof

:: set border to '#', internal to '.'
:initmap
FOR /l %%y IN (0,1,%maxy%) DO ( 
 FOR /l %%x IN (0,1,%maxx%) DO ( 
  SET c_%%x_%%y=.
  IF %%x==0 SET c_%%x_%%y=#
  IF %%y==0 SET c_%%x_%%y=#
  IF %%x==%maxx% SET c_%%x_%%y=#
  IF %%y==%maxy% SET c_%%x_%%y=#
 )
)
GOTO :eof

:: map on new screen

:showmap
CLS
FOR /l %%y IN (0,1,%maxy%) DO (
 SET "mapline="
 FOR /l %%x IN (0,1,%maxx%) DO ( 
  CALL :mapsquare %%x %%y
  SET mapline=!mapline!!$s!
 )
 ECHO(!mapline!
)
GOTO :eof

:: get the symbol to show in x,y

:mapsquare
:: From map
SET $s=!c_%1_%2!
:: Object
IF DEFINED obj%level%_%1_%2 CALL :getobj %level%_%1_%2
:: Character
IF %cx%==%1 IF %cy%==%2 SET $s=@
SET $s=%$s:~0,1%
GOTO :eof

:: Get object description for object (%1) to $s

:getobj
SET $s=!obj%1!
SET $s=!objdesc%$s%!
GOTO :eof

:: PUTOBJECTS onlevel at-x at-y object#

:putobjects 1 1 3 16
SET "obj%1_%2_%3=%4"
GOTO :eof

此代码可能有用。

主循环只重复showmap,getmove,makemove。

makemove是需要扩展以构建游戏的关键例程。原则是查看哪些移动对下一个输入有效,将那些放在moveoptions中并生成适当的userprompt

否则,您的地图单元位于c_x_yobj_level_x_y中的对象我只是在displaysymbolDESCRIPTION objdescX中选择对象描述X存储在obj_level_x_y中。通过这种方式,您只需设置objhitbonusXobjdosesX等变量即可设置额外的对象特征。

您可以将方案扩展到opponenthealthX opponentweaponX等。

你不应该将GOTO最小化以避免意大利面条代码。