跳到教程内容
教程首页
App Inventor 2 教程 密码翻译器
准备开始
动手创造 · PROJECT LAB

密码翻译器

准备探索你的新作品
0%
★★ 项目难度每一步,都离作品更近

先了解你将做出什么

应用介绍

凯撒密码会把每个字母向后移动固定格数。例如密钥为 3 时,A 变成 D,X 会绕回 A。 我们做一个小工具:输入英文短句和密钥,点击“加密”得到暗号;把暗号再输入并点击“解密”, 就能还原原文。非英文字母和空格保持不变,方便观察规则。

教程主图

密码翻译器教程(难度系数:★★)

准备界面

组件类型 组件名称 关键设置
文本输入框 文本输入框_原文 输入待翻译文本
文本输入框 文本输入框_结果 多行显示结果
文本输入框 文本输入框_密钥 Hint:密钥,例如 3
按钮 按钮_加密 执行加密
按钮 按钮_解密 执行解密
标签 标签_提示 显示提示
对话框 对话框1 可选的非可视组件

建立字母表和加密函数

先声明小写字母表。函数逐个检查原文字符:如果字符在字母表里,就按密钥移动;找不到时, 直接把原字符放进结果,所以空格、标点和中文不会被破坏。

global 字母表 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

function 加密(原文, 位移) {
  var 结果 = ""
  for i = 1 to length(原文) {
    var 字符 = lower(segment(原文, i, 1))
    var 位置 = indexof(字母表, 字符)
    if 位置 = 0 {
      结果 = join(结果, 字符)
    } else {
      var 新位置 = ((位置 + 位移 - 1) % length(字母表)) + 1
      结果 = join(结果, select(字母表, 新位置))
    }
  }
  return 结果
}

indexof 找不到字符时返回 0;因此先判断 0,再取列表项,就不会访问不存在的下标。 % 是取余运算,负责让 z 往后移动时绕回 a。

点击加密

按钮事件只负责取输入、调用函数和显示结果。把“真正的算法”放进函数后,解密时可以复用同一套逻辑, 不需要复制一大段循环。

when 按钮_加密.Click() {
  if isempty(文本输入框_原文.Text) {
    标签_提示.Text = "先输入一段英文"
  } else {
    文本输入框_结果.Text = 加密(文本输入框_原文.Text, 文本输入框_密钥.Text)
    标签_提示.Text = "已加密:把结果分享给朋友吧"
  }
}

点击解密

解密就是向相反方向移动,同一个函数传入负的密钥即可。这里把结果框当作输入,方便你直接把收到的 暗号粘贴进来。

when 按钮_解密.Click() {
  if isempty(文本输入框_结果.Text) {
    标签_提示.Text = "先把暗号放进结果框"
  } else {
  文本输入框_原文.Text = 加密(文本输入框_结果.Text, 0 - 文本输入框_密钥.Text)
    标签_提示.Text = "已解密:看看原文是否还原"
  }
}

开始测试

  1. 输入 attack at dawn,密钥填 3,加密结果应为 dwwdfn dw gdzq
  2. 把结果复制回结果框,点击解密,原文是否回到 attack at dawn
  3. 测试空格、逗号和中文,它们应该原样保留。
  4. 把密钥改成 29,确认大于 26 的位移也能正常绕回。
  5. 输入空内容,是否只显示提示而不生成奇怪的结果。

剩余工作

可以同时支持大写字母、增加随机密钥,或把每一关的密文和答案存进 微数据库 做成逃脱房间小游戏。 注意:凯撒密码只是教学用的替换规则,不适合保护真正的隐私资料。