| PSP | 游戏资料 | 玩家宝典 |
菜鸟也能为PSP编程 - Lua Player 编程初级指南
6——利用表达式 其实我们之前的程序已多少用到了一些表达式,现在我们就深入的学习一下。有些我们已经熟悉了,比如“if”语句和“>”运算符。我们将编写一个利用这些表达式的程序,它与我们上一次写的很相似,只是更深一些。先创建一个新文件,但暂时不要添加代码,除非得到明确告知,象上一讲一样。 首先要讲的就是算术表达式,太简单了,无非就是加减乘除而已。我也不多说了,举例如下: 代码: x = 3 + 5 -- 加法y = 3 - 1 -- 减法 a = 4 * 5 -- 乘法 b = 10 / 2 -- 除法 c = 2 ^ 8 -- 乘方 不难吧,嗯?记住,我教你的都是基础,我不会介绍每一个命令。等你学会了我传授的,你就能自己查询资料,学习我没有教的东西了。 接着要讲的是关系表达式。这是编程时超常用的,用来比较数据。返回真或假(又称为布尔值)。下面是列表: == (相等) 用这些就能检查各种有用的信息。例如,如果一个敌兵的生命值是0,他是不是就该死去了呢?或者检查一下我们是否够钱买下那把新剑!当然光靠这些运算符还是不行的,大多数情况下我们还需要下一组新的表达式。 我的最爱第一个,“if”语句。用来检测某个条件是否为真,如果是则执行一段代码。还可以增加功能,如果条件不满足则做另一件事。简单的“if”表达式如下: 代码: if <某条件> then<执行某代码> end 现在举个现实的例子。假设有个程序设了两个变量,myCash 和 itemCost。myCash 是我们拥有的金钱数,itemCost 则是我们想要购买的物品价格。在游戏中我们需要检查是否有足够的钱购买该物品。如果有,则从总金钱数中扣除,打印一条已购买消息到屏幕上。如果钱不够,则打印一则消息到屏幕,通知玩家不够钱买。代码应该跟下面的差不多: 代码: myCash = 253itemCost = 100 if myCash > itemCost then myCash = myCash - itemCost screen:print(100,100,"Item Bought",blue) else screen:print(100,100,"Not enough money",blue) end 让我们分析一下。首先,我们设了两个变量,告知我们有多少钱,和物品值多少钱。然后是我们的if表达式,其含义等同于 "if 253 > 100 then",就是问变量 myCash 的值是否大于变量 itemCost 的值。如果是...则运行下一行,获取 itemCost 的值并将其从 myCash 的值中扣除。换言之就是 253-100,然后将答案存于 myCash。接着下一行则是打印字串“Item Bought”至屏幕。在下一行我们用了"else",即随后代码将在 myCash 不大于 itemCost 时执行,在此情况下它将打印字符串 "Not enough money" 至屏幕。最后,自然还是“end”,结束整个表达式。 在上例中,我们有足够的钱购买那个物品。因此“else”段的代码不会被执行。许多时候你甚至不需要使用else,有时你则需要使用多个else。这种情况下你可以使用“elseif”。兹举一例: 代码: myNumber = 4if myNumber == 1 then screen:print(100,100,"Your lucky number is 1",blue) elseif myNumber == 2 then screen:print(100,100,"Your lucky number is 2",blue) elseif myNumber == 3 then screen:print(100,100,"Your lucky number is 3",blue) else screen:print(100,100,"Your number isn't very lucky!",blue) end 这段代码检查 myNumber 是否等于 1、2 或 3。如果是,则打印“Your lucky number is (number)”。但是如果 myNumber 不等于 1、2 或 3 则打印“Your number isn't very lucky”。注意,此例程可以简单化,只用一个 else 无需 elseif,只要改成“if myNumber > 0 and myNumber < 4 then”即可。接下来就让我们学一学“and”关键字和其他的知识。 如上所述,逻辑运算符可以用来比较多个事物。我们将学习其中两个,“and”和“or”。还有一个“not”。 假设你在编写一个角色扮演游戏,有点象 Diablo 那种。游戏的玩家角色想要装备一把屠龙刀(Dragon Slayer)。你打算设定玩家只有达到20级且是战士(warrior)类时方能装备该物品。在程序开始我们创建一个数列存放这些信息,例如: 代码: Player = { }Player[1] = { level = 15, class = "warrior", weapon = "knife" } 稍后我们的代码将检查玩家是否有资格装备该武器,如下: 代码: if Player[1].level >= 20 and Player[1].class == "warrior" thenPlayer[1].weapon = "Dragon Slayer" end 第一行检查玩家的等级是否大于或等于 20,还有玩家的类别是否属于战士类。如果两个条件都满足,则玩家的武器就被设定为屠龙刀。如果只有一个条件满足,则返回值为假,那么武器就不会变更。在本例中,我们的玩家虽然的确是战士类,但是等级只有15,没有大于或等于 20,所以该玩家无法使用屠龙刀。你可以使用不止一个“and”,例如你可以这样写: 代码: if hat == "blue" and shirt == "red" and age > 15 and state ~= "Florida" thenscreen:print(100,100,"You are accepted!",yellow) end 使用“or”的方法完全一样,除了只需要其中一个条件满足返回值即为真以外。例如: 代码: myCar = "Mustang"if myCar == "Corvette" or myCar == "Mustang" then screen:print(10,20,"Nice car!",green) end 本例检查 myCar 是否等于 Corvette 或 myCar 是否等于 Mustang。二者只要有一个为真,程序就打印“Nice Car!”到屏幕上。myCar 不等于 Corvette 但等于 Mustang,所以返回值为真。 那么,让我们付诸行动吧。我们还是用上一讲编写的程序,用我们今天学的修改一下。现在打开那个文件。什么?你扔掉了?别着急,去下载上一讲的附件吧。 上一讲中,我们设定每次按下 X 键时减去敌兵生命值 5 点。本课我们将添加一些表达式,让程序能在当前敌兵死亡时让另一个敌兵上阵。我们还得检查何时已无兵可用。 第一件要做的就是添加一个变量,告知我们正与之作战的当前敌兵是哪个。我们会给该变量赋一个值。你该发现我们的敌兵数列有5个敌兵,由1至5分别索引。我们将用这些数字来指称这些敌兵。在代码顶端,绿色变量的下面,添加此变量: 代码: currentEnemy = 1现在我们添加一些代码,检查当前敌兵的生命值是否为 0,如果是则将 currentEnemy 变量的值递增 1,但是只在该值不超过 5 的情况下,也就是最后一个敌兵。在你的 if pad:cross() 代码行之上添加此代码: 代码: if Enemy[currentEnemy].health == 0 and currentEnemy <= 4 thencurrentEnemy = currentEnemy + 1 end 注意,此处我们用 currentEnemy 变量替代了数列 Enemy 中的数字。这样我们只要设置 currentEnemy 变量为正确的敌兵,那么代码中任何使用 Enemy 数列的地方都可以使用currentEnemy,而无需检查每个敌兵((Enemy[1] Enemy[2] 等等...),这样代码更自动化。有了“<= 4”的检查项,currentEnemy 变量就不会超过 5。如此说来,我们得修改几行代码。找到下面几行: 代码: screen:print(250,10,"Enemy Health: " .. Enemy[1].health,green)screen:print(250,20,"Enemy Type: " .. Enemy[1].type,green) 修改为: 代码: screen:print(250,10,"Enemy Health: " .. Enemy[currentEnemy].health,green)screen:print(250,20,"Enemy Type: " .. Enemy[currentEnemy].type,green) 现在当敌兵变更时,程序会自动打印出正确敌兵的生命值和兵种。我们还需要修改下述两行: 代码: if pad:cross() and oldpad:cross() ~= pad:cross() and Enemy[1].health > 0 thenEnemy[1].health = Enemy[1].health - 5 修改为: 代码: if pad:cross() and oldpad:cross() ~= pad:cross() and Enemy[currentEnemy].health > 0 thenEnemy[currentEnemy].health = Enemy[currentEnemy].health - 5 作为结束,我们将添加一些代码,如果5个敌兵都被杀死则打印“All enemies are dead”至屏幕。把这个代码置于主循环中打印敌兵生命值和类型的screen:print行下。 代码: if currentEnemy == 5 and Enemy[currentEnemy].health == 0 thenscreen:print(50,100,"All enemies are dead",green) end 这段代码是说,如果当前敌兵编号是 5 且其生命值等于 0 则打印“all enemies are dead”。保存你的代码,运行之。按下 X 直到一个敌兵死亡。然后下一个敌兵会上阵,一个跟一个,直到所有 5 个敌兵都被杀死为止。 我希望本课能对你今后的表达式学习有所帮助。 |
>> 相关资讯:
上一篇:PSP网上冲浪:OPERA浏览器使用指南 下一篇:随心听音乐!PSP音乐播放插件Music prx cfw相关文章

热门文章

推荐文章

