如何简化Batch编写的石头剪刀布游戏的胜负判断逻辑?
优化Batch石头剪刀布游戏代码
这里提供一种更简洁且健壮的实现方案,解决你原代码中大量重复判断的问题:
@echo off color f setlocal enabledelayedexpansion :: 定义选项与名称的映射 set "choice[0]=paper" set "choice[1]=scissors" set "choice[2]=rock" echo welcome to rock paper scissors :LOOP cls echo 0=(paper) 1=(scissors) 2=(rock) set "input=" set /p input=select one of the 3: :: 输入合法性校验 if not defined input goto LOOP echo %input% | findstr /r "^[0-2]$" >nul || ( echo 请输入0、1或2中的有效数字! pause >nul goto LOOP ) :: 生成电脑随机选择 set /a cpu=%random% %%3 echo 电脑选择了: !choice[%cpu%]! :: 数学公式一键判断胜负 set /a result=(%input% - %cpu% + 3) %%3 if %result% equ 0 ( echo 平局! ) else if %result% equ 1 ( echo 你赢了! ) else ( echo 你输了! ) pause >nul goto :LOOP
关键优化点说明
简化胜负判定:
利用数学运算(input - cpu + 3) %%3的结果直接判断:- 结果为0:双方选择相同,平局
- 结果为1:玩家获胜(符合剪刀赢布、布赢石头、石头赢剪刀的规则)
- 结果为2:玩家失败
彻底替代原代码中6种胜负组合的重复if嵌套。
严谨输入校验:
- 清空input变量避免用户直接回车时的旧值残留
- 使用
findstr正则验证输入是否为0-2的纯数字,非法输入直接引导重新选择,解决原代码输入无效值时的逻辑混乱。
模块化选项管理:
用数组存储选项名称,电脑选择后直接通过变量索引输出,避免重复的if判断,后续修改选项名称或扩展规则更便捷。延迟扩展支持:
开启enabledelayedexpansion确保代码块中动态变量(如!choice[%cpu%]!)能正确读取。
内容的提问来源于stack exchange,提问作者Cip0llø
相关产品推荐
相关产品推荐

