找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: zzz19760225

批处理勇士大闯关改中医许阳批处理的可能

[复制链接]
 楼主| 发表于 2026-1-18 10:24:11 | 显示全部楼层
perl下,按任意键继续。
按任意键继续.pl

  1. #!/usr/bin/perl
  2. use utf8;
  3. use strict;
  4. use warnings;
  5. use open qw(:std :utf8);

  6. # === “按任意键继续”函数(无需回车)===
  7. sub press_any_key {
  8.     print "\n> 按任意键继续...";
  9.    
  10.     # 保存当前终端设置
  11.     my $old_stty = `stty -g`;
  12.     chomp $old_stty;

  13.     # 设置为 raw 模式:关闭回显、关闭行缓冲
  14.     system("stty raw -echo");

  15.     # 读取一个字符(阻塞)
  16.     my $key = getc(STDIN);

  17.     # 恢复原始终端设置
  18.     system("stty $old_stty");

  19.     print "\n";  # 换行,让后续输出整洁
  20.     return $key;
  21. }

  22. # === 示例使用 ===
  23. print "武器店老板正在说话...\n";
  24. sleep 1;

  25. press_any_key();  # 用户按任意键后继续

  26. print "你走进了武器店!\n";
  27. <>;
复制代码
 楼主| 发表于 2026-1-18 10:25:45 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-18 12:22 编辑

perl下goto输入出错,不退出。
输入出错处理.pl

  1. #!/usr/bin/perl
  2. # 指定使用 /usr/bin/perl 解释器运行此脚本

  3. use strict;
  4. use warnings;
  5. use utf8;                    # 告诉 Perl 源代码是 UTF-8 编码(含中文)
  6. use open qw(:std :encoding(UTF-8));  # 设置 STDIN/STDOUT/STDERR 为 UTF-8

  7. # 定义子程序 a0,用于自动扫描当前脚本中所有标签
  8. sub a0 {
  9.     open my $a1, '<:encoding(UTF-8)', __FILE__ or die "输入错误: $!";
  10.    
  11.     my %a2;
  12.    
  13.     while (my $a3 = <$a1>) {
  14.         chomp $a3;
  15.         
  16.         # 修改点:支持中英文、数字、下划线的标签(包括汉字)
  17.         if ($a3 =~ /^\s*([\w\x{4e00}-\x{9fff}]+)\s*:\s*$/u) {
  18.             my $a4 = $1;
  19.             $a2{$a4} = 1;
  20.         }
  21.     }
  22.    
  23.     close $a1;
  24.     return \%a2;
  25. }

  26. my $a5 = a0();

  27. o:
  28. print "请输入: ";
  29. my $a = <STDIN>; chomp $a;

  30. unless (exists $a5->{$a}) { goto o; }

  31. goto $a;

  32. a:
  33. print "a000\n";
  34. goto o;

  35. b:
  36. print "b111\n";
  37. goto o;

  38. c:
  39. print "退出中\n";
  40. sleep 1;
  41. exit;

  42. 中文:
  43. print "中文标签也可以。\n";
  44. goto o;

  45. d:
  46. print "新增搜索添加标签!\n";
  47. goto o;

复制代码
 楼主| 发表于 2026-1-18 10:27:02 | 显示全部楼层
perl下字符小机器人
小机器人自适应滚动信息框.pl

  1. #!/usr/bin/perl
  2. use utf8;
  3. use strict;
  4. use warnings;
  5. use open qw(:std :utf8);
  6. use Time::HiRes qw(sleep);  # 核心模块,用于精确 sleep

  7. # === 输入文本 ===
  8. my $input = "武器店开业啦!神剑打怪掉宝箱!aaaaaaaaaaaaaa快来买吧。今天打八折哦!错过就没有了!再不来就卖完了!";

  9. # === 按标点切分句子 ===
  10. my @sentences = grep { /\S/ } split /(?<=[。!?.!?])/, $input;
  11. @sentences = ($input) if !@sentences || $input !~ /[。!?.!?]/;

  12. # === 显示宽度计算 ===
  13. sub display_width {
  14.     my ($str) = @_;
  15.     my $w = 0;
  16.     for my $c (split //, $str) {
  17.         $w += (ord($c) < 128) ? 1 : 2;
  18.     }
  19.     return $w;
  20. }

  21. # 找最大宽度
  22. my $max_width = 1;
  23. for my $s (@sentences) {
  24.     my $w = display_width($s);
  25.     $max_width = $w if $w > $max_width;
  26. }

  27. # === 固定配置 ===
  28. my $TEXT_AREA_WIDTH = $max_width;
  29. my $DIALOG_WIDTH    = $TEXT_AREA_WIDTH + 4;
  30. my $MAX_DISPLAY_LINES = 4;  # 小机器人只有4行,所以最多显示4行

  31. # 边框
  32. my $top    = "╔" . ("═" x ($DIALOG_WIDTH - 2)) . "╗";
  33. my $bottom = "╚" . ("═" x ($DIALOG_WIDTH - 2)) . "╝";

  34. # 补齐函数
  35. sub pad_to_width {
  36.     my ($text, $target) = @_;
  37.     my $cur = display_width($text);
  38.     return $text . (" " x ($target - $cur)) if $cur < $target;
  39.     return $text;
  40. }

  41. # 左侧行(固定4行)
  42. my @robot = (
  43.     "┃小┃╔━━━━╗",
  44.     "┃机┃┃∩ ∩ ┃",
  45.     "┃器┃┃ △  ┃",
  46.     "┃人╠╣ ┌┐ ┃",
  47.     "╚━━╝╚━━━━╝"
  48. );

  49. # 总行数
  50. my $total = @sentences;
  51. my $offset = 0;  # 当前滚动起始位置

  52. # 清屏函数(可选)
  53. sub clear_screen { print "\x1b[2J\x1b[H"; }

  54. # === 主循环:滚动显示 ===
  55. while (1) {
  56.     clear_screen();  # 每次刷新前清屏,避免重叠

  57.     print "╲ ╱\n";
  58.     print "╔━━╗ ╲ ╱  $top\n";

  59.     # 显示当前窗口的最多4行
  60.     for my $i (0 .. $MAX_DISPLAY_LINES - 1) {
  61.         my $global_index = $offset + $i;
  62.         my $dialog_line;
  63.         if ($global_index < $total) {
  64.             my $padded = pad_to_width($sentences[$global_index], $TEXT_AREA_WIDTH);
  65.             $dialog_line = "┃ $padded ┃";
  66.         } else {
  67.             # 不足4行时,显示空行(保持边框对齐)
  68.             my $padded = " " x $TEXT_AREA_WIDTH;
  69.             $dialog_line = "┃ $padded ┃";
  70.         }

  71.         print $robot[$i] . $dialog_line . "\n";
  72.     }

  73.     print $robot[-1] . "$bottom\n";  # 底部用最后一行机器人对齐



  74.     # 更新偏移:循环滚动
  75.     $offset = ($offset + 1) % $total;

  76.     # 暂停2秒
  77.     sleep(2);
  78. }
复制代码
 楼主| 发表于 2026-1-23 19:43:22 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-25 12:25 编辑

自修改行
(需求:用perl本身的文字处理,而不是_DATA_,将首位“a:”行,修改为“a:;print "456";”。)
百度“perl修改自身程序里的信息区”,再ai自动信息下修改。
只是启动文件和结束文件的时候,进行读取和存储,每次使用硬盘文件两次,是没有问题的,对应打开文本txt使用的反复读取修改,可以算少的。只要不是将文本当作变量往死里用,一刻不停的游戏信息存取,应该是没有问题的吧。
标签6修改文本.pl

  1. #!/usr/bin/perl
  2. use strict;          # 启用严格模式:强制变量声明、禁止符号引用等,提高代码健壮性
  3. use warnings;        # 启用运行时警告:帮助发现未初始化变量、可疑语法等问题
  4. use utf8;            # 声明源代码文件使用 UTF-8 编码(支持中文注释和字符串)
  5. binmode(STDOUT, ":utf8");  # 设置标准输出流为 UTF-8 编码,确保打印中文或特殊字符不乱码



  6. # 1,建立文件变量
  7. # 获取当前正在执行的脚本文件路径( $0 是 Perl 内置变量,表示脚本自身)
  8. my $a1 =  $0;



  9. # 2,读取文件
  10. # 以只读模式打开当前脚本文件,若失败则终止程序并报错
  11. open my $a2, '<',  $a1 or die "打不开文件:  $!";

  12. # 一次性读取整个文件的所有行到数组 @a3 中(<$a2> 是 readline 操作,注意无空格!)
  13. my @a3 = <$a2>;

  14. # 关闭输入文件句柄,释放资源
  15. close $a2;



  16. # 3,寻找匹配内容,对应替换内容
  17. # 遍历文件的每一行
  18. for my $a4 (@a3) {
  19.     # 如果当前行以 "a:" 开头(^ 表示行首)
  20.     if ( $a4 =~ /^a:/) {
  21.         # 将整行替换为新的标准内容:标签 a: 后紧跟 print "456";
  22.          $a4 = qq{a:;print "456";\n};
  23.     }
  24. }



  25. # 4,输出存到文件
  26. # 以写入模式(覆盖原文件)重新打开当前脚本
  27. open $a2, '>',  $a1 or die "写不进文件:  $!";

  28. # 将修改后的所有行写回文件,实现“自我修改”
  29. print $a2 @a3;

  30. # 关闭输出文件句柄
  31. close $a2;



  32. # 打印提示信息,告知用户脚本已成功更新
  33. print "脚本已自我更新(a: 行已标准化)。\n";

  34. # 以下是在本次运行中实际执行的代码(注意:它不会被保存到文件中,因为文件已在上面被改写)
  35. a:;print "123";

  36. # 等待用户从标准输入读取一行(例如按回车),防止终端窗口立即关闭
  37. <>;
复制代码
AI自动信息总是加空格,总是用中文~,而不是英文~,奇怪。
$0文件本身,$!出错错误信息,两个固定。其余a1~a4,四个随意编辑名字的变量。my局部变量
 楼主| 发表于 2026-1-25 21:32:25 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-25 21:41 编辑

换成注释行#,这样不会直接程序读取。
读取首位"#数据行:",其后双引号里的内容为散列变量。
读取文本自身1.pl

  1. #!/usr/bin/perl
  2. use strict;                # 启用严格模式,强制变量声明等,提升代码安全性
  3. use warnings;              # 启用警告,帮助发现潜在错误(如未初始化变量)
  4. use utf8;                  # 声明源代码文件使用 UTF-8 编码,支持中文字符
  5. binmode(STDOUT, ":utf8");  # 设置标准输出为 UTF-8 编码,确保中文正确显示

  6. my $a0 = $0;               # 获取当前正在执行的脚本文件路径( $ 0 是 Perl 内置变量)

  7. open my $a1, '<:encoding(UTF-8)', $a0 or die "打不开文件:  $!";  # 以只读方式打开当前脚本文件,失败则报错退出
  8. my @a2 = <$a1>;            # 一次性读取整个文件的所有行,存入数组 @a2
  9. close $a1;                 # 关闭文件句柄,释放资源

  10. my %a4;                    # 声明一个空的哈希(散列)%a4,用于存储解析出的键值对

  11. for my $a3 (@a2) {         # 遍历脚本的每一行( $ a3 代表当前行)
  12.     if ($a3 =~ /^#数据行:\s*"([^"]+)"/) {# 匹配以 "#数据行:" 开头,后紧跟双引号字符串
  13.         my $a5 =  $1;       # 提取双引号内的内容
  14.         for my $a6 (split /,\s*/, $a5) {      # 按逗号(允许后接空格)分割成多个键值对片段
  15.            if ($a6 =~ /^([^:]+):(.+)$/) {# 对每个片段,用冒号分割成键和值(左边是键,右边是值)
  16.                   $a4{$1} = $2;                # 将键值对存入哈希 %a4
  17.             }
  18.         }
  19.         last;              # 找到第一个匹配的 a:; 行后就停止循环,避免重复处理
  20.     }
  21. }

  22. print "解析出的哈希:\n";   # 打印提示信息
  23. for my $a7 (sort keys %a4) {  # 遍历哈希 %a4 的所有键(按字母顺序排序)
  24.     print "$a7 => $a4{$a7}\n";  # 打印每个键值对,格式为 "键 => 值"
  25. }

  26. open  $a1, '>:encoding(UTF-8)',  $a0 or die "写不进文件:  $!";  # 以写入模式(覆盖)重新打开当前脚本文件
  27. print  $a1 @a2;             # 将原始内容原样写回文件(实现“自我保留”,虽未修改但完成重写)
  28. close  $a1;                 # 关闭文件句柄

  29. #数据行:"b1:123,b2:456,b3:789";
  30. print "按回车继续或结束\n";   # 打印提示信息
  31. <>;                        # 等待用户输入一行(例如按回车),防止终端窗口立即关闭
复制代码
输出结果

  1. 解析出的哈希:
  2. b1 => 123
  3. b2 => 456
  4. b3 => 789
  5. 按回车继续或结束
复制代码
 楼主| 发表于 2026-1-26 22:24:43 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-2-26 10:27 编辑

输入1位自动执行跳转
1跳转选择if.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. END { system('stty sane'); }  # 确保程序退出时终端恢复正常

  5. a0:
  6.     print ":";
  7.     system('stty raw -echo');   # 设置终端为 raw 模式(无缓冲、无回显)
  8.     my $a = getc(STDIN);
  9.     system('stty sane');    # 立即恢复终端(即使出错也要恢复!)
  10.     exit unless defined $a;
  11.     eval{ # eval用于没有对应跳转标签时,出错自动退出的问题。这样没有对应标签,也不会直接就退出程序。
  12.     # 使用字符串比较(eq),不是数值比较(==)
  13.          if ($a eq '1') { print "选择1\n"; }
  14.          if ($a eq 'a') { print "选择a\n"; }
  15.          if ($a eq '3') { print "选择3\n"; }
  16.          if ($a eq '4') { goto a4; }
  17.          if ($a eq '5') { goto a5; }
  18.     }; #注意后面的分号别忘了,没有分号就出错。
  19.     goto a0;
复制代码
输出结果

  1. ::选择1
  2. :选择a
  3. :选择3
  4. ::::::选择a
  5. :选择1
  6. :选择3
  7. :
复制代码
两个问题,一个是直接关闭窗口x的程序接不上,另一个单字符输入的串联实现可能。
 楼主| 发表于 2026-1-27 21:37:54 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-27 21:52 编辑

2位数的输入,立刻自动执行。
1跳转选择if3.pl

  1. #!/usr/bin/perl
  2. use strict;        # 启用严格模式,强制声明变量等,避免低级错误
  3. use warnings;      # 启用警告,帮助发现潜在问题

  4. # 程序退出时自动恢复终端设置(防止 raw 模式残留导致终端异常)
  5. END { system('stty sane'); }

  6. # 主循环标签:程序从这里不断重复读取用户输入
  7. a0:
  8.     print ":";     # 打印提示符,表示等待用户输入

  9.     # 调用 a1() 子程序,读取第一个按键字符(不回显、无需回车)
  10.     my $c1 = a1();
  11.     exit unless defined $c1;   # 如果读取失败(如 Ctrl+D),则退出程序

  12.     # 判断第一个字符是否为数字字符 '0' 到 '9'
  13.     if ( $c1 ge '0' &&  $c1 le '9') {
  14.         # 读取第二个按键字符
  15.         my $c2 = a1();

  16.         # 检查第二个字符是否存在且也是数字
  17.         if (defined $c2 &&  $c2 ge '0' &&  $c2 le '9') {
  18.             # 将两个字符拼接成两位数的字符串(如 "1" + "1" → "11")
  19.             my $d = "$c1$c2";

  20.             # 注意:这里应使用字符串比较(eq),但原代码用了数值比较(==)
  21.             # 虽然 Perl 中 "11" == '11' 会返回真(因自动转换),但存在风险
  22.             # 建议改为 eq,但此处按你原结构保留(已可工作)

  23.             # 根据输入的两位数跳转到对应标签
  24.             if    ( $d == '11') { goto wqd; }   # 输入 11,跳转到飞镖处理
  25.             elsif ( $d == '22') { goto fzd; }   # 输入 22,跳转到风之刀处理
  26.             elsif ( $d == '33') { goto spd; }   # 输入 33,跳转到闪电披风处理
  27.             else {
  28.                 # 未定义的选项,提示未知并返回主循环
  29.                 print "未知选项: $d\n";
  30.                 goto a0;
  31.             }
  32.         } else {
  33.             # 第二个字符不是有效数字
  34.             print "第二位无效\n";
  35.             goto a0;
  36.         }
  37.     } else {
  38.         # 第一个字符不是数字
  39.         print "第一位必须是数字\n";
  40.         goto a0;
  41.     }

  42. # ========== 各功能标签(模拟批处理中的 goto 目标) ==========

  43. wqd:
  44.     print "执行:飞镖相关操作\n";   # 处理选项 11 的逻辑
  45.     goto a0;                      # 返回主循环,继续等待新输入

  46. fzd:
  47.     print "执行:风之刀相关操作\n"; # 处理选项 22 的逻辑
  48.     goto a0;

  49. spd:
  50.     print "执行:闪电披风相关操作\n"; # 处理选项 33 的逻辑
  51.     goto a0;

  52. # ========== 子程序定义 ==========

  53. # a1():以原始模式(raw)读取单个字符,不回显,无需按回车
  54. sub a1 {
  55.     system('stty raw -echo');   # 设置终端为 raw 模式,并关闭回显
  56.     my $b = getc(STDIN);        # 从标准输入读取一个字符
  57.     system('stty sane');        # 立即恢复终端正常模式(重要!)
  58.     return  $b;                  # 返回读取到的字符
  59. }
复制代码
输出结果

  1. :执行:飞镖相关操作
  2. :执行:风之刀相关操作
  3. :执行:闪电披风相关操作
  4. :未知选项: 44
  5. :未知选项: 55
  6. :第一位必须是数字
  7. :第一位必须是数字
  8. :第一位必须是数字
  9. :第一位必须是数字
  10. :执行:飞镖相关操作
  11. :执行:风之刀相关操作
  12. :执行:闪电披风相关操作
  13. :未知选项: 44
  14. :未知选项: 77
  15. :未知选项: 88
  16. :
复制代码
 楼主| 发表于 2026-1-28 21:04:14 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-29 10:34 编辑

直接执行和回车,两种模式切换。
1跳转选择if4.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. binmode(STDOUT, ":utf8");

  6. END { system('stty sane'); }

  7. # 预加载所有标签
  8. my $valid_labels = load_labels();
  9. my $mode = 'normal';

  10. print "普通模式启动\n";
  11. print "命令:";
  12. print "a:普通模式,";
  13. print "a1:单字符RAW,";
  14. print "a2:两位数RAW,";
  15. print "RAW模式下:";
  16. print "a返回普通模式";
  17. print "s切换RAW子模式 (a1 &#8596; a2)\n\n";

  18. main_loop:
  19. while (1) {
  20.     if ( $mode eq 'raw1') {
  21.         print "[RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]: ";
  22.         system('stty raw -echo');
  23.         my $key = getc(STDIN);
  24.         system('stty sane');
  25.         exit unless defined  $key;

  26.         if ( $key eq 'a') {
  27.              $mode = 'normal';
  28.             print "\n\n切换到普通模式\n";
  29.             goto main_loop;
  30.         }
  31.         elsif ( $key eq 's') {
  32.              $mode = 'raw2';
  33.             print "\n\n切换到两位数 RAW 模式\n";
  34.             goto main_loop;
  35.         }
  36.         elsif ( $key =~ /^[1-9]$/) {
  37.             my $label = "b$key";
  38.             if (exists  $valid_labels->{ $label}) {
  39.                 goto  $label;
  40.             } else {
  41.                 print "\n标签 ' $label' 未定义\n";
  42.                 goto main_loop;
  43.             }
  44.         } else {
  45.             print "\n忽略: ' $key'\n";
  46.             goto main_loop;
  47.         }
  48.     }
  49.     elsif ( $mode eq 'raw2') {
  50.         print "[RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]: ";

  51.         # --- 读第一个字符 ---
  52.         system('stty raw -echo');
  53.         my $k1 = getc(STDIN);
  54.         system('stty sane');
  55.         exit unless defined  $k1;

  56.         if ( $k1 eq 'a') {
  57.              $mode = 'normal';
  58.             print "\n\n切换到普通模式";
  59.             goto main_loop;
  60.         }
  61.         elsif ( $k1 eq 's') {
  62.              $mode = 'raw1';
  63.             print "\n\n切换到单字符 RAW 模式";
  64.             goto main_loop;
  65.         }
  66.         elsif ( $k1 !~ /^[0-9]$/) {
  67.             print "\n第一个字符非数字,忽略\n";
  68.             goto main_loop;
  69.         }

  70.         # --- 读第二个字符 ---
  71.         print "(已输  $k1) 再按数字/s/a: ";
  72.         system('stty raw -echo');
  73.         my $k2 = getc(STDIN);
  74.         system('stty sane');
  75.         exit unless defined  $k2;

  76.         if ( $k2 eq 'a') {
  77.              $mode = 'normal';
  78.             print "\n切换到普通模式\n";
  79.             goto main_loop;
  80.         }
  81.         elsif ( $k2 eq 's') {
  82.              $mode = 'raw1';
  83.             print "\n切换到单字符 RAW 模式\n";
  84.             goto main_loop;
  85.         }
  86.         elsif ( $k2 !~ /^[0-9]$/) {
  87.             print "\n第二个字符非数字,忽略\n";
  88.             goto main_loop;
  89.         }

  90.         my $num =  $k1.$k2;
  91.         my $label = "b$num";
  92.         if (exists  $valid_labels->{ $label}) {
  93.             goto  $label;
  94.         } else {
  95.             print "\n标签 ' $label' 未定义\n";
  96.             goto main_loop;
  97.         }
  98.     }
  99.     else {
  100.         # ========== 普通模式 ==========
  101.         print "普通模式: ";
  102.         my $input = <STDIN>;
  103.         last unless defined  $input;
  104.         chomp  $input;

  105.         if    ( $input eq 'a')  {  $mode = 'normal'; print "已在普通模式\n"; }
  106.         elsif ( $input eq 'a1') {  $mode = 'raw1';   print "\n进入单字符 RAW 模式\n"; }
  107.         elsif ( $input eq 'a2') {  $mode = 'raw2';   print "\n进入两位数 RAW 模式\n"; }
  108.         elsif ( $input eq 'quit' ||  $input eq 'exit') { last; }
  109.         elsif ( $input =~ /^b\d+$/ && exists  $valid_labels->{ $input}) {
  110.             goto  $input;
  111.         }
  112.         elsif ( $input =~ /^\d+$/) {
  113.             my $label = "b$input";
  114.             if (exists  $valid_labels->{ $label}) {
  115.                 goto  $label;
  116.             } else {
  117.                 print "标签 ' $label' 不存在\n";
  118.             }
  119.         }
  120.         else {
  121.             print "未知命令: ' $input'\n";
  122.         }
  123.         goto main_loop;
  124.     }
  125. }

  126. print "再见!\n";
  127. exit;

  128. # ========== 加载标签 ==========
  129. sub load_labels {
  130.     open my $fh, '<:encoding(UTF-8)', __FILE__ or die "无法读取自身:  $!";
  131.     my %labels;
  132.     while (my $line = <$fh>) {
  133.         chomp  $line;
  134.     if ( $line =~ /^\s*([\w\x{4e00}-\x{9fff}]+)\s*:/) {
  135.              $labels{ $1} = 1;
  136.         }
  137.     }
  138.     close $fh;
  139.     return \%labels;
  140. }

  141. # ========== 公共标签(可按需扩展)==========
  142. b0:;print "执行: 选择0\n";   goto main_loop;
  143. b1:;print "执行: 选择1\n";   goto main_loop;
  144. b2:;print "执行: 选择2\n";   goto main_loop;
  145. b3:;print "执行: 选择3\n";   goto main_loop;
  146. b4:;print "执行: 选择4\n";   goto main_loop;
  147. b5:;print "执行: 选择5\n";   goto main_loop;
  148. b6:;print "执行: 选择6\n";   goto main_loop;
  149. b7:;print "执行: 选择7\n";   goto main_loop;
  150. b8:;print "执行: 选择8\n";   goto main_loop;
  151. b9:;print "执行: 选择9\n";   goto main_loop;
  152. b10:;  print "执行: 选择10\n";  goto main_loop;
  153. b11:;  print "执行: 选择11\n";  goto main_loop;
  154. b45:;  print "执行: 选择45\n";  goto main_loop;
  155. b99:;  print "执行: 选择99\n";  goto main_loop;
  156. b00:;  print "执行: 选择00\n";  goto main_loop;
  157. b000:; print "执行: 选择000\n"; goto main_loop;
复制代码
输出结果

  1. 普通模式启动
  2. 命令:a:普通模式,a1:单字符RAW,a2:两位数RAW,RAW模式下:a返回普通模式s切换RAW子模式 (a1 &#8596; a2)

  3. 普通模式: 1
  4. 执行: 选择1
  5. 普通模式: 2
  6. 执行: 选择2
  7. 普通模式: a1

  8. 进入单字符 RAW 模式
  9. [RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]:

  10. 切换到两位数 RAW 模式
  11. [RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]:

  12. 切换到普通模式普通模式: 1
  13. 执行: 选择1
  14. 普通模式: 2
  15. 执行: 选择2
  16. 普通模式: a1

  17. 进入单字符 RAW 模式
  18. [RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]: 执行: 选择1
  19. [RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]: 执行: 选择2
  20. [RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]: 执行: 选择3
  21. [RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]:

  22. 切换到两位数 RAW 模式
  23. [RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]: (已输  1) 再按数字/s/a:
  24. 标签 ' b12' 未定义
  25. [RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]: (已输  1) 再按数字/s/a: 执行: 选择11
  26. [RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]: (已输  4) 再按数字/s/a: 执行: 选择45
  27. [RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]: (已输  9) 再按数字/s/a: 执行: 选择99
  28. [RAW2] 输入两位数字;s=切到RAW1, a=普通, s=切到RAW1, [RAW2]:

  29. 切换到普通模式普通模式: a1

  30. 进入单字符 RAW 模式
  31. [RAW1] 按数字执行;s=切到RAW2,a=普通, [RAW1]:
复制代码
 楼主| 发表于 2026-1-29 20:57:31 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-1-30 10:50 编辑

换成~-=切换普通raw12三模式
1跳转选择if6.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use open ':std', ':encoding(utf8)';

  6. END { system('stty sane'); }

  7. my $valid_labels = load_labels();
  8. my $mode = 'normal';

  9. print "普通模式启动:\n";
  10. print "输入'-'单字符raw1,输入'='两位数raw2,其他输入将被回显(支持中英文、数字、符号)\n";

  11. main_loop:
  12. while (1) {
  13.     if ($mode eq 'raw1') {
  14.         print "[RAW1]按一数字执行,空格换raw2模式,~换普通模式,[RAW1]:";
  15.         system('stty raw -echo');
  16.         my $key = getc(STDIN);
  17.         system('stty sane');
  18.         exit unless defined $key;

  19.         if ($key eq '~') {
  20.             $mode = 'normal';
  21.             print "\n\n~回普通模式\n";
  22.             goto main_loop;
  23.         }
  24.         elsif ($key eq ' ') {
  25.             $mode = 'raw2';
  26.             print "\n\n空格换RAW2模式\n";
  27.             goto main_loop;
  28.         }
  29.         elsif ($key =~ /^[1-9]$/) {
  30.             my $label = "b$key";
  31.             if (exists $valid_labels->{$label}) {
  32.                 goto $label;
  33.             } else {
  34.                 print "\n标签'$label' 未定义\n";
  35.                 goto main_loop;
  36.             }
  37.         } else {
  38.             print "\n忽略:'$key'\n";
  39.             goto main_loop;
  40.         }
  41.     }
  42.     elsif ($mode eq 'raw2') {
  43.         print "[RAW2]输两数字,空格换raw1模式,~换普通模式,[RAW2]:";

  44.         # --- 第一个字符 ---
  45.         system('stty raw -echo');
  46.         my $k1 = getc(STDIN);
  47.         system('stty sane');
  48.         exit unless defined $k1;

  49.         if ($k1 eq '~') {
  50.             $mode = 'normal';
  51.             print "\n\n~返回普通模式\n";
  52.             goto main_loop;
  53.         }
  54.         elsif ($k1 eq ' ') {
  55.             $mode = 'raw1';
  56.             print "\n\n空格换RAW1模式\n";
  57.             goto main_loop;
  58.         }
  59.         elsif ($k1 !~ /^[0-9]$/) {
  60.             print "\n第一个字符非数字,忽略\n";
  61.             goto main_loop;
  62.         }

  63.         # --- 第二个字符 ---
  64.         print "\n(已输$k1)再按一数字/~/空格: ";
  65.         system('stty raw -echo');
  66.         my $k2 = getc(STDIN);
  67.         system('stty sane');
  68.         exit unless defined $k2;

  69.         if ($k2 eq '~') {
  70.             $mode = 'normal';
  71.             print "\n\n~返回普通模式\n";
  72.             goto main_loop;
  73.         }
  74.         elsif ($k2 eq ' ') {
  75.             $mode = 'raw1';
  76.             print "\n\n空格换RAW1模式\n";
  77.             goto main_loop;
  78.         }
  79.         elsif ($k2 !~ /^[0-9]$/) {
  80.             print "\n第二个字符非数字,忽略\n";
  81.             goto main_loop;
  82.         }

  83.         my $num = $k1 . $k2;
  84.         my $label = "b$num";
  85.         if (exists $valid_labels->{$label}) {
  86.             goto $label;
  87.         } else {
  88.             print "\n标签 '$label' 未定义\n";
  89.             goto main_loop;
  90.         }
  91.     }
  92.     else {
  93.         # ========== 普通模式 ==========
  94.         print "普通模式: ";
  95.         my $input = <STDIN>;
  96.         last unless defined  $input;
  97.         chomp  $input;

  98.         if    ( $input eq '~')  {  $mode = 'normal'; print "已在普通模式\n"; }
  99.         elsif ( $input eq '-') {  $mode = 'raw1';   print "\n-进RAW1模式\n"; }
  100.         elsif ( $input eq '=') {  $mode = 'raw2';   print "\n=进RAW2模式\n"; }
  101.         elsif ( $input eq 'quit' ||  $input eq 'exit') { last; }
  102.         elsif ( $input =~ /^b\d+$/ && exists  $valid_labels->{ $input}) {
  103.             goto  $input;
  104.         }
  105.         elsif ( $input =~ /^\d+$/) {
  106.             my $label = "b$input";
  107.             if (exists  $valid_labels->{ $label}) {
  108.                 goto  $label;
  109.             } else {
  110.                 print "标签 ' $label' 不存在\n";
  111.             }
  112.         }
  113.         else {
  114.             print "未知命令: ' $input'\n";
  115.         }
  116.         goto main_loop;
  117.     }
  118. }

  119. print "再见!\n";
  120. exit;

  121. # ========== 自动加载当前文件中的标签 ==========
  122. sub load_labels {
  123.     open my $fh, '<:encoding(UTF-8)', __FILE__ or die "打不开文件: $!";
  124.     my %labels;
  125.     while (my $line = <$fh>) {
  126.         chomp $line;
  127.         # 匹配行首的 "xxx:" 标签(允许后面有代码)
  128.         if ($line =~ /^\s*([\w\x{4e00}-\x{9fff}]+)\s*:/) {
  129.             $labels{$1} = 1;
  130.         }
  131.     }
  132.     close $fh;
  133.     return \%labels;
  134. }

  135. # ========== 公共执行标签 ==========
  136. b0:;   print "执行: 选择0\n";   goto main_loop;
  137. b1:;   print "执行: 选择1\n";   goto main_loop;
  138. b2:;   print "执行: 选择2\n";   goto main_loop;
  139. b3:;   print "执行: 选择3\n";   goto main_loop;
  140. b4:;   print "执行: 选择4\n";   goto main_loop;
  141. b5:;   print "执行: 选择5\n";   goto main_loop;
  142. b6:;   print "执行: 选择6\n";   goto main_loop;
  143. b7:;   print "执行: 选择7\n";   goto main_loop;
  144. b8:;   print "执行: 选择8\n";   goto main_loop;
  145. b9:;   print "执行: 选择9\n";   goto main_loop;
  146. b10:;  print "执行: 选择10\n";  goto main_loop;
  147. b11:;  print "执行: 选择11\n";  goto main_loop;
  148. b45:;  print "执行: 选择45\n";  goto main_loop;
  149. b99:;  print "执行: 选择99\n";  goto main_loop;
  150. b00:;  print "执行: 选择00\n";  goto main_loop;
  151. b000:; print "执行: 选择000\n"; goto main_loop;
  152. 中文:; print "执行: 选择中文了\n"; goto main_loop;
  153. ba:; print "执行: 选择了a\n"; goto main_loop;
复制代码
输出结果

  1. 普通模式启动:
  2. 输入'-'单字符raw1,输入'='两位数raw2,其他输入将被回显(支持中英文、数字、符号)
  3. 普通模式: 1
  4. 执行: 选择1
  5. 普通模式: ~
  6. 已在普通模式
  7. 普通模式: -

  8. -进RAW1模式
  9. [RAW1]按一数字执行,空格换raw2模式,~换普通模式,[RAW1]:

  10. ~回普通模式
  11. 普通模式: =

  12. =进RAW2模式
  13. [RAW2]输两数字,空格换raw1模式,~换普通模式,[RAW2]:

  14. ~返回普通模式
  15. 普通模式: -

  16. -进RAW1模式
  17. [RAW1]按一数字执行,空格换raw2模式,~换普通模式,[RAW1]:

  18. 空格换RAW2模式
  19. [RAW2]输两数字,空格换raw1模式,~换普通模式,[RAW2]:
  20. (已输1)再按一数字/~/空格: 执行: 选择11
  21. [RAW2]输两数字,空格换raw1模式,~换普通模式,[RAW2]:
  22. (已输9)再按一数字/~/空格: 执行: 选择99
  23. [RAW2]输两数字,空格换raw1模式,~换普通模式,[RAW2]:

  24. 空格换RAW1模式
  25. [RAW1]按一数字执行,空格换raw2模式,~换普通模式,[RAW1]:执行: 选择1
  26. [RAW1]按一数字执行,空格换raw2模式,~换普通模式,[RAW1]:执行: 选择2
  27. [RAW1]按一数字执行,空格换raw2模式,~换普通模式,[RAW1]:
复制代码
后面程序卡死了,不知道该做什么。应该是需要结构路线循环图,这些结构路线里的剧情,进菜菜城,出菜菜城,建增减删看账户群,重复循环。
游戏开始和结束,游戏的玩家账户和角色建增减删看,游戏结构本体,本体内外交流交换易的重复循环流水线,流水线上的地图世界容器。
 楼主| 发表于 2026-2-9 21:07:36 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-2-9 22:07 编辑

用普通输入模式,靠近回车键的几个左手按键,避开\键,几个组合,从01~20
eval,避免没有标签出错退出。
;=0
lop[]=12345
l]o]p][]]]=678910
l]]o]]p]][]]]]]=1112131415
l]]]o]]]p]]][]]]]]]=1617181920

  1. #!/usr/bin/perl
  2. use utf8;
  3. use strict;
  4. use warnings;
  5. use open ':std', ':encoding(utf8)';
  6. my $a;
  7. a0:
  8. eval{
  9. print "输入并回车:";$a=<STDIN>;chomp $a;

  10. if ($a eq ";"){goto a0;}
  11. if ($a eq "l"){goto a1;}
  12. if ($a eq "o"){goto a2;}
  13. if ($a eq "p"){goto a3;}
  14. if ($a eq "["){goto a4;}
  15. if ($a eq "]"){goto a5;}
  16. if ($a eq "l]"){goto a6;}
  17. if ($a eq "o]"){goto a7;}
  18. if ($a eq "p]"){goto a8;}
  19. if ($a eq "[]"){goto a9;}
  20. if ($a eq "]]"){goto a10;}

  21. if ($a eq "l]]"){goto a11;}
  22. if ($a eq "o]]"){goto a12;}
  23. if ($a eq "p]]"){goto a13;}
  24. if ($a eq "[]]"){goto a14;}
  25. if ($a eq "]]]"){goto a15;}
  26. if ($a eq "l]]]"){goto a16;}
  27. if ($a eq "o]]]"){goto a17;}
  28. if ($a eq "p]]]"){goto a18;}
  29. if ($a eq "[]]]"){goto a19;}
  30. if ($a eq "]]]]"){goto a20;}
  31. };

  32. goto a0;


  33. a7:
  34. system("clear");        # 同样清空历史(取决于终端)
  35. print "\033[H";   # 移动光标到顶部
  36. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  37. print "▓                                  武器店                                  ▓\n";
  38. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  39. print "昵称:%nc% 气血:%rhp%/%rhpsx% 法力:%rmp%/%rmpsx% 攻击:%rgj% 防御:%rfy%\n";
  40. print "等级:%lv% 经验:%exp%/%sjexp% 银两:%yl% 点数:%ds% 饱食度:%bsd%/%bsdsx%\n";
  41. print "武器:%wqmc% 攻击+%wqgj% 服装:%fzmc% 防御+%fzfy%\n";
  42. print "腰带:%ydmc% 气血上限+%ydqx% 饰品:%mzmc% 魔法上限+%mzmf%\n";
  43. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  44. print "╲ ╱\n";
  45. print "╔━━╗ ╲ ╱  ╔━━━━━━━━━━━━━━━━━━━━━━━━╗\n";
  46. print "┃小┃╔━━━━╗┃这里是武器店,武器店可以┃\n";
  47. print "┃机┃┃∩ ∩ ┃┃购买武器来提升攻击力,打┃\n";
  48. print "┃器┃┃ △  ┃┃怪可获得金钱!          ┃\n";
  49. print "┃人╠╣ ┌┐ ┃╚━━━━━━━━━━━━━━━━━━━━━━━━╝\n";
  50. print "╚━━╝╚━━━━╝\n";
  51. print "名称 属性 价格\n";
  52. print "1.红缨枪 攻击+10 100\n";
  53. print "2.曲尖枪 攻击+30 100\n";
  54. print "3.锯齿矛 攻击+60 200\n";
  55. print "4.乌金三叉戟 攻击+100 255\n";
  56. print "5.火焰枪 攻击+150 255\n";
  57. print "6.墨杆金钩 攻击+200 255\n";
  58. print "7.玄铁矛 攻击+250 255\n";
  59. print "8.金蛇信 攻击+310 1000\n";
  60. print "9.丈八点钢矛 攻击+380 1000\n";
  61. print "10.暗夜 攻击+450 10000\n";
  62. print "11.梨花 攻击+450 10000\n";
  63. print "12.霹雳 攻击+450 10000\n";
  64. print "0.返回\n";
  65. print "\n";
  66. print "请输入:";


  67. goto a0;

  68. a8:
  69. system("clear");        # 同样清空历史(取决于终端)
  70. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  71. print "▓                                  服装店                                  ▓\n";
  72. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  73. print "昵称:%nc% 气血:%rhp%/%rhpsx% 法力:%rmp%/%rmpsx% 攻击:%rgj% 防御:%rfy%\n";
  74. print "等级:%lv% 经验:%exp%/%sjexp% 银两:%yl% 点数:%ds% 饱食度:%bsd%/%bsdsx%\n";
  75. print "武器:%wqmc% 攻击+%wqgj% 服装:%fzmc% 防御+%fzfy%\n";
  76. print "腰带:%ydmc% 气血上限+%ydqx% 饰品:%mzmc% 魔法上限+%mzmf%\n";
  77. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  78. print "╲ ╱\n";
  79. print "╔━━╗ ╲ ╱  ╔━━━━━━━━━━━━━━━━━━━━━━━━╗\n";
  80. print "┃小┃╔━━━━╗┃这里是服装店,服装店能购┃\n";
  81. print "┃机┃┃∩ ∩ ┃┃买衣服,来提高防御力!  ┃\n";
  82. print "┃器┃┃ △  ┃┃                        ┃\n";
  83. print "┃人╠╣ ┌┐ ┃╚━━━━━━━━━━━━━━━━━━━━━━━━╝\n";
  84. print "╚━━╝╚━━━━╝\n";
  85. print "名称 属性 价格\n";
  86. print "1.布衣 防御+10 200\n";
  87. print "2.皮衣 防御+30 300\n";
  88. print "3.鳞甲 防御+60 500\n";
  89. print "4.梭子衣 防御+100 500\n";
  90. print "5.紧身衣 防御+150 500\n";
  91. print "6.钢甲 防御+200 600\n";
  92. print "7.夜魔披风 防御+250 600\n";
  93. print "8.龙骨甲 防御+310 1000\n";
  94. print "9.死亡斗篷 防御+380 10000\n";
  95. print "10.神谕披风 防御+450 25000\n";
  96. print "0.返回\n";
  97. print "\n";
  98. print "请输入:";

  99. goto a0;

  100. a9:
  101. system("clear");        # 同样清空历史(取决于终端)
  102. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  103. print "▓                                  饰品店                                  ▓\n";
  104. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  105. print "昵称:%nc% 气血:%rhp%/%rhpsx% 法力:%rmp%/%rmpsx% 攻击:%rgj% 防御:%rfy%\n";
  106. print "等级:%lv% 经验:%exp%/%sjexp% 银两:%yl% 点数:%ds% 饱食度:%bsd%/%bsdsx%\n";
  107. print "武器:%wqmc% 攻击+%wqgj% 服装:%fzmc% 防御+%fzfy%\n";
  108. print "腰带:%ydmc% 气血上限+%ydqx% 饰品:%mzmc% 魔法上限+%mzmf%\n";
  109. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  110. print "╲ ╱\n";
  111. print "╔━━╗ ╲ ╱  ╔━━━━━━━━━━━━━━━━━━━━━━━━╗\n";
  112. print "┃小┃╔━━━━╗┃这里是饰品店!在这里可以┃\n";
  113. print "┃机┃┃∩ ∩ ┃┃购买饰品提高魔法上限!  ┃\n";
  114. print "┃器┃┃ △  ┃┃                        ┃\n";
  115. print "┃人╠╣ ┌┐ ┃╚━━━━━━━━━━━━━━━━━━━━━━━━╝\n";
  116. print "╚━━╝╚━━━━╝\n";
  117. print "名称 属性 价格\n";
  118. print "1.迷你戒指 魔法上限+10 100\n";
  119. print "2.铜戒指 魔法上限+20 150\n";
  120. print "3.金戒指 魔法上限+60 200\n";
  121. print "4.魔法指环 魔法上限+120 300\n";
  122. print "5.魔晶指环 魔法上限+200 350\n";
  123. print "6.元素之环 魔法上限+300 400\n";
  124. print "7.暗魔指环 魔法上限+400 500\n";
  125. print "8.星河指环 魔法上限+500 1000\n";
  126. print "9.猎魔指环 魔法上限+620 1500\n";
  127. print "10.雷霆指环 魔法上限+760 5000\n";
  128. print "11.幻龙之心 魔法上限+900 7000\n";
  129. print "0.返回\n";
  130. print "\n";
  131. print "请输入:";


  132. goto a0;

  133. a10:
  134. system("clear");        # 同样清空历史(取决于终端)
  135. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  136. print "▓                                   药店                                   ▓\n";
  137. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  138. print "昵称:%nc% 气血:%rhp%/%rhpsx% 法力:%rmp%/%rmpsx% 攻击:%rgj% 防御:%rfy%\n";
  139. print "等级:%lv% 经验:%exp%/%sjexp% 银两:%yl% 点数:%ds% 饱食度:%bsd%/%bsdsx%\n";
  140. print "武器:%wqmc% 攻击+%wqgj% 服装:%fzmc% 防御+%fzfy%\n";
  141. print "腰带:%ydmc% 气血上限+%ydqx% 饰品:%mzmc% 魔法上限+%mzmf%\n";
  142. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  143. print "╲ ╱\n";
  144. print "╔━━╗ ╲ ╱  ╔━━━━━━━━━━━━━━━━━━━━━━━━╗\n";
  145. print "┃小┃╔━━━━╗┃这里是药店!这里购买的道┃\n";
  146. print "┃机┃┃∩ ∩ ┃┃具可在战斗使用!不过很贵┃\n";
  147. print "┃器┃┃ △  ┃┃......                  ┃\n";
  148. print "┃人╠╣ ┌┐ ┃╚━━━━━━━━━━━━━━━━━━━━━━━━╝\n";
  149. print "╚━━╝╚━━━━╝\n";
  150. print "\n";
  151. print "1.购买金疮药 恢复气血200点 价格:500 剩余数量:%jcy%\n";
  152. print "\n";
  153. print "2.购买仙狐延 恢复法力200点 价格:500 剩余数量:%xhy%\n";
  154. print "\n";
  155. print "       ╔\n";
  156. print "dragon.  购买龙魂丹    拥有龙的力量  价格:100000  拥有数量:%lhd%\n";
  157. print "                   ╝\n";
  158. print "\n";
  159. print "3.免费恢复气血,魔力(剩余次数:%mfhf%)\n";
  160. print "\n";
  161. print "4.返回\n";
  162. print "\n";
  163. print "请输入:";


  164. goto a0;

  165. a11:
  166. system("clear");        # 同样清空历史(取决于终端)
  167. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  168. print "▓                                   酒店                                   ▓\n";
  169. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  170. print "昵称:%nc% 气血:%rhp%/%rhpsx% 法力:%rmp%/%rmpsx% 攻击:%rgj% 防御:%rfy%\n";
  171. print "等级:%lv% 经验:%exp%/%sjexp% 银两:%yl% 点数:%ds% 饱食度:%bsd%/%bsdsx%\n";
  172. print "武器:%wqmc% 攻击+%wqgj% 服装:%fzmc% 防御+%fzfy%\n";
  173. print "腰带:%ydmc% 气血上限+%ydqx% 饰品:%mzmc% 魔法上限+%mzmf%\n";
  174. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  175. print "\n";
  176. print "1.吃包子 恢复气血100点 饱食度100点 价格:50\n";
  177. print "\n";
  178. print "2.住店(恢复气血,魔法,但需要耗费20秒时间) 价格:200\n";
  179. print "\n";
  180. print "3.返回\n";
  181. print "\n";
  182. print "请输入:";


  183. goto a0;

复制代码
 楼主| 发表于 2026-2-23 13:48:39 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-2-28 17:13 编辑

用户信息
用户信息变量1.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. binmode(STDOUT, ":utf8");
  6. binmode(STDIN, ":utf8");
  7. use Term::ANSIColor;

  8. my %hash;
  9. a00:
  10. %hash = (
  11.     nc      => '昵称1',
  12.     lv      => 1,           # 等级
  13.     ds      => 0,           # 充值点数
  14.     yl      => 0,           # 银两
  15.     suiyin  => 0,           # 碎银(不是整银,需要一个操作合成银两)
  16.     exp     => 0,           # 经验
  17.     sjexp   => 20,          # 最大升级经验值
  18.     sjexpdz => 10,          # 最大升级经验值
  19.     bsd     => 1000,        # 饱食度
  20.     bsdsx   => 1000,        # 最大饱食值
  21.     rgj     => 20,          # 攻击
  22.     rfy     => 10,          # 防御
  23.     rhp     => 30,          # 气血值
  24.     rhpsx   => 30,          # 最大气血值
  25.     rmp     => 30,          # 魔法值
  26.     rmpsx   => 30,          # 最大魔法值
  27.     wqmc    => '无',        # 武器
  28.     wqgj    => 0,           # 武器攻击
  29.     fzmc    => '无',        # 服装
  30.     fzfy    => 0,           # 服装防御
  31.     ydmc    => '无',        # 腰带
  32.     ydqx    => 0,           # 腰带加气血
  33.     mzmc    => '无',        # 戒指
  34.     mzmf    => 0,           # 戒指加魔法
  35.     xixue   => 0,           # 吸血
  36.     mfhf    => 3,           # 免费恢复气血和魔法的次数
  37.     hh      => 1,           # 回合
  38.     mb      => 0,           # 面包
  39.     bg      => 0,           # 饼干
  40.     jcy     => 0,           # 金创药
  41.     xhy     => 0,           # 仙狐延
  42.     lhd     => 0,           # 龙魂丹
  43.     jnl1    => '空卡槽',    # 技能1
  44.     jnl2    => '空卡槽',    # 技能2
  45.     jnl3    => '空卡槽',    # 技能3
  46.     qnfyj   => 0,           # 劝降翻译机

  47.     js      => 0,           # 击杀数
  48.     bosszgr => int(rand(10)) + 1, # 怪老大装备暴率 (1-10)
  49. );

  50. print "\n";
  51. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  52. print "▓";
  53. print color('black on_black'), "一二三四五六七八九十壹贰叁肆伍陆柒", color('reset');
  54. print "菜菜城";
  55. print color('black on_black'), "一二三四五六七八九十壹贰叁肆伍陆柒", color('reset');
  56. print "▓\n";
  57. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓00▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";
  58. print "昵称:$hash{nc}  气血:$hash{rhp}/$hash{rhpsx}  法力:$hash{rmp}/$hash{rmpsx}  攻击:$hash{rgj}  防御:$hash{rfy}\n";
  59. print "等级:$hash{lv}  经验:$hash{exp}/$hash{sjexp}  银两:$hash{yl}  点数:$hash{ds}  饱食度:$hash{bsd}/$hash{bsdsx}\n";
  60. print "武器:$hash{wqmc}  攻击+$hash{wqgj}  服装:$hash{fzmc}  防御+$hash{fzfy}\n";
  61. print "腰带:$hash{ydmc}  气血上限+$hash{ydqx}  饰品:$hash{mzmc}  魔法上限+$hash{mzmf}\n";
  62. print "▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓\n";

  63. <>;
  64. goto a00;
复制代码
输出

  1. ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  2. ▓一二三四五六七八九十壹贰叁肆伍陆柒菜菜城一二三四五六七八九十壹贰叁肆伍陆柒▓
  3. ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓00▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
  4. 昵称:昵称1  气血:30/30  法力:30/30  攻击:20  防御:10
  5. 等级:1  经验:0/20  银两:0  点数:0  饱食度:1000/1000
  6. 武器:无  攻击+0  服装:无  防御+0
  7. 腰带:无  气血上限+0  饰品:无  魔法上限+0
  8. ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
复制代码
点数可以无限,巨大数量值,也可以每天设置一个定量,点数用光了就下机,不给再玩了,除非修改这个设置,否则自愿自限的游戏数量养成习惯。家长自制给孩子玩的游戏这个概念空间,而不是接受市场给予的游戏。家长与孩子的PK挑战竞赛互动,将网吧的人群互动气氛,带到家庭。
彩色字,换掉空格计数的中文计数数字,和背景都是黑色的,与背景同色,是看不到的。
 楼主| 发表于 2026-2-25 21:38:32 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-2-28 11:46 编辑

游戏开始画面色彩条,用简化的8色。
开始画面.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;

  5. # 设置 UTF-8 输出,支持中文和方块
  6. binmode(STDOUT, ':utf8');
  7. $| = 1; # 关闭缓冲

  8. # --- 配置区域 ---
  9. my $delay = 0.001; # 基本色比较鲜艳,稍微慢一点(0.15s)看得更清楚

  10. # 【修改点】颜色映射改为 8 基本色 (0-7)
  11. # 顺序:黑 -> 红 -> 绿 -> 黄 -> 蓝 -> 紫 -> 青 -> 白
  12. my @color_codes = (0, 1, 2, 3, 4, 5, 6, 7);
  13. my @color_names = ('黑', '红', '绿', '黄', '蓝', '紫', '青', '白');

  14. # 长条方块
  15. my $blocks = "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
  16. a0:
  17. print "开始执行 8 基本色动画...\n";

  18. for my $i (1 .. 100) {
  19.     # 遍历 8 种颜色
  20.     for my $idx (0 .. $#color_codes) {
  21.         my $code = $color_codes[$idx];
  22.         my $name = $color_names[$idx];
  23.         
  24.         # 使用 sprintf 构造前景色 (38;5;N)
  25.         my $start = sprintf("\e[38;5;%dm", $code);
  26.         my $reset = "\e[0m";
  27.         
  28.         # 打印:[颜色][方块][重置]
  29.         # 为了调试,你可以在方块后加上颜色名称,这里为了美观只打印方块
  30.         print "${start}${blocks}${reset}\n";
  31.         
  32.         # 延时
  33.         select(undef, undef, undef, $delay);
  34.     }
  35. }

  36. print sprintf("\e[1;38;5;15m%s\e[0m\n", "完成。");
  37. goto a1; a3:;  # 停留等待执行,按任意键继续。
  38. goto a0;

  39. a1:
  40.     print "\n> 按任意键继续...";
  41.     my $old_stty = `stty -g`;    # 保存当前终端设置
  42.     chomp $old_stty;
  43.     system("stty raw -echo");    # 设置为 raw 模式:关闭回显、关闭行缓冲
  44.     my $key = getc(STDIN);    # 读取一个字符(阻塞)
  45.     system("stty $old_stty");    # 恢复原始终端设置
  46.     print "\n";  # 换行,让后续输出整洁
  47. goto a2;

  48. a2:
  49. print "\033[2J\033[H";  # 清屏并光标归位&&
  50. goto a3;
复制代码
输出

  1. 开始执行 8 基本色动画...
  2. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  3. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  4. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  5. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  6. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  7. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  8. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  9. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  10. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  11. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  12. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  13. .........................
  14. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  15. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  16. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  17. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  18. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  19. 完成。

复制代码
8种色条
 楼主| 发表于 2026-3-3 16:37:13 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-3-4 11:02 编辑

散列存到最后一行注释行(排序不能加非数字,否则会提出警示)
散列排序.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;                  # 声明源代码文件使用 UTF-8 编码,支持中文字符
  5. binmode(STDOUT, ":utf8");  # 设置标准输出使用UTF-8编码

  6. # 定义一个哈希表,存储数字和对应的字符串值
  7. my %numbers = (
  8.     '1'      => '昵称1',
  9.     '2'      => 1,           # 等级
  10.     '3'      => 0,           # 充值点数
  11.     '4'      => 0,           # 银两
  12.     '5'      => 0,           # 碎银(不是整银,需要一个操作合成银两)
  13.     '6'      => 0,           # 经验
  14.     '7'      => 20,          # 最大升级经验值
  15.     '8'      => 10,          # 最大升级经验值
  16.     '9'      => 1000,        # 饱食度
  17.     '10'     => 1000,        # 最大饱食值
  18.     '11'     => 20,          # 攻击
  19.     '12'     => 10,          # 防御
  20.     '13'     => 30,          # 气血值
  21.     '14'     => 30,          # 最大气血值
  22.     '15'     => 30,          # 魔法值
  23.     '16'     => 30,          # 最大魔法值
  24.     '17'     => '无',        # 武器
  25.     '18'     => 0,           # 武器攻击
  26.     '19'     => '无',        # 服装
  27.     '20'     => 0,           # 服装防御
  28.     '21'     => '无',        # 腰带
  29.     '22'     => 0,           # 腰带加气血
  30.     '23'     => '无',        # 戒指
  31.     '24'     => 0,           # 戒指加魔法
  32.     '25'     => 0,           # 吸血
  33.     '26'     => 3,           # 免费恢复气血和魔法的次数
  34.     '27'     => 1,           # 回合
  35.     '28'     => 0,           # 面包
  36.     '29'     => 0,           # 饼干
  37.     '30'     => 0,           # 金创药
  38.     '31'     => 0,           # 仙狐延
  39.     '32'     => 0,           # 龙魂丹
  40.     '33'     => '空卡槽',    # 技能1
  41.     '34'     => '空卡槽',    # 技能2
  42.     '35'     => '空卡槽',    # 技能3
  43.     '36'     => 0,           # 劝降翻译机

  44.     '37'     => 0,           # 击杀数
  45.     '38'     => int(rand(10)) + 1, # 怪老大装备暴率 (1-10)
  46. );

  47. # 以追加模式打开脚本自身文件
  48. open(my $fh, '>>:encoding(UTF-8)', $0) or die "无法打开自身文件: $!";

  49. # 向文件写入 "#0:" 前缀
  50. print $fh "#0:";

  51. # 对哈希表的键进行数字排序(0,1,2,10,11,20),并输出对应的值
  52. foreach my $key (sort { $a <=> $b } keys %numbers) {
  53.     print $fh "$numbers{$key},";
  54. }

  55. # 写入换行符并关闭文件
  56. print $fh "\n";
  57. close($fh);
  58. <>;
  59. #0:昵称1,1,0,0,0,0,20,10,1000,1000,20,10,30,30,30,30,无,0,无,0,无,0,无,0,0,3,1,0,0,0,0,0,空卡槽,空卡槽,空卡槽,0,0,10,
  60. #0:昵称1,1,0,0,0,0,20,10,1000,1000,20,10,30,30,30,30,无,0,无,0,无,0,无,0,0,3,1,0,0,0,0,0,空卡槽,空卡槽,空卡槽,0,0,3,
  61. #0:昵称1,1,0,0,0,0,20,10,1000,1000,20,10,30,30,30,30,无,0,无,0,无,0,无,0,0,3,1,0,0,0,0,0,空卡槽,空卡槽,空卡槽,0,0,1,
复制代码
这里有个需求如何定义的问题,老板与执行员工如何做事,购买方甲方需求与工程劳动乙方的描述事对接。需要什么样的用户信息,以什么形式去过程,取得结果。开始单是用户名,执行接触的地图区域,就染上了信息影子色彩。这个信息染色应该怎么做。AI自动信息的说法是数据分阶段添加,这样从数据分阶段添加去考虑。
 楼主| 发表于 2026-3-5 17:52:37 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-3-5 17:55 编辑

散列键排序4.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;                  # 声明源代码文件使用 UTF-8 编码,支持中文字符
  5. binmode(STDOUT, ":utf8");  # 设置标准输出使用UTF-8编码

  6. # 定义一个哈希表,存储数字和对应的字符串值
  7. my %a1 = (
  8.     "1"   => "无名勇士",
  9.     "2"    => int(rand(10)) + 1,
  10. );

  11. # 先读取当前文件的所有行
  12. open(my $a123, '<:utf8', $0) or die "无法读取自身文件: $!";
  13. my @b1 = <$a123>;
  14. close($a123);

  15. # 过滤掉以#开头且后面紧跟着"无名勇士"的行
  16. my $c1 = $a1{'1'};
  17. @b1 = grep { !/^#$c1/ } @b1;

  18. # 以写入模式重新打开文件
  19. open($a123, '>:utf8', $0) or die "无法写入自身文件: $!";

  20. # 写回过滤后的内容
  21. print $a123 @b1;

  22. # 向文件写入新的 "#无名勇士:" 前缀
  23. print $a123 "#$a1{'1'}:";

  24. # 对哈希表的键进行数字排序,并输出对应的值,sort { $a <=> $b }是内置变量处理,不能修改。
  25. foreach my $d1 (sort { $a <=> $b } keys %a1) {
  26.     print $a123 "$a1{$d1},";
  27. }

  28. # 写入换行符并关闭文件
  29. print $a123 "\n";
  30. close($a123);

  31. <>;
  32. #无名勇士:无名勇士,1,
复制代码
 楼主| 发表于 2026-3-7 16:58:33 | 显示全部楼层
散列增减
散列2键增减.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. # 假设$a1从某处获取值
  5. my $a1 = 1;  # 示例赋值
  6. my %a0 = (a => 1, b => 2);  # 正确初始化哈希

  7. print "前哈希内容:\n";
  8. foreach my $key (keys %a0) {print "$key => $a0{$key}\n";}

  9. if ($a1 == 1) { goto A2;  }# 跳转到A2标签

  10. A2:
  11. if ($a1 == 1) {$a0{c} = 3; } # 正确添加元素到哈希

  12. print "后哈希内容:\n";
  13. foreach my $key (keys %a0) {print "$key => $a0{$key}\n";}
  14. <>;
复制代码
输出

  1. 前哈希内容:
  2. a => 1
  3. b => 2
  4. 后哈希内容:
  5. c => 3
  6. a => 1
  7. b => 2
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:58 , Processed in 0.028138 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表