我正在使用批处理文件创建D&D风格的RPG游戏,我看到另一个人使用登录功能创建了一个批处理文件,该文件将您带回到上次停止的地方。所以我试图复制它。除了它不会创建批处理文件以允许您返回的事实外,几乎所有东西都可以工作。当您完成创建登录的过程时,它会像正常情况一样进行,并且在下一个屏幕的“开始”下甚至会显示您的用户名是您设置的用户名,但不会创建批处理文件。请帮忙!有些代码可能会分散,因为我仍在学习中,而有些代码尚未完成,但这是我到目前为止所掌握的。 (我保留了不必要的代码,但是如果我做错了,请告诉我。)
/*index page*/
<?php
include "includes/header.php" ?>
<section class="feature">
<div class="container">
<div class="row">
<div class="col-sm-6">
<div id="carouselExampleInterval" class="carousel slide" data-
ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active" data-interval="5000">
<img class="imgCar"src="images/h1.JPG" class="d-block w-100"
alt="...">
</div>
<div class="carousel-item" data-interval="5000">
<img class="imgCar"src="images/h2.JPG" class="d-block w-100"
alt="...">
</div>
<div class="carousel-item" data-interval="5000">
<img class="imgCar" src="images/h3.jpg" class="d-block w-100"
alt="...">
</div>
</div>
<a class="carousel-control-prev" href="#carouselExampleInterval"
role="button" data-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true">
</span>
<span class="sr-only">Previous</span>
</a>
<a class="carousel-control-next" href="#carouselExampleInterval"
role="button" data-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true">
</span>
<span class="sr-only">Next</span>
</a>
</div>
</div>
<?php
include "includes/footer.php" ?>
.headerImage{
width: 100%;
heigth: 300px;
padding-top:75px;
color:#bf2132;
}
.fimage{
width: 100%;
heigth: 300px;
padding-top:75px;
}
.navbar-default{
background-color:#bf2132;
border-color: #bf2132;
}
/* navigation */
.nav
{
width:100%;
background-color:#ccc;
position:fixed;
top:0;
left:0;
z-index: 9999;
}
.nav .logo
{
display:flex;
width:200px;
height: 50px;
flex-wrap:wrap;
justify-content: center;
align-items: center;
text-transform:uppercase;
cursor:pointer;
}
.imagelogo{
width:100px;
heigth:50px;
}
.togg
{
position:absolute;
right:40px;
top:20px;
display:none;
z-index: 5;
}
.togg div {
width: 36px;
height: 2px;
background-color: red;
margin: 6px 0px;
position: relative;
transition:all .8s ease;
}
.togg.lijo div
{
position:absolute;
transition:all .8s ease;
}
.togg.lijo div:nth-child(1){
transform: rotate(48deg);
top: 7px;
/* position: absolute; */
right: 0px;
}
.togg.lijo div:nth-child(2)
{
width:0px;
top: 7px;
/* position: absolute; */
right: 0px;
}
.togg.lijo div:nth-child(3)
{
transform: rotate(-48deg);
top: 7px;
right: 0px;
}
.nav ul.firstlevel
{
list-style:none;
width:calc(100% - 200px);
background: rgb(191,33,50);
background: linear-gradient(0deg, rgba(191,33,50,1) 0%,
rgba(247,77,5,0.9976365546218487) 33%, rgba(191,33,50,1) 100%);
margin-bottom:0px;
padding-left:0px;
}
.nav ul.firstlevel li
{
display:inline-block;
margin-bottom:0px;
color:#000;
}
.nav ul.firstlevel li a
{
cursor:pointer;
display:block;
padding:15px;
transition:.8s ease;
text-decoration:none;
text-transform:uppercase;
color:#fff;
}
.nav ul.firstlevel li a:hover
{
text-decoration:none;
}
.nav ul.firstlevel li ul.sub li {
display: block;
background-color:rgba(191,33,50,1);
}
.nav ul.firstlevel li ul.sub li:hover {
display: block;
background-color:rgba(172, 78, 2, 0.79);
}
.nav ul.firstlevel li ul.sub li a{
color:#fff;
}
.nav ul.firstlevel li ul.sub
{
width:200px;
position:absolute;
padding-left:0px;
opacity:0;
visibility: hidden;
transform:translateY(30px);
transition:.5s linear;
padding-top:20px;
}
.nav ul.firstlevel li ul.sub:after {
content: '';
width: 41px;
height: 20px;
border-bottom: solid 18px rgba(191,33,50,1);
border-left: solid 20px transparent;
border-right: solid 21px transparent;
top: 0px;
display: block;
position: absolute;
left: 16px;
}
@media(min-width:1024px)
{
.nav ul.firstlevel li:hover ul.sub
{
visibility:visible;
opacity:1;
transform:translateY(0px);
}
.nav ul.firstlevel li:hover
{
display:inline-block;
margin-bottom:0px;
background-color: rgba(27, 27, 27, 0.32);;
color:#fff !important;
}
.nav ul.firstlevel li:hover a
{
color:#fff !important;
}
}
@media(max-width:1024px)
{
.nav
{
min-height:50px;
}
.togg
{
display:block;
top:10px;
}
.nav ul.firstlevel
{
position: absolute;
top: 50px;
transform: translateX(100%);
right: 0;
transition:.8s ease;
width:40%;
height: calc(100vh - 50px);
z-index: fixed;
}
.nav ul.firstlevel li {
display: block;
}
.nav ul.firstlevel.surya {
transform: translateX(0%);
}
.nav ul.firstlevel li ul.sub
{
opacity: 1;
visibility: visible;
display:none;
position:relative;
padding-top:0px;
width:100%;
transition:0s;
transform: translateY(0px);
}
.nav ul.firstlevel li ul.sub:after
{
display:none;
}
/* Feature */
.feature{
padding-left: 100px;
padding-right: 100px;
padding-top: 70px;
padding-bottom: 70px;
background-image: url("../images/paper.jpg");
text-align:center;
}
.houseimg{
width: 400px;
height: 350px;
border:5px solid rgb(191,33,50);
background-color:#ff0;
}
.about{
padding-right: 100px;
padding-left: 100px;
padding-bottom: 70px;
text-align:center;
background-image: url("../images/paper.jpg");
}
/* spinning text */
#blink{
width:100%;
height: 50px;
padding: 15px;
text-align: center;
line-height: 50px;
}
.htext{
font-family: "Alfa Slab One";
color: rgb(191,33,50);
animation: blink 1.5s linear infinite;
padding-bottom: 100px;
}
@keyframes blink{
0%{opacity: 0;}
50%{opacity: .5;}
100%{opacity: 1;}
}
/* paragraph background */
.backpar{
border-radius: 25px;
background: rgb(191,33,50);
background: linear-gradient(0deg, rgba(191,33,50,1) 0%,
rgba(247,77,5,0.9976365546218487) 33%, rgba(191,33,50,1) 100%);
padding: 20px;
width: 100%;
height: 100%;
color: white;
font-family: "Concert One";
}
.footer{
background-image: url("../images/footer.png");
}
/* Contact */
.contact{
padding-left: 70px;
padding-right: 70px;
padding-top: 70px;
padding-bottom: 70px;
background-image:url("../images/paper.jpg");
}
.jumbotron {
background: rgb(191,33,50);
color: #FFF;
border-radius: 0px;
}
.jumbotron-sm { padding-top: 24px;
padding-bottom: 24px; }
.jumbotron small {
color: #FFF;
}
.h1 small {
font-size: 24px;
}
/* carousel homepage*/
.carousel-item{
width: 100% !important;
Height: 350px !important;}
.imgCar{
width: 100% !important;
Height: 350px !important;
border: 2px solid red;
border-radius: 5px;
}
我希望它在创建帐户后即可创建批处理文件,以便您以后登录。
答案 0 :(得分:0)
哦-这么多错误!
首先,在setlocal enabledelayedexpansion
行之后直接添加一条额外的行@echo off
。这有两个作用-首先,当批处理结束时,您的环境将还原到其原始状态,以免您与之前运行所建立的变量混淆。其次,它打开delayed expansion
模式-这是激活您正在使用的!variable!
语法的地方,否则!
只是一个普通字符。
接下来,使用set /p
接受了来自ketboard的输入,您不知道用户是否输入了。在验证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上张贴“代码墙”以进行解码和重构通常会导致您的问题被忽略甚至被否决。
并一次实施一项更改,然后对其进行测试和调试。小步骤将使此过程变得容易得多。
答案 1 :(得分:0)
对于您的菜单,我想向您介绍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
。 Windows文件名不能与十进制字符代码0
至31
一起包含以下任何字符, \ / : * ? “ << / kbd> > | < / kbd> ,因此您需要结合对username1
的进一步验证。此验证过程需要在上述代码的第31
行之前实施。
但是,在这样做之前,您可能需要考虑更改方法,而不是将Username保存为文件名。这样做的原因是,最好不要使用以 。 或任何命名为CON
,PRN
结尾的文件名, AUX
,NUL
,COM1
,COM2
,COM3
,COM4
,COM5
,COM6
,{{ 1}},COM7
,COM8
,COM9
,LPT1
,LPT2
,LPT3
,LPT4
,{{1} },LPT5
,LPT6
和LPT7
。因此,您还需要进一步包括对输入的那些验证检查。
别忘了,您可能还想为LPT8
提示符下的输入条目添加一种验证方法!
鉴于用户输入和LPT9
的复杂性,您可以了解为什么我推荐%password1%
作为菜单的控制措施。