Batch file 为什么我的CMD/批处理游戏不起作用?

Batch file 为什么我的CMD/批处理游戏不起作用?,batch-file,cmd,Batch File,Cmd,如果要将此代码放到批处理文件中: 它不会选择一个随机数(或者如果它选择了,它总是有相同的结果) 如果你选择战斗,似乎不会输赢 我一直在自学编码,这是我第一次参加论坛,所以请对我放松:) 这是我的密码: @echo off title template color 0F pause :menu cls echo 1.start echo 2.instructions echo 3.exit set /p answer=Type the number of your option and pres

如果要将此代码放到批处理文件中:

  • 它不会选择一个随机数(或者如果它选择了,它总是有相同的结果)
  • 如果你选择战斗,似乎不会输赢
  • 我一直在自学编码,这是我第一次参加论坛,所以请对我放松:)
  • 这是我的密码:

    @echo off
    title template
    color 0F
    pause
    
    :menu
    cls
    echo 1.start
    echo 2.instructions
    echo 3.exit
    set /p answer=Type the number of your option and press enter
    if %answer%==1 goto start_1
    if %answer%==2 goto instructions
    if %answer%==3 goto exit
    
    :exit
    echo thanks for playing
    pause
    exit /b
    
    :instructions
    cls
    echo instructions
    echo.
    echo This game is case-sensitive!
    echo Just have fun with it!
    pause
    goto menu
    
    :start_1
    set /a s1=%random% * 3 / 32768 + 1
    if %s1%==1 goto prefight_1
    if %s1%==2 goto prefight_2
    if %s1%==3 goto prefight_3
    
    :prefight_1
    cls
    echo You have discovered 3 Turtles!
    echo They dont see you!
    set /p answer=would you like to (1)FIGHT or (2)RUN?
    if %answer%==1 goto fight_1
    if %answer%==2 goto run_1
    
    :fight_1
    set /a f1=%random% * 4 / 32768 + 1
    if %f1%==1 goto lose_fight_1
    if %f1%==2 goto win_fight_1
    if %f1%==3 goto win_fight_1
    if %f1%==4 goto win_fight_1
    
    :prefight_2
    cls
    echo You have discovered 3 Turtles!
    echo They see you!
    set /p answer=would you like to (1)FIGHT or (2)RUN?
    if %answer%==1 goto fight_2
    if %answer%==2 goto run_1
    
    :fight_2
    set /a f2=%random% * 4 / 32768 + 1
    if %f2% gtr 4 goto fight_2
    if %f2% lss 1 goto fight_2
    if %f2%==1 goto lose_fight_1
    if %f2%==2 goto lose_fight_1
    if %f2%==3 goto win_fight_1
    if %f2%==4 goto win_fight_1
    
    :prefight_3
    cls
    echo You have discovered 3 Turtles!
    echo They see you!
    echo They seem angry!
    set /p answer=would you like to (1)FIGHT or (2)RUN?
    if %answer%==1 goto fight_3
    if %answer%==2 goto run_1
    
    :fight_3
    set /a f3=%random% * 4 / 32768 + 1
    if %f3%==1 goto lose_fight_1
    if %f3%==2 goto lose_fight_1
    if %f3%==3 goto lose_fight_1
    if %f3%==4 goto win_fight_1
    
    :lose_fight_1
    cls
    echo Sorry,You LOST!
    echo Thank you for playing!
    echo made by: JEREMY
    set /p answer==(1)continue or (2)quit?
    if %answer%==1 goto start_1
    if %answer%==2 goto menu
    pause
    
    :run_1
    cls
    echo You ran away
    pause
    goto start_1
    
    伪随机-- 我确认%random%由系统时钟驱动--

    使用时钟MS获取1到1000之间的随机数 以下是获取毫秒的一种方法:


    引入随机性的另一种可能性是启动游戏,然后等待用户输入,即“准备好开始了吗?”,当他们开始时,会在cmd.exe启动后的时间内引入一些随机性。

    我强烈怀疑您设置了一个变量
    random
    。如果您已经这样做了,那么您在环境中设置的值将覆盖magic变量

    您可以通过
    set“random=“

    通常的做法是在
    @echo关闭后使用
    setlocal
    。这样,当批处理终止时,对环境所做的任何更改都将被撤消。如果没有它,所做的任何更改将一直保留,直到再次显式更改为止

    就我个人而言,我更喜欢

    设置/a值=%random%%%limit+1

    生成一个值1..limit。如果没有其他原因,打字会更容易


    setlocal
    命令设置“本地”环境,该环境仅在批处理结束或遇到
    endlocal
    命令之前存在

    有关更多信息,请参见提示符中的
    setlocal/?

    我添加了一个
    win\u-fight\u 1
    例程后,您的批处理似乎工作正常

    但是请注意,批处理将在
    set/p answer
    =
    (1)继续或(2)退出?
    上呕吐,但删除其中一个=将修复它

    除此之外,只需观察您是想进入
    菜单
    还是
    开始1

    if %f2% gtr 4 goto fight_2
    if %f2% lss 1 goto fight_2
    

    将无效-当然,如果您使用了
    set/a f2=%random%%%4+1
    首先,人类最好在“eq”而不是“==”时阅读。 set/p变量=在清除时更易于使用,因此请像这样使用echo:

    :Jelly_Attack_1
    cls
    echo AH! There's a swarm of angry jellyfish!
    echo Act fast!
    echo.
    echo You can (1) fight or (2) RUN
    set /p VARIABLE=
    if %VARIABLE% equ 1 goto Fight_Jelly_1
    if %VARIABLE% equ 2 goto Run
    if %VARIABLE% neq 1 goto TEST
    
    战斗部分应如下所示:

    :Fight_Jelly_1
    cls
    echo The jellyfish are more annoying than harmful!
    echo You have a great advantage!
    pause
    set /a FIGHTNO=%random%
    if %FIGHTNO% gtr 4 goto Fight_Jelly_1
    if %FIGHTNO% lss 1 goto Fight_Jelly_1
    if %FIGHTNO% equ 1 goto FAILED
    if %FIGHTNO% equ 2 goto Fight_Jelly_1_Win
    if %FIGHTNO% equ 3 goto Fight_Jelly_1_Win
    if %FightNO% geq 4 goto Fight_Jelly_1_Win
    
    然后,如果想在获胜时给予金牌或奖励,请执行以下操作:

    :Fight_Jelly_1_Win
    cls
    echo The fight was easy and you found some gold!
    pause
    set gold=0 (if you didn't have a gold variable)
    set /a gold=gold+5 (to add gold)
    goto FRAMENAME
    

    我希望我能帮忙

    我猜自从控制台启动以来,%随机%种子本身就在时间上。几次cmd的发布和运行echo%random%会导致27000范围内的数字,这似乎奇怪地一致。那么我该怎么办呢?谢谢你的回答!你是说%random%不是真的而且不起作用?他们为什么要这样做!!!无论如何,我的下一步将是制作某种随机时间生成器,这将解决我的%random%问题,对吗?对不起,我是新来的…而且有点慢:帕尔计算机生成的随机数生成器是伪随机的。有时,这是一个优势(例如,为了再现模拟,它有助于操纵骰子),创建一系列真正的随机数而不隐藏由生成机制导致的模式是困难的。好的发电机通常依赖于物理事件,如将无线电静电转换成数字。伪随机通常是足够好的,除非你选择彩票号码,人们可能会投入大量的时间和金钱来寻找伪随机发生器!我不知道!为什么%random%%%限制+1有效?(不是粗鲁,只是好奇!!!)我该如何设置本地设置?另外,谢谢你,我将尝试你的建议:)使用我在开始代码上尝试的%random%%limit+1有效:)谢谢你关于为什么选择fight时它不起作用的任何建议?
    :Fight_Jelly_1_Win
    cls
    echo The fight was easy and you found some gold!
    pause
    set gold=0 (if you didn't have a gold variable)
    set /a gold=gold+5 (to add gold)
    goto FRAMENAME