Пакетная RPG игра с функцией входа - PullRequest
0 голосов
/ 01 июня 2019

Я создаю RPG-игру в стиле D & D, используя пакетные файлы, и я увидел другого человека, использующего функцию входа в систему, которая создает пакетный файл, который возвращает вас туда, где вы остановились.поэтому я попытался повторить это.Почти все работает, за исключением того факта, что он не создаст командный файл, чтобы вы могли вернуться назад.Когда вы проходите процесс создания логина, он проходит как обычно, и на следующем начальном экране даже отображается, что вы задали имя пользователя, но оно не будет создавать командный файл.Пожалуйста помоги!Часть кода может быть разбросана, потому что я все еще учусь, а часть еще не закончена, но это то, что я до сих пор.(Я сохранил ненужный код, но также, если я делаю что-то не так, пожалуйста, сообщите мне.)

title Lost Mine of Phandelvor
@echo off
:entergame
cls
echo.
echo Welcome to Lost Mine of Phandelvor
echo -------------------
echo.
echo 1. Create Account
echo 2. Login
echo 3. Exit
echo.
set /p input=

if %input% EQU 1 goto createuser
if %input% EQU 2 goto login
if %input% EQU 3 exit
if %input% GEQ 4 goto entergame

:createuser
cls
echo.
echo What would you like your Username to be?
set /p username1= 
set v1f=0
goto checkforspaces

:checkforspaces
set x=!v1f!
set Letter%v1f%=!username1:~%x%,1!
if "!Letter%v1f%!" EQU " " (
echo.
echo.
echo Sorry you can't use spaces in your Username.
pause>nul
goto entergame
)
if NOT "!Letter%v1f%!" EQU "" (
set /a v1f=%v1f%+1
)
echo.
echo What would you like your Password to be?
set /p password1= 
goto DATA_VALUES

:login
cls
set /p name=Username: 
if not exist "%name%.bat" (
echo That is not a valid Username.
pause>nul
goto entergame
)
set /p pass1=Password: 
call %name1%.bat
if not %password1% EQU %pass1% (
echo That is not a valid Password.
pause>nul
goto entergame
)
goto create

:DATA_FILES
set lvl1=1
set exp1=0
set expmax1=300
set gp1=10
set hp1=12
set ac1=15
set profbonus1=2
set str1=4
set dex1=1
set con1=2
set int1=0
set wis1=2
set cha1=2
set destination=SAVE_GAME_FILES
set destination2=SAVE_GAME_FILES
goto SAVE_GAME_FILES

:SAVE_GAME_FILES
(
echo set username1=%username1%
echo set password1=%password1%
:DATA_VALUES
echo set lvl1=%lvl1%
echo set exp1=%exp1%
echo set expmax1=%expmax1%
echo set gp1=%gp1%
echo set hp1=%hp1%
echo set ac1=%ac1%
echo set profbonus1=%profbonus1%
echo set str1=%str1%
echo set dex1=%dex1%
echo set con1=%con1%
echo set int1=%int1%
echo set wis1=%wis1%
echo set cha1=%cha1%
echo set destination=%destination%
echo set destination2=%destination2%
)>%username1%.bat
goto start

:start
cls
echo.
echo Currently logged in as %username1%
echo.
echo Welcome to my fantasy style role playing game.
echo You will need to create a character.
echo.
echo Enjoy!
echo.
echo 1. Continue to Character Selection
echo 2. Exit
echo.
set /p input=

if %input% EQU 1 goto create
if %input% EQU 2 exit
if %input% GEQ 3 goto start

:create
cls
echo.
echo Welcome to Character Creation
echo.
echo Pick your race!
echo.
echo 1. Human
echo 2. Dwarf
echo 3. Elf
echo 4. Dragonborn
echo 5. Tiefling
echo.
set /p input=Choice:
if %input%==1 goto createHuman
if %input%==2 goto createDwarf
if %input%==3 goto createElf
if %input%==4 goto createDragonborn
if %input%==5 goto createTiefling
goto create

:createHuman
cls
echo.
echo You have chosen Human as your race!
echo.
echo Choose your class
echo.
echo 1. Fighter
echo 2. Ranger
echo 3. Rogue
echo 4. Wizard
echo.
set /p input=Choise
if %input%==1 goto humanFighter
if %input%==2 goto humanRanger
if %input%==3 goto humanRogue
if %input%==4 goto humanWizard
goto createHuman

:humanFighter
cls
echo.
echo You have chosen Fighter as your class!
echo.
echo Choose your weapon
echo.
echo 1. Battleaxe 1D8 Slashing
echo 2. Longsword 1D8 Slashing
echo 3. Rapier 1D8 Piercing
echo.
set /p input=choise
if %input%==1 goto humanFighter1
if %input%==2 goto humanFighter2
if %input%==3 goto humanFighter3
goto humanFighter

:humanfighter1
set lvl1=1
set exp1=0
set expmax1=300
set gp1=10
set hp1=12
set ac1=15
set profbonus1=2
set str1=4
set dex1=1
set con1=2
set int1=0
set wis1=2
set cha1=2
cls
echo.
echo To find your stats open your character sheet labeled humanfighter1_cs.txt
echo.
echo What's your name?
echo.
set /p name1=Enter:
goto hf1main

:hf1main
cls
echo.
echo %name1% Human Fighter
echo Lvl: %lvl1% Money:%gp1%
echo Hit Points: %hp1%/12
echo Armor: Breastplate Armor Class: %ac1%
echo Exp: %exp1%/%expmax1%
echo Weapon: Battleaxe 1D8 Slashing
echo Stat Modifiers:
echo Strength: +%str1%
echo Dexterity: +%dex1%
echo Constitution: +%con1%
echo Intelligence: +%int1%
echo Wisdom: +%wis1%
echo Charisma: +%cha1%
echo -------------------------------------
echo 1) Continue
echo 2) Exit
echo.
set /p input=Enter:
if %input%==1 goto hf1continue
if %input%==2 exit

Я ожидаю, что он создаст командный файл после создания учетной записи, чтобы вы могли войти позже.

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Для вашего меню я хотел бы познакомить вас с choice.exe в качестве альтернативы Set /P. Гораздо лучше использовать его, когда на входе должно быть любое из небольшого набора известных значений. Set /P позволяет конечному пользователю ничего не вводить или что-либо вводить, и для сохранения контроля необходимо встроить некоторый механизм проверки ввода. Чтобы узнать, как работает choice.exe, откройте окно cmd.exe и введите choice /? в ответ на запрос.

Вот переписанный пример фрагмента вашего скрипта, (строки 1 - 43) , чтобы, надеюсь, объяснить, почему:

@Echo Off
Title Lost Mine of Phandelvor

:EnterGame
ClS
Echo(
Echo Welcome to Lost Mine of Phandelvor
Echo ----------------------------------
Echo(
Echo 1. Create Account
Echo 2. Login
Echo 3. Exit
Echo(
Choice /C 123
If ErrorLevel 3 Exit /B
If ErrorLevel 2 GoTo Login

:CreateUser
ClS
Echo(
Set "username1="
Set /P "username1=What would you like your Username to be? "
If Not Defined username1 GoTo CreateUser

:CheckForSpaces
If Not "%username1: =%"=="%username1%" (
    Echo Sorry you can not use spaces in your Username.
    Choice /M "Is %username1: =%" okay"
    If ErrorLevel 2 GoTo CreateUser
)
If Exist "%username1%.bat" GoTo :Login
Echo(
Set "password1="
Set /P "password1=What would you like your Password to be? "

Однако, прежде чем вы продолжите свой сценарий, основываясь на том, что я сказал об использовании Set /P. В настоящее время конечный пользователь может ввести все, что он хочет, как username1. Мы уже проверили отсутствие записи и пробелов, но вы также сохраняете имя как имя файла, %name%.bat. Наряду с десятичными символами от 0 до 31 имена файлов Windows не могут содержать следующие символы: \ / : *? " <</kbd>> | , поэтому вам нужно включить дополнительную проверку username1. Эту процедуру проверки необходимо будет выполнить до строки 31 кода выше.

Однако, прежде чем сделать это, вы можете подумать об изменении своей методологии и не сохранять имя пользователя под именем файла. Причина этого заключается в том, что вам также не следует использовать имена файлов, заканчивающиеся на . , или любые имена с именами CON, PRN, AUX, * 1054. *, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 и LPT9. Поэтому вам также необходимо включить эти проверочные проверки входных данных.

Не забывайте, что вы, вероятно, захотите включить метод проверки ввода также и в приглашение %password1%!

Учитывая сложность, связанную с пользовательским вводом и Set /P, вы можете понять, почему я рекомендовал choice.exe в качестве контрольной меры для ваших меню.

0 голосов
/ 01 июня 2019

Ооо - столько ошибок!

Сначала добавьте дополнительную строку setlocal enabledelayedexpansion сразу после строки @echo off. Это имеет два эффекта - во-первых, когда ваш пакет заканчивается, ваша среда восстанавливается до исходного состояния, чтобы вы не путались с переменными, которые были установлены в предыдущих запусках. во-вторых, он включает режим delayed expansion, в котором активируется используемый вами синтаксис !variable!, в противном случае ! - это просто обычный символ.

Далее, приняв ввод с кетборда с set /p, вы не знаете, вошел ли пользователь. В ваших утверждениях if используйте if "%var%"=="value", который преодолевает большинство проблем ввода.

Далее, синтаксис SET "var=value" (где значение может быть пустым) используется, чтобы гарантировать, что любые заданные пробелы НЕ включены в назначенное значение.

И небольшой совет для игр, которым требуется функция сохранения / восстановления: Если вы зарезервируете символ в качестве префикса для переменных, которые вы хотите сохранить (например, все переменные, которые я хочу сохранить / перезагрузить, начинаются с #), тогда все, что вам нужно сохранить , - это игра

set #>"mygamefile.txt"

и все что вам нужно перезагрузить игра

for /f "usebackqdelims=" %%a in ("mygamefile.txt") do set "%%a"

Чтобы убрать все # переменные (полезно перед перезагрузкой игры), используйте

for /f "delims==" %%a in ('set # 2^>nul') do set "%%a="

Вы должны взглянуть на тысячи примеров кода здесь, на SO, чтобы узнать, как использовать подпрограммы - вы, похоже, используете "код спагетти".

Этот код может помочь с проверкой пароля:

for /f "tokens=1,2" %%a in (passwordfilename) do if "%%a"=="%playername%" set "playerpass=%%b"
if "%playerpass%"=="%enteredpass%" goto gameon

При этом используется один файл паролей в форме

player1 password1
player2 password2

Если player1 меняет пароль, добавьте новые данные в файл следующим образом:

player1 password1
player2 password2
player1 newpassword

и вышеупомянутая конструкция for /f установит для playerpass значение последний вхождения player1 найдено.

Это должно дать вам старт и избавить вас от необходимости иметь вспомогательный пакетный файл. У вас на тарелке будет достаточно реализации этих предложений, но тогда вы сможете увидеть древесину для деревьев.

К сожалению, размещение «стены кода» на SO для декодирования и восстановления часто приводит к тому, что ваш вопрос будет проигнорирован или даже проигнорирован.

И вносите изменения по одному, затем тестируйте и отлаживайте их. Небольшие шаги сделают процесс намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...