gpt4 book ai didi

batch-file - 批处理,在随机化数字数组然后添加它们时出现错误

转载 作者:行者123 更新时间:2023-12-02 03:40:37 25 4
gpt4 key购买 nike

好吧,我的批处理系统有问题,我正在尝试通过城镇模拟器创建一个批处理游戏(类似的)我正在尝试做的一件事(问题)是“宣传”你的城市,主要是让随机的“人”住在你的房子里,我的问题是当你做广告时它变得非常奇怪......这是代码:

:3
if %houses% LSS 2 goto YCGT
cls
set /a send=%hutpop%+%small_housepop%+%housepop%+%slight_housepop%+%medium_housepop%+%big_housepop%+%mansionpop%
set /a hutpop=%hutpop%+%random% %% %maxhutpop%
set /a small_housepop=%small_housepop%+%random% %% %maxsmall_housepop%
set /a housepop=%housepop%+%random% %% %maxhousepop%
set /a slight_housepop=%slight_housepop%+%random% %% %maxslight_housepop%
set /a medium_housepop=%medium_housepop%+%random% %% %maxmedium_housepop%
set /a big_housepop=%big_housepop%+%random% %% %maxbig_housepop%
set /a mansionpop=%mansionpop%+%random% %% %maxmansionpop%
set/a pop=!hutpop!+!small_housepop!+!housepop!+!slight_housepop!+!medium_housepop!+!big_housepop!+!mansionpop!
if %pop% GTR %maxpop% (
set /a pop=%pop%-%maxpop%
)
timeout /t 5 /nobreak >nul
set /a recieve=!pop!-!send!
echo You have gained %recieve%!
echo You now have %pop%
pause>nul
goto rstart

然后发生的事情是它要么超过...给我“不能除以零”错误,要么总是给我你得到的最大人口数量...(这绝对不是全部CODE!!! 这是一个相当远的游戏......我不会发布所有 1,000 行代码......只问你是否需要什么)

最佳答案

您的除以零错误是由 %max...pop% 之一的值为 0 引起的。如果 %max...pop% 为空,你会得到一个缺少操作数错误。

您显然调用了 delayedexpansion,否则 !var! 会在 set/a 中显示错误。它将在 block 语句之外工作(即多行括号语句序列有时用于 FOR 循环或 IF...ELSE... 但不是必需的. 您的 set/a pop=... 将与 %var% 一样运行,因为 %var% 的值不是在 block 内更改。

我建议您开始使用内部子例程来简化您的任务。例如,我修改了您的一些代码以分配要使用的值:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:3
SET houses=10
set hutpop=12
SET small_housepop=12
SET housepop=12
SET slight_housepop=12
SET medium_housepop=12
SET big_housepop=12
SET mansionpop=12
set maxhutpop=100
SET maxsmall_housepop=0
if %houses% LSS 2 goto YCGT
REM cls
set /a send=%hutpop%+%small_housepop%+%housepop%+%slight_housepop%+%medium_housepop%+%big_housepop%+%mansionpop%
CALL :adjust hutpop
CALL :adjust hutpop
CALL :adjust hutpop
CALL :adjust hutpop
CALL :adjust hutpop
set /a hutpop=%hutpop%+%random% %% %maxhutpop%
set /a small_housepop=%small_housepop%+%random% %% %maxsmall_housepop%
set /a housepop=%housepop%+%random% %% %maxhousepop%
set /a slight_housepop=%slight_housepop%+%random% %% %maxslight_housepop%
set /a medium_housepop=%medium_housepop%+%random% %% %maxmedium_housepop%
set /a big_housepop=%big_housepop%+%random% %% %maxbig_housepop%
set /a mansionpop=%mansionpop%+%random% %% %maxmansionpop%
set/a pop=!hutpop!+!small_housepop!+!housepop!+!slight_housepop!+!medium_housepop!+!big_housepop!+!mansionpop!
if %pop% GTR %maxpop% (
set /a pop=%pop%-%maxpop%
)
REM timeout /t 5 /nobreak >nul
set /a recieve=!pop!-!send!
echo You have gained %recieve%!
echo You now have %pop%
pause>nul
goto rstart
:: increment population with limit
:adjust
CALL SET /a %1+=%RANDOM% %%%% %%max%1%%
CALL SET /a hpop=%1 - %%max%1%%
IF %hpop% gtr 0 CALL SET %1=%%max%1%%
CALL ECHO %1=%%%1%%
GOTO :EOF

注意 CALL :adjust hutpop 调用子例程 adjust 修改 hutpop 的值,限制为 maxhutpop。我故意用它五次来展示 hutpop 将如何调整但顶出。在你的情况下,你所需要的就是

call :adjust hutpop
call :adust small_housepop
...

还要注意一个潜在的问题。因为您有 delayedexpansion 操作,所以如果您的消息 You have gained %recieve%! 需要更改为 You have gained %recieve%!你需要另一个 %need%! 然后批处理可能会尝试找到一个“变量” 你需要另一个 %need%,很可能找不到它,因此替换一个空字符串 - 这可能会令人费解。


进一步 20131201T0511Z

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:3
set hutpop=12
SET small_housepop=17
set maxhutpop=100
SET maxsmall_housepop=70
set /a send=%hutpop%+%small_housepop%
ECHO you had %send%=%hutpop%+%small_housepop%
CALL :adjust hutpop
CALL :adjust small_housepop
set /a pop=%hutpop%+%small_housepop%
set /a recieve=%pop%-%send%
echo You have gained %recieve%!
echo You now have %pop%=%hutpop%+%small_housepop%
ECHO ====== with pop-increase MORE limited
set hutpop=12
SET small_housepop=17
set maxhutpop=100
SET maxsmall_housepop=70
set /a send=%hutpop%+%small_housepop%
ECHO you had %send%=%hutpop%+%small_housepop%
CALL :adjust2 hutpop
CALL :adjust2 small_housepop
set /a pop=%hutpop%+%small_housepop%
set /a recieve=%pop%-%send%
echo You have gained %recieve%!
echo You now have %pop%=%hutpop%+%small_housepop%

goto :eof

:adjust
CALL SET /a %1+=%RANDOM% %%%% %%max%1%%
CALL SET /a hpop=%1 - %%max%1%%
IF %hpop% gtr 0 CALL SET %1=%%max%1%%
CALL ECHO %1=%%%1%%
GOTO :EOF

:adjust2
CALL SET /a %1+=(%RANDOM% %%%% %%max%1%% / 8)
CALL SET /a hpop=%1 - %%max%1%%
IF %hpop% gtr 0 CALL SET %1=%%max%1%%
CALL ECHO %1=%%%1%%
GOTO :EOF

这是一个小型独立版本,使用两个略有不同的 :adjust 过程。这是一些典型的输出(当然,你的会有所不同,因为使用了 %RANDOM%)

you had 29=12+17
hutpop=100
small_housepop=62
You have gained 133
You now have 162=100+62
====== with pop-increase MORE limited
you had 29=12+17
hutpop=15
small_housepop=24
You have gained 10
You now have 39=15+24

现在您需要做的就是跟随弹跳球并添加其他住宅类型。

关于batch-file - 批处理,在随机化数字数组然后添加它们时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20305528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com