-2
votes

Erreur de fichier batch "/ 100 était inattendue à ce moment"

Je crée un jeu pour m'amuser avec un script batch mais dans ce code j'ai un message d'erreur "/ 100 inattendu pour le moment" Je ne comprends vraiment pas pourquoi? Aidez-moi, s'il vous plaît!!

@echo off
mode con cols=110 lines=32
setlocal enabledelayedexpansion

set npctier=0
goto randomnpc

:randomnpc
if %npctier% EQU 0 ( 
set npctype=Wooden Dummy
set /a npclvl=%random% %% 5+1
set /a npchp=%npclvl% * 100
set /a npcdmg=0
set /a npcdef=(%npchp%*5)/100
set /a npcxp=%npclvl%*100 )

:combatchoice
echo.
echo. You see %npctype% level %npclvl%.
echo.
echo. The %npctype%'s Health: %npchp% HP
echo.
goto main


2 commentaires

Le ) juste avant le / est vu comme la parenthèse fermante pour l' IF %npctier%... , et doit être échappé avec un IF %npctier%... ( ^ ) Ainsi: ^)


Au-delà de cela, vous développez les variables avec% d'expansion qui se développera avec la valeur détenue par les variables avant l'exécution des blocs If, donc même après avoir corrigé le problème de parantthèse, vous obtiendrez une erreur de division par 0.


3 Réponses :


1
votes

Je recommande d'ouvrir d'abord une invite de commande , exécutez set /? et lisez attentivement et complètement l'aide de sortie du haut de la première au bas de la dernière page. Il est expliqué:

Toutes les chaînes non numériques de l'expression sont traitées comme des noms de variables d'environnement dont les valeurs sont converties en nombres avant de les utiliser. Si un nom de variable d'environnement est spécifié mais n'est pas défini dans l'environnement actuel, une valeur de zéro est utilisée. Cela vous permet de faire de l'arithmétique avec des valeurs de variables d'environnement sans avoir à taper tous ces signes% pour obtenir leurs valeurs.

Donc, il peut être écrit simplement set /A npchp=npclvl * 100 car npclvl à l'intérieur de l'expression arithmétique est interprété comme le nom d'une variable d'environnement et la ligne de commande fonctionne même en étant à l'intérieur d'un bloc de commande commençant par ( et se terminant par la correspondance ) sans utilisation de l'expansion différée des variables d'environnement.

Ensuite, exécutez cmd /? et relisez l'aide de sortie attentivement et complètement du haut de la première au bas de la dernière page. Il est expliqué qu'un nom de fichier (ou toute autre chaîne d'argument) contenant un espace l'un de ces caractères &()[]{}^=;!'+,`~ Doit être inclus dans " pour que ces caractères soient interprétés comme des caractères littéraux d'une chaîne d'argument.

Veuillez lire aussi Comment l'interpréteur de commandes Windows (CMD.EXE) analyse-t-il les scripts?

Pour cette raison, la ligne de commande set /a npcdef=(%npchp%*5)/100 doit être écrite avec l'une des notations suivantes:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
%SystemRoot%\System32\mode.com con cols=110 lines=32

set npctier=0
set "npctype=Wooden Dummy"

:randomnpc
if %npctier% NEQ 0 goto CombatChoice
set /A npclvl=%random% %% 5 + 1
set /A npchp=npclvl*100
set npcdmg=0
set /A npcdef=npchp*5/100
set /A npcxp=npclvl*100

:CombatChoice
echo/
echo You see %npctype% level %npclvl%.
echo/
echo The %npctype%'s health: %npchp% HP
echo/

endlocal

Le caractère caret ^ échappe au caractère suivant pour être interprété comme un caractère littéral, sauf que le caractère suivant est % qui doit être échappé avec % .

Les recommandations publiées sur le sujet du forum DosTips ECHO. ÉCHEC à donner du texte ou une ligne vide - À la place, utilisez ECHO / devrait également être pris en compte lors de l'écriture de fichiers batch qui produisent des lignes vides.

Le fichier batch avec la principale amélioration de changer la condition IF pour éviter complètement l'utilisation d'un bloc de commande.

set /A npcdef=npchp*5/100
set /A npcdef=npchp * 5 / 100
set /A "npcdef=(npchp*5)/100"
set /A npcdef=(npchp*5^)/100

Voir aussi Pourquoi aucune chaîne ne s'affiche avec 'echo% var%' après l'utilisation de 'set var = text' sur la ligne de commande? Il contient plusieurs astuces sur la façon d'utiliser la commande SET non écrites dans l'aide / documentation de cette commande.


0 commentaires

0
votes

Si vous souhaitez conserver la même structure, alors quelque chose comme ça serait mieux:

@Echo Off
SetLocal EnableExtensions
%__APPDIR__%mode.com 110, 32
Set "npctier=0"

:randomnpc
If %npctier% Equ 0 (
    Set "npctype=Wooden Dummy"
    Set "npcdmg=0"
    Set /A "npclvl=(%RANDOM% %% 5) + 1"
    Set /A "npchp=npclvl * 100, npcdef=npclvl * 5, npcxp=npchp"
)

:combatchoice
Echo=
Echo You see %npctype% level %npclvl%.
Echo=
Echo The %npctype%'s Health: %npchp% HP
Echo=
GoTo main

Notez qu'il est possible de définir plusieurs valeurs à l'aide de Set /A dans une seule instruction arithmétique


0 commentaires

0
votes

Avant de vous laisser emporter par la création d'un long script qui répète le code, je pense qu'il vaut la peine de vous présenter les macros par lots.

Les macros dans Batch sont des commandes ou des blocs de commandes assignés à des variables, et grâce à l'utilisation de boucles For combinées au conditionnement If / Else peuvent être utilisées pour capturer des arguments permettant aux variables d'être utilisées comme fonctions.

L'exemple ci-dessous contient deux variantes d'une macro qui peuvent être utilisées pour générer facilement différents types de rencontre avec un script répétitif minimal tout en évitant l'utilisation d'appels inefficaces à des fonctions.

Les macros doivent être définies avant l'activation de l'expansion retardée car les variables référencées lors de l'exécution de la macro sont définies à l'aide de ! expansion de sorte que la valeur avec laquelle la macro est analysée lors du développement est la valeur de la variable au moment de l'analyse, et non sa valeur lors de la définition.

@echo off
mode con cols=110 lines=32 
(Set \n=^^^
%= macro newline DNR =%
)
(Set LF=^


%= Linefeed DNR =%)

rem Example 1: npc generation; Fixed Formula macro
rem USAGE: %npc{generic}%{Npc name / type}{npc max level}{npc multiplier}{damage value or formula}
Set npc{generic}=For %%n in (1 2)Do if %%n==2 (%\n%
 For /F "Tokens=1,2,3,4 Delims={}" %%G in ("!Params!")Do (%\n%
  Set "npctype=%%G" %\n%
  Set /a "npclvl= !random! %% %%H + 1" %\n%
  Set /a "npchp= !npclvl! * %%I" %\n%
  Set /a "npcdmg= %%J" %\n%
  Set /a "npcdef= ( !npchp! * %%H ) / %%I" %\n%
  Set /a "npcxp=!npclvl! * %%I" %\n%
  echo/Enemy: !npctype!!LF!level: !npclvl!!LF!HP: !npchp!!LF!Damage: !npcdmg!!LF!Defence: !npcdef!!LF!XP: !npcxp!!LF!%\n%
 )%\n%
) Else Set Params=

rem Example 2: npc generation; Supplied Formula macro
rem USAGE: %npc{boss}%{Npc name / type}{level value or formula}{hp value or formula}{damage value or formula}{defense value or formula}{xp value or formula}
Set npc{boss}=For %%n in (1 2)Do if %%n==2 (%\n%
 For /F "Tokens=1,2,3,4,5,6 Delims={}" %%G in ("!Params!")Do (%\n%
  Set "npctype=%%G" %\n%
  Set /a "npclvl= %%H " %\n%
  Set /a "npchp= %%I " %\n%
  Set /a "npcdmg= %%J " %\n%
  Set /a "npcdef= %%K " %\n%
  Set /a "npcxp= %%L " %\n%
  echo/Enemy: !npctype!!LF!level: !npclvl!!LF!HP: !npchp!!LF!Damage: !npcdmg!!LF!Defence: !npcdef!!LF!XP: !npcxp!!LF!%\n%
 )%\n%
) Else Set Params=
rem enable delayed expansion after macro definitions
setlocal enableextensions enabledelayedexpansion

:randomnpc
 %npc{generic}%{Wooden Dummy}{5}{100}{0}
 Pause
 %npc{boss}%{Dragon}{!random! %% 10 + 10}{npclvl * 200}{npchp / 20}{npchp / (npclvl / 2)}{npclvl * 150}
Endlocal
Goto :Eof


1 commentaires

@PhuocPham Si vous avez d'autres questions concernant le développement de moteurs de jeux par lots, la conception de jeux ou comment obtenir certains résultats / effets, je vous recommande de les poser sur dostips.com - car les questions sush sont généralement considérées comme hors sujet en cas de débordement de pile.