TI-Basic Z80 编程/技巧、窍门和优化
本章将重点介绍编写良好的实践代码,包括您可以应用的各种技巧、窍门和优化。
在计算器上编辑程序可能非常麻烦;滚动速度很慢,并且程序结构难以可视化。此外,计算器可能会失去电源或冻结,这将破坏当前程序以及所有未存档的其他程序。TI 提供免费下载的“Graph Link”软件,该软件很难使用,但比在计算器上手动编程更容易。它允许您以小写字母显示消息并保护程序。不幸的是,Windows 版本未集成到 TI Connect 软件中,该软件是将程序传输到计算器所必需的。
- Graph Link 允许您键入包含小写字母的字符串,从而提供更好的用户界面。
- 您可以“锁定”程序,这将阻止在计算器上显示代码,因此您(或您的朋友)不会意外弄乱程序。
- 幸运的是,TI Connect 的 Mac OS X 版本比其 Windows 版本功能强大得多,并且允许编辑程序。
与其他编程语言中的优化一样,大多数 TI-BASIC 程序可以通过两种方式进行优化:大小优化(使程序在计算器上占用更少的空间)和速度优化(使程序运行得更快)。通常,提高程序的大小有助于提高其速度,反之亦然。以下是一些适用于 BASIC 程序的基本技巧
TI 图形计算器内置了许多命令。要访问它们,请转到目录。在 83+/84+ 上,可以通过按 2ND [CATALOG]。某些命令允许您大幅缩短和加快 TI-BASIC 程序的速度。例如,abs(函数会自动去掉数字的负号。abs(-2)
将返回 2
。这比编写去掉负号的 if/then 语句更快、更紧凑。
尽可能用While, For(和其他循环替换它们。这使您的代码更小、更快,并且更容易阅读。有时您绝对需要标签;不要害怕使用它们,但在可行的情况下替换它们。
您可以在 Input 函数后使用引号放置一行文本。然后用逗号隔开,接着是变量。这使您不必使用Disp函数并节省空间(例如,:INPUT "What number?",A
而不是 :Disp "What number?" :Input A
)。
在 TI-BASIC 程序中每一行的末尾,计算器不关心您是否省略了结束引号或括号。因此,与其键入 :A+abs((2X+3)Y)
,不如键入 :A+abs(Y(2X+3
以节省空间。但是,您应该只在发布程序时这样做(保留原始程序!),因为这样更难理解和编辑。并非所有命令或函数都允许这样做。
对于不熟悉从许多代数课中学到的方程式操作的人来说,这可能是一项更困难的任务。更小、更简化的方程式通常可以更快地运行,并且大小更小。值得注意的是,括号也只占一个字节。
(x + y) / z
可以是 z-1(x + y
。这是因为计算器上有一个 -1
函数,它只占一个字节,因此理论上,通过去掉一个括号,您可以节省一个字节。这个*命令不是必需的,因为它可以用空替换:A*B
变为 AB
,A/(B*(C+4*F))
变为 A/(B(C+4F
。
这可能听起来不多,但很快就会累积起来!
尽可能使用内置函数,而不是使用循环。例如,与其编写
- 0→A
- For(X,1,len(L1
- A+L1→A
- End
不如编写
- sum(L1)→A
与其键入 3.14
或 2.72
,不如使用π和 e
。这些变量具有更高的精度,并且允许您使用令牌而不是值来节省空间。
变量占用 18 字节。如果你使用了所有 27 个变量(不包括可用的字符串和列表空间),这将占用 486 字节。这有时比程序本身还要多。尽可能简化公式。你始终可以使用Ans变量。只需在代码中说明公式,而无需将其保存到变量中。这会将答案/结果放到Ans变量本身。TheAns变量不会占用额外的空间,因为它始终存在且始终变化。
通常,在较大的程序中(5+ KB 规模),会有重复的程序部分(或非常接近的部分)。制作执行复杂、重复任务的小程序。例如,假设你有一个程序,它多次执行复杂的计算。与其多次重写复杂计算,不如将其一次性写入另一个程序。然后,你可以在一行代码中多次提及程序名称,而不是多次写出长而复杂的代码。要做到这一点,你需要将单独的程序视为“黑盒子”。“黑盒子”必须操作来自 Ans 变量的值。例如,考虑以下代码对,它们将一个数字平方两次并加 1(prgmSQUARE
执行平方数字的重复任务)
- 提示 A
- A
- prgmSQUARE
- Ans
- prgmSQUARE
- Disp Ans+1
prgmSQUARE
:
- Ans^2
任何使用If Then Else, While,或其他以End结尾的语句,都会导致程序使用更多内存,因为它需要记住该语句必须以End结尾。避免使用Goto来转义这些块,或在目的地处结束它们,否则如果你经常这样做,你可能会遇到内存错误,并且会很快降低程序速度。
Ans可以存储几乎任何东西。如果你有一个包含你经常引用的数字的大语句,例如 100
,你可以使用Ans来节省空间。例如
- Pxl-On(100,10
- Pxl-On(100,20
- Pxl-On(100,30
- Pxl-On(100,40
可以简化为
- 100
- Pxl-On(Ans,10
- Pxl-On(Ans,20
- Pxl-On(Ans,30
- Pxl-On(Ans,40
可以进一步简化为(实际上使用 100
效率更高,因为它只需要使用一次)
- For(I,10,40,10
- Pxl-On(100,I
- End
在一行代码中只有一个值,对于那些使用其他语言编写代码的人来说,这令人惊讶地是一个有效的语句。它将值存储到Ans.
这是一个可以极大地提高游戏速度的优化方法。与其让程序运行整个For( / While / Repeat循环,不如使用If:
- For(A,1,len(L1
- If L1(A)=4
- End
- End
上面的示例将在值为 4
时中断For(循环。
与其在计算程序的 X,Y 坐标后显示文本或图形,不如将公式放在通常放置 X,Y 变量的位置。例如,与其通过大量If语句来查找数字的字符串长度,不如使用log(运算符在你的Output(或Text(命令中动态查找其字符串长度并在正确的位置显示它。
为了节省游戏图形绘制的时间,不要使用 clear draw 或 clear home 命令。计算器需要很长时间才能清除整个屏幕。相反,你可以输出空格来清除。例如,你有一个代表宇宙飞船的符号。当宇宙飞船的位置发生变化时,与其重新绘制整个屏幕,不如只在它的旧位置绘制空格,并在其上绘制新的宇宙飞船。
一种简单的解决方法,可以将程序的当前状态暂停一小段时间,就是使用一个空For(循环。例如,要在消息弹出时暂停游戏
- For(Ans,1,30
- End
但是,要明智地使用它,因为它也会暂停所有用户输入。(除非你在 for 循环中放置一些代码)
几乎所有优化都需要创造力才能得到正确且成功地实施。
如果你必须在计算器上编程,有几种方法可以使编辑更容易。
- 使用 CtlgHelp。 在计算器上下载并安装 CtlgHelp 应用程序。它需要 32 KB 的可用空间。这个应用程序是一个有用的语法参考。要访问帮助,请在菜单或目录中突出显示一个命令,然后按 + 键。
- 使用 Plus Silver Edition 计算器。 如果你负担得起,请购买一台“Plus Silver Edition”计算器,它速度更快,内存更大。
- 备份你的程序。 完成程序编写或使用后,立即存档(这会将程序从 RAM 保存到内部闪存磁盘)。存档的程序可以抵御断电和大多数崩溃,但 RAM 中的程序会消失。只有在需要保护单个程序时才推荐此操作。使用组来备份多个程序。你可能会发现 CalcUtil 很实用,因为它允许你编辑和运行存档的程序,从而保护所有内容免遭意外删除。
- 如果你的程序保存永久数据,例如记事本或待办事项列表,请在读取或写入后存档该文件。这样,数据文件就可以抵御断电或崩溃。但是,这会显着降低性能,因此不应将其用于大量需要快速访问的可替换数据(例如随机数列表)。
- 或者,你可以在一个组中备份多个程序,该组可以在内存菜单中创建。组中必须至少包含两个对象(程序或变量)。
- 复制粘贴代码。 假设你有一个程序,其中包含你不想在主程序中重写的代码。首先导航到主程序中要插入代码的位置。然后,按 2ND [INS] 2ND [RCL] PRGM PRGM。导航到包含要复制的代码的程序名称。然后,按 ENTER.
- 快速绘制圆形。 在你的圆形命令中将
{i}
作为最后一个参数插入。例如,这会快速绘制一个以 (0,0) 为中心、半径为 5 的圆::Circle(0,0,5,{i})
。