动手创造 · 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 = "已解密:看看原文是否还原"
}
}
开始测试
- 输入
attack at dawn,密钥填3,加密结果应为dwwdfn dw gdzq。 - 把结果复制回结果框,点击解密,原文是否回到
attack at dawn。 - 测试空格、逗号和中文,它们应该原样保留。
- 把密钥改成
29,确认大于 26 的位移也能正常绕回。 - 输入空内容,是否只显示提示而不生成奇怪的结果。
剩余工作
可以同时支持大写字母、增加随机密钥,或把每一关的密文和答案存进 微数据库 做成逃脱房间小游戏。
注意:凯撒密码只是教学用的替换规则,不适合保护真正的隐私资料。
边做边查
打开全部组件速查
卡在哪一步?直接查操作
不用退出当前教程。速查会在新页面打开,查完回来继续刚才的进度。