草庐IT

windows - 我只为一组/一个不断收到大量错误

coder 2024-06-13 原文

Alright so I am making a pretty simple game in batch and I decided I wanted to add some abilities to enemies. I tried to make a code that would let them use abilities but it crashes after a set /a statement with nothing wrong with it. My code that is relevant is separated into 4 main parts. I'm going to put the code in order of where they are in my file. These are not the only things in it. All my characters stats like strength, stamina, agility, and intellect are working perfectly fine.


敌人的初始化

这是战斗开始时加载的内容,用于提供敌人统计信息等。

:bearstart1
set enemytype=beast
set curenemy=Bear
set /a allstat= %strength% + %stamina% + %agility% + %intellect%
set /a randamage= %weapondamage% / (%level% * 2)
set enevasion=1
set /a hitacc= %accuracy% * 10
set /a hitran=%RANDOM% * (1000 - 1 + 1) / 32768 + 1
set enemyaccuracy=1
set /a eneacc= %enemyaccuracy% * 10
set /a enemylevel= %RANDOM% * (2 - 1 + 1) / 32768 + 1
set enemyhealth=75 + (5 * %enemylevel%)
set enemymaxhealth=75 + (5 * %enemylevel%)
set enemyenrgy=30 + (%enemylevel% * 5)
set /a enemyenergy=%enemyenrgy%
set enemymaxenergy=30 + (%enemylevel% * 5)
set enemyenergyregen=2
set enemydefense=17 + %enemylevel%
set /a enemyabilities=1
set enemycurabilityname=Claw
set enemycurabilityID=001
set enemycurabilityslot=1
set enemycurabilitychance=30
set statfixloc=bearstart2
goto :statfixesenemyability
:bearstart2
set enevasion=1
set /a enemydamage=18 + %enemylevel%
set /a ranxpgain=(%RANDOM% * ((10 * %level%) - 1 + 1) / 32768 + 1)
set /a ranxpgain=(%RANDOM% * ((15 * %level%) - 1 + 1) / 32768 + 1)
set /a atkaccuracy= (550 + %hitacc%) - (%enevasion% * 10)
set /a eneaccuracy= (450 + %eneacc%) - (%evasion% * 10)
set enemyattack= %enemydamage% - (%defense% / 2)
set /a realdamage= %damage% - (%enemydefense% / 2)
set /a randamagemax= %realdamage% + randamage
set /a randamagemin= %realdamage% - randamage
set /a randomdamage= %RANDOM% * (%randamagemax% - %randamagemin% + 1) / 32768 + %randamagemin%
set /a enemyrandamage= %enemydamage% / (%enemylevel% * 3)
set /a enemyrealdamage= %enemydamage% - (%defense% / 2) + (%enemylevel% - 1 * 5)
set /a enemyrandamagemax= %enemyrealdamage% + %enemyrandamage%
set /a enemyrandamagemin= %enemyrealdamage% - %enemyrandamage%
set /a enemyrandomdamage= %RANDOM% * (%enemyrandamagemax% - %enemyrandamagemin% + 1) / 32768 + %enemyrandamagemin%

战斗画面

这是玩家可以选择在战斗中做什么的菜单,主要是为了引用这部分代码的顺序。这实际上是上面初始化之后的一行.

:fightscreen
set /a health=%health%
set /a enemyhealth=%health%
IF %health% LEQ 0 goto :dead
IF %enemyhealth% LEQ 0 goto :fightend
cls
Echo ######################################
Echo # Enemy:%curenemy%
Echo # Enemy Health: %enemyhealth%/%enemymaxhealth%
Echo # Enemy Energy: %enemyenergy%/%enemymaxenergy%
Echo # Enemy Defense: %enemydefense%
Echo # Enemy Attack: %enemyattack%
Echo ######################################
Echo # %name%
Echo # Level:%level%
Echo # Health:%health%/%maxhealth%
Echo # Damage:%randamagemin%-%randamagemax%
Echo # Defense:%defense%
Echo # XP:%xp%/%maxxp%
Echo # Gold:%gold%
Echo ######################################
Echo #                                    #
Echo #         Decisions              #
Echo ######################################
Echo #                                    #
Echo # 1).Attack                          #
Echo # 2).Use Potion                      #
Echo # 3).Flee                            #
Echo #                                    #
Echo ######################################
IF "%1" == "-debug" (
set fightchoice= 1
goto fightscreenoveride
)
set /p fightchoice= Choose your decision. 
:fightscreenoveride
IF %fightchoice% == 1 goto fightattack
IF %fightchoice% == 2 goto fightpotion
IF %fightchoice% == 3 goto flee
goto fighterror1

战斗的“脚本

这是不断崩溃的主要部分。

:fightdefend
IF "%enemyhealth%" LEQ "0" goto :fightend
cls
set /a abilchecker=%enemyabilities%
:fightenemyability
set /a abilchecker= %abilchecker% - 1
IF %abilchecker% GEQ 0 (
IF "%enemyability1type%"=="1" (
IF "%enemyability1costbool%"=="1" (
IF %enemyenergy% GEQ %enemyability1cost% (
set /a "enemyenergy="%enemyenergy% - %enemyability1cost%"
set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1) / 32768 + 1"
set /a enemyability1hitchanc=%enemyability1hitchnc%
set /a enemyability1hitchance=%enemyability1hitchanc%
IF "%enemyability1choosechance% LEQ "%enemyabilty1hitchance%" 
set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1) / 32768 + 1"
set /a enemyabiltiy1hchance=%enemyability1hitchnc%
IF "%enemyability1chance%" LEQ "%enemyability1hchance%" (
set /a "enemyability1damge= %RANDOM% * (%enemyability1dmgmax% - %enemyability1dmgmin% + 1) / 32768 + %enemyability1dmgmin%"
set /a enemyability1damage=%enemyabiltiy1damge%
set /a "enemyability1truedamge= %enemyability1damge% - (%defense% / 2)"
set /a enemyability1truedamage=%enemyability1truedamge%
IF "%enemyability1truedamage%" LEQ "0" (
set enemyability1truedamage=0
Echo %curenemy% used %enemyability1name% and hit you for %enemyability1truedamage%!
pause >nul
goto :fightscreen
)
set /a "health=%health% - %enemyability1truedamage%"
Echo %curenemy% used %enemyability1name% and hit you for %enemyability1truedamage%!
pause >nuls
goto :fightscreen
) ELSE (
Echo %curenemy% used %enemyability1name%... But %curenemy% missed!
pause >nul
goto fightscreen
)
 )
  goto fightenemyability
  )
 goto :fightenemyability
  ) ELSE (
set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1) / 32768 + 1"
set /a enemyability1hitchance=%enemyability1hitchnc%
IF "%enemyability1choosechance%" LEQ "%enemyabilty1hitchance%" (
set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1) / 32768 + 1"
set /a enemyabiltiy1hchance=%enemyability1hitchnc%
IF "%enemyability1chance%" LEQ "%enemyability1hchance%" (
set /a "enemyability1dmg= %RANDOM% * (%enemyability1dmgmax% - %enemyability1dmgmin% + 1) / 32768 + %enemyability1dmgmin%"
set /a enemyability1damage=%enemyability1dmg%
set /a "enemyability1truedmg= %enemyability1damage% - (%defense% / 2)"
set /a enemyability1truedamage=%enemyability1truedmg%
IF "%enemyability1truedamage%" LEQ "0" (
set enemyability1truedamage=0
Echo %curenemy% used %enemyability1name% and hit you for %enemyability1truedamage%!
pause >nul
goto :fightscreen
)
set /a "health=%health% - %enemyability1truedamage%"
Echo %curenemy% used %enemyability1name% and hit you for %enemyability1truedamage%!
pause >nul
goto :fightscreen
) ELSE (
Echo %curenemy% used %enemyability1name%... But %curenemy% missed!
pause >nul
goto fightscreen
  )
   )
    )
     )
      )
:fightdefendattack
set /a "enemyrandomdamage= %RANDOM% * (%enemyrandamagemax% - %enemyrandamagemin% + 1) / 32768 + %enemyrandamagemin% "
set /a "hitran=%RANDOM% * (1000 - 1 + 1) / 32768 + 1"
if %hitran% LSS %eneaccuracy% goto enemymiss
goto enemyhit

设置敌人能力

这是设置敌人能力的地方。这会将您从 :bearstart1 发送到此,然后再发送到 :bearstart2

:statfixesenemyability
goto :ability%enemycurabilityID%
:ability001
::Claw
set enemyability%enemycurabilityslot%name=%enemycurabilityname%
set /a enemyability%enemycurabilityslot%type=1
set /a enemyability%enemycurabilityslot%costbool=1
set enemyability%enemycurabilityslot%choosechance=%enemycurabilitychance%
set enemyability%enemycurabilityslot%chance=60
set enemyability%enemycurabilityslot%cost=10
set enemyability%enemycurabilityslot%dmgmin=10
set enemyability%enemycurabilityslot%dmgmax=50
set /a enemyability%enemycurabilityslot%effectbool=0
set /a enemyability%enemycurabilityslot%effect=None
set enemyability%enemycurabilityslot%efsfectchance=0
set enemyability%enemycurabilityslot%effectmin=0
set enemyability%enemycurabilityslot%effectmax=0
set enemyability%enemycurabilityslot%effectlastmin=0
set enemyability%enemycurabilityslot%effectlastmax=0
set enemyability%enemycurabilityslot%activated=1
goto :%statfixloc%

所以当它第一次崩溃时给出了这个错误:

A "/" was unexpected at this time.

所以我使用了一个从 stackoverflow 搜索得到的 bat 调试器。

here is the link to it .如果您不太想检查它,它会加载您的 bat 文件并使用所有代码和 goto 并检查错误。但是它确实使用暂停来强制它停止。我通过将其添加到我的战斗屏幕来解决此问题。

IF "%1" == "-debug" (
set fightchoice= 1
goto fightscreenoveride
)

并使用

加载它
start logfile.bat tatatat0-batchz-rpg.bat -debug

我发现用那个

set /a abilchecker= 1 - 1 

代码中的是

set /a abilchecker= %abilchecker% - 1

注意:我确实在几行之前将 abilchecker 设置为 %enemiesabilities% 这段代码一直在崩溃,或者至少是崩溃的第一件事。所以我试图通过在所有 set/a 部分周围加上引号来修复它,除了像

set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1) / 32768 + 1"

但这并没有真正解决问题。它所做的只是改变

A "/" was unexpected at this time.

The syntax of the command is incorrect.

该错误没有多大意义,因为 set/a abilchecker 的语法很好。这是我被困了一段时间的地方,我不知道如何解决它。


结论

这就是我真正需要解决的问题。
一些帮助和/或建议会非常好!几天来我一直在努力解决这个问题。 :/
如果我所说的内容中有任何您不理解的部分,或者您需要更多信息,请询问。


好吧,我确实最终将我的代码中的括号和引用中的/a 更改为:

(Just a 'portion' of it)

set /a abilchecker=%abilchecker% - 1
IF %abilchecker% GEQ 0 (
IF "%enemyability1type%"=="1" (
IF "%enemyability1costbool%"=="1" (
IF %enemyenergy% GEQ %enemyability1cost% (
set /a enemyenergy=%enemyenergy% - %enemyability1cost%
set /a enemyability1hitchnc=%RANDOM% * (100 - 1 + 1^) / 32768 + 1
set /a enemyability1hitchanc=%enemyability1hitchnc%
set /a enemyability1hitchance=%enemyability1hitchanc%
IF %enemyability1choosechance% LEQ %enemyabilty1hitchance%
set /a enemyability1hitchnc=%RANDOM% * (100 - 1 + 1^) / 32768 + 1
set /a enemyabiltiy1hchance=%enemyability1hitchnc%
IF %enemyability1chance% LEQ %enemyability1hchance% (
set /a enemyability1damge=%RANDOM% * (%enemyability1dmgmax% - %enemyability1dmgmin% + 1^) / 32768 + %enemyability1dmgmin%
set /a enemyability1damage=%enemyabiltiy1damge%
set /a enemyability1truedamge=%enemyability1damge% - (%defense% / 2^)
set /a enemyability1truedamage=%enemyability1truedamge%
IF %enemyability1truedamage% LEQ 0 (
set enemyability1truedamage=0
Echo %curenemy% used %enemyability1name% and hit you for %enemyability1truedamage%!
pause >nul
goto :fightscreen

根据之前的评论,我已经检查了好几次,但似乎仍然遇到同样的错误。

The syntax of the command is incorrect.
set /a abilchecker=%abilchecker% - 1

最佳答案

IF "%enemyability1costbool%"=="1" (
IF %enemyenergy% GEQ %enemyability1cost% (
set /a "enemyenergy="%enemyenergy% - %enemyability1cost%"
set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1) / 32768 + 1"

此处最后一行的右括号关闭了 if %enemyenergy% ... ( block 。

您需要使用 ^ 转义右括号因此:

set /a "enemyability1hitchnc= %RANDOM% * (100 - 1 + 1^) / 32768 + 1"

自然地,在您向我们展示的堆积如山的代码中有很多这样的情况。

接下来,尝试为任何numeric 赋值set/a,并在numeric 赋值中去掉引号。使用 set "var=string" 分配 strings,因为引号确保尾随空格不包含在分配的值中。

然后尝试 set/a var=(%random% %% rangemax) + 1 设置一个值 1..rangemax

你甚至可以写一个子程序:

:randrange
set /a %1=1+(%random% %% %2)
goto :eof

然后任何时候你想要一个随机数 1..rangemax,只需使用

call :randrange nameofvariabletoset rangemax

这将保存所有重复输入 - 但我从您喜欢输入的变量命名方案中看到。嗯 - 接受所有类型,我想......


最新回复:

线

    IF %enemyability1choosechance% LEQ %enemyabilty1hitchance%

有语法错误(缺少()

确实意识到那个时候你已经开了4个街区,那是第五个?您继续打开总共 7 个区 block - 并且一个都没有关闭。除非你删掉了一堆右括号,否则就是这样。

当你在该地区时,你有

set enemyability1truedamage=0

set/a...

作为数字赋值更好

请学会缩进。它使 block 语句更具可读性。

关于windows - 我只为一组/一个不断收到大量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27317307/

有关windows - 我只为一组/一个不断收到大量错误的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  8. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  9. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  10. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

随机推荐