Bash文本游戏开发:捕获用户输入并提取括号内容的问题
Bash文本游戏:输入处理与括号内容提取方案
嘿,我明白你现在卡在Bash文本游戏的输入处理和括号内容提取上了——别担心,咱们一步步来解决这个问题。你当前的代码没法区分不同输入、提取括号内容,核心原因是没有把选项和对应的括号内容做关联存储,也缺少针对性的输入合法性校验逻辑。
下面是具体的解决方案,直接可以复用和扩展:
1. 先把选项数据结构化管理
与其零散打印选项,不如用数组把所有选项统一存起来,这样后续处理(打印、匹配、提取)都会更方便,也利于游戏后续扩展新选项:
# 定义游戏选项:每个元素对应一条可选操作,格式保持你原来的样式 options=( "1 - forward (door.1)" "2 - turn left (garden.path)" "3 - check surroundings (look.around)" )
2. 严格的输入合法性验证
我们需要确保用户输入的是1到选项总数之间的整数,拒绝字母、负数、超出范围的数字。可以用正则+数值判断实现:
# 获取选项总数 total_options=${#options[@]} # 循环直到用户输入合法 while true; do read -p "Enter your choice (1-$total_options): " user_input # 验证逻辑:必须是纯数字,且在1到total_options之间 if [[ "$user_input" =~ ^[0-9]+$ ]] && [ "$user_input" -ge 1 ] && [ "$user_input" -le "$total_options" ]; then break else echo "Invalid input! Please enter a number between 1 and $total_options." fi done
3. 提取括号内的目标字符串
对于选中的选项,我们可以用sed的正则捕获组来提取括号里的内容,这个方法简单直接:
# 根据用户输入(注意数组索引从0开始,所以要减1)获取选中的选项 selected_option=${options[$((user_input - 1))]} # 用sed匹配并提取括号内的内容:.*(\(.*\)).* 表示匹配任意内容+括号,\(.*\)是捕获组,\1输出捕获的内容 target_string=$(echo "$selected_option" | sed -n 's/.*(\(.*\)).*/\1/p')
完整可运行代码示例
把上面的逻辑整合起来,就是一个可以直接测试的完整脚本:
#!/bin/bash echo -e "You are in front of the gardenhouse.\n" # 定义游戏选项 options=( "1 - forward (door.1)" "2 - turn left (garden.path)" "3 - check surroundings (look.around)" ) # 打印所有选项 for option in "${options[@]}"; do echo -e "$option" done echo -e "\n" total_options=${#options[@]} # 输入验证循环 while true; do read -p "Enter your choice (1-$total_options): " user_input if [[ "$user_input" =~ ^[0-9]+$ ]] && [ "$user_input" -ge 1 ] && [ "$user_input" -le "$total_options" ]; then break else echo "Invalid input! Please enter a number between 1 and $total_options." fi done # 提取括号内的字符串 selected_option=${options[$((user_input - 1))]} result=$(echo "$selected_option" | sed -n 's/.*(\(.*\)).*/\1/p') # 输出结果 echo -e "\nYou chose: $selected_option" echo "Extracted string: $result"
这个脚本的优势在于:
- 选项用数组管理,后续加新选项只需要在数组里加一行就行
- 输入验证覆盖了所有常见的无效情况
- 括号内容提取逻辑通用,只要你的选项格式保持
(内容)的样式就可以用
内容的提问来源于stack exchange,提问作者Peter Core
相关产品推荐
相关产品推荐

