具有登录功能的批处理RPG游戏

时间:2019-06-01 07:36:55

标签: batch-file login

我正在使用批处理文件创建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;
   }

我希望它在创建帐户后即可创建批处理文件,以便您以后登录。

2 个答案:

答案 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文件名不能与十进制字符代码031一起包含以下任何字符, \ / * << / kbd> > | < / kbd> ,因此您需要结合对username1的进一步验证。此验证过程需要在上述代码的第31行之前实施。

但是,在这样做之前,您可能需要考虑更改方法,而不是将Username保存为文件名。这样做的原因是,最好不要使用以 或任何命名为CONPRN结尾的文件名, AUXNULCOM1COM2COM3COM4COM5COM6,{{ 1}},COM7COM8COM9LPT1LPT2LPT3LPT4,{{1} },LPT5LPT6LPT7。因此,您还需要进一步包括对输入的那些验证检查。

别忘了,您可能还想为LPT8提示符下的输入条目添加一种验证方法!

鉴于用户输入和LPT9的复杂性,您可以了解为什么我推荐%password1%作为菜单的控制措施。