编程基础
我将用最通俗的表达方式
此篇也是全文中唯一一篇通俗的文档,其他文档我会用专业名称
此文档内的所有代码都不要尝试在开发环境中使用,仅用于理解
“基本词汇和语法”
变量:就是“小盒子”
你想计算机记住一个东西,比如玩家的名字、血量,就得找个“盒子”装起来。
比如:var 名字 = "小明"
或 var 血量 = 100
var
就是声明“我要用一个盒子了”。名字自己起,值(=
后面的东西)随便放。
数据类型:盒子里能装啥?
在厨房中,我们会使用一个单独的盒子装盐,另一个单独的盒子装糖。这里的盐和糖就是数据类型,但编程里面可没有盐和糖,但有以下类型。
数字(Number):var 攻击力 = 5
字符串“文字”(String):var 名字 = "火焰剑"
(文字得用引号 "
或 '
括起来)
布尔值“是否”(Boolean):var 是否发光 = true
或 var 是否损坏 = false
(true
是“是”,false
是“否”)
数组(Array):一串小盒子:var 背包 = ["苹果", "木剑", "药水"]
你可以通过 背包[0]
拿到第一个东西("苹果"
)
对象(Object):一个大工具箱,里面分好多格子:这是最重要的!游戏里几乎所有东西都是“对象”。里面的格子里面放了盒子(变量)或按钮(函数)。
对象:大工具箱
假如有一个叫 玩家
的“对象”,里面有一个名为 血量
的盒子和一个名为 打招呼
的按钮,你可以用 玩家.血量
看血量,用 玩家.打招呼()
让他说话。
点.:的
你可以用
玩家.血量
看血量
玩家.血量
就是:“玩家这个大工具箱里,那个叫‘血量’的小格子”
它的作用就是连接,告诉你:“嘿,别只看‘玩家’这个整体,我要找的是它‘里面’的那个具体东西。”
其他好记的叫法:
“取”:玩家.血量
= “取玩家的血量”。
括号():按一下或 “执行”
用
玩家.打招呼()
让他说话
在“玩家”这个大工具箱上,除了小格子,还贴着几个按钮。打招呼
就是其中一个按钮的名字。玩家.打招呼()
就是:“找到‘玩家’工具箱,找到上面写着‘打招呼’的按钮,然后——用力按下去!”
你光看按钮(玩家.打招呼
)是没用的,只有按了(加上 ()),它才会“叮咚!”一声响起来,执行打招呼的动作。
其他好记的叫法:
“执行”:玩家.打招呼()
= “执行打招呼这个动作”。
“跑起来”:玩家.打招呼()
= “让打招呼这个程序跑起来”。
函数:就是“按钮”或“动作”
把一连串操作打包起来,起个名字,以后想用就喊一声。
function 给玩家加血(玩家对象, 加多少) {
玩家对象.血量 = 玩家对象.血量 + 加多少;
print(玩家对象.名字 + "回复了" + 加多少 + "点血!");
}
// 用的时候:
给玩家加血(玩家, 20); // 给“玩家”这个对象加20血
function
就是“自己动手做个新按钮”
按钮
function 全服超级补给() {
所有玩家.设置血量(20);
所有玩家.发信息("补给已送达!");
// 用的时候:
全服超级补给();
}
全服超级补给
:是你给这个新做的按钮起的名字。制造机需要知道“我做的这个按钮叫啥?”()
:括号表示这个按钮不需要你额外提供信息就能按(就像电灯开关,按就亮)。{ ... }
:这是代表按钮按下后要执行的动作。你把想要执行的那一连串操作(设置血量, 发信息),像零件一样装进去。
带“额外信息”的按钮
function 超级补给(玩家) {
玩家.设置血量(20);
玩家.发信息("补给已送达!");
}
// 假设我们给玩家 小明 超级补给
var 小明 = ...; // 获取玩家 小明 省略
超级补给(小明);
(玩家)
:这就是按钮的“投递口”(我们假装这个按钮是自动售货机或公共电话的按钮)。
它的意思是:“每次有人按这个按钮时,必须从这个口子里塞进来一个‘玩家对象’!”
条件判断:让游戏“做选择”
if 就是“如果...就...”。
var 玩家血量 = 15;
if (玩家血量 < 20) {
print("警告!血量过低,请注意!");
}
print("游戏继续...");
if...else 语句就是“如果...就...,否则...就...”
var 玩家血量 = 5;
if (玩家血量 > 0) {
print("玩家还活着,可以继续战斗!");
} else {
print("玩家已阵亡,游戏结束!");
}
print("状态已更新。");
循环:让游戏“重复做”
for 循环,比如给背包里每个物品都检查一遍:
for (var i = 0; i < 背包.length; i++) { // i 从 0 开始,一直到背包最后一个
print("背包里有:" + 背包[i]);
}
返回:“吐出结果”
记得我们刚刚说的,假装按钮是自动售货机或公共电话的按钮吗?
想象一下:我们点击自动售货机的按钮时,自动售货机应该突出我们购买的物品。return
的作用就是:当自动贩卖机完成工作后,把最终的“货物”吐出来,交给你!
function 获得超级补给包(补给包id) {
var 超极补给包 = ...;
return 超级补给包;
}
return 超级补给包
;:这句话的意思就是:“好了,购买完成了!现在把‘超极补给包’这个值,从这个自动贩卖机里拿出来,交给外面使用这个函数的人。”
怎么用这个“获得超级补给包”
var 超级补给包 = 获得超极补给包(123); // 调用函数
return
的核心作用:把函数内部计算出的值,“返回”给调用它的地方。
例子
// 判断玩家是否可以进入某个区域
function 可以进入城堡(玩家) {
if (玩家.等级 >= 10 && 玩家.持有钥匙) {
return true; // 可以进入!返回 true
} else {
return false; // 不可以进入!返回 false
}
}
// 使用
if (可以进入城堡(当前玩家)) { // 这里直接用函数的返回值做判断
当前玩家.传送(城堡坐标);
print("欢迎来到城堡!");
} else {
print("你的等级不够或没有钥匙,无法进入。");
}
需要理解的Java概念
这里是Java的概念,理解即可。不理解也没事,后面还会详细介绍。
Java类:设计图纸
“类”就是制作“对象”这个大工具箱的“设计图纸”或“模具”。
它规定了:这个工具箱(对象)里应该有哪些“盒子”(变量),比如“血量”、“攻击力”、“名字”。
它也规定了:这个工具箱(对象)里应该有哪些“按钮”(函数/方法),比如“打招呼()”、“攻击()”、“受伤()”。
类本身不是工具箱,它只是描述了工具箱长什么样、有什么功能。
Java静态方法:设计图纸上的按钮
静态方法就像是贴在“设计图纸”(类)上的“按钮”。
它不属于任何一个具体的工具箱(对象),而是属于这张图纸本身。
你不需要拿起任何一个具体的工具箱(对象),你走到这个“设计图纸”(类)的旁边就可以直接按下“按钮”(函数/方法)。
在代码里,你用 类名.方法名()
来调用它(静态方法)。
例如:玩家.查询玩家总数()
Java包:文件夹
直接理解成文件夹。
假设你在管理一个公司的文件,这些文件按规律放在不同的(子)文件夹中。现在你想找 战斗逻辑
这个“设计图纸”(类),他的包就是 公司.游戏部门.战斗系统.战斗逻辑
。和计算机中的文件系统相同,只是使用 .
而不是 \
。
公司
├── 游戏部
│ ├── 玩家
│ │ ├── 玩家(设计图纸)
│ │ └── 玩家属性(设计图纸)
│ ├── 怪物
│ │ ├── 小怪(设计图纸)
│ │ └── 大Boss(设计图纸)
│ └── 战斗系统
│ └── 战斗逻辑(设计图纸)
└── 前台
├── 登录界面(设计图纸)
└── 游戏主界面(设计图纸)
比较运算符
它们的作用就是比较两个东西的大小或是否相等,然后给出一个“是”(true)或“否”(false)的答案。
我认为学过小学数学的人都能理解
> (大于)
规则:如果左边的值在数值上大于右边的值,返回 true
;否则返回 false
10 > 5
→ true
(10 比 5 大)3 > 7
→ false
(3 不大于 7)5 > 5
→ false
(5 不大于 5,它俩相等)
< (小于)
规则:如果左边的值在数值上小于右边的值,返回 true
;否则返回 false
。2 < 8
→ true
(2 比 8 小)9 < 4
→ false
(9 不小于 4)6 < 6
→ false
(6 不小于 6)
>= (大于或等于)
规则:如果左边的值大于右边的值,或者两边相等,返回 true
;只有左边小于右边时才返回 false
。7 >= 3
→ true
(7 > 3)4 >= 4
→ true
(4 == 4)1 >= 5
→ false
(1 既不大于也不等于 5)
<= (小于或等于)
规则:如果左边的值小于右边的值,或者两边相等,返回 true
;只有左边大于右边时才返回 false
。3 <= 9
→ true
(3 < 9)5 <= 5
→ true
(5 == 5)8 <= 2
→ false
(8 既不小于也不等于 2)
== (相等 / 抽象相等)
规则:判断两个值是否“相等”。关键特性:它会尝试将不同类型的操作数转换成相同类型再比较(这叫“类型强制转换”)。
警告:这个转换规则比较复杂,容易出错。5 == 5
→ true
(都是数字,相等)5 == "5"
→ true
(数字 5
和字符串 "5"
,==
会把字符串转成数字再比,所以相等!)0 == false
→ true
(0
和 false
在转换后被认为是相等的)null == undefined
→ true
(这是特殊规则)"hello" == "world"
→ false
(字符串内容不同)
!= (不相等 / 抽象不相等)
规则:==
的反面。如果 ==
返回 false
,!=
就返回 true
,反之亦然。同样会进行类型转换。3 != 5
→ true
(3 不等于 5)5 != "5"
→ false
(因为 5 == "5"
是 true
,所以 !=
是 false
)0 != false
→ false
(因为 0 == false
是 true
)
=== (严格相等)
规则:判断两个值是否“严格相等”。必须同时满足两个条件:值相等 和 类型相同
不会进行任何类型转换。这是最安全、最推荐使用的相等比较。5 === 5
→ true
(都是数字5)5 === "5"
→ false
(类型不同!一个是 number
,一个是 string
)true === true
→ true
null === undefined
→ false
(类型不同)[] === []
→ false
(两个不同的数组对象,内存地址不同)
!== (严格不相等)
规则:===
的反面。如果 ===
返回 false
,!==
就返回 true
,反之亦然。3 !== 5
→ true
(3 不严格等于 5)5 !== "5"
→ true
(因为类型不同)null !== undefined
→ true
三大核心逻辑运算符
&& —— “和”或“并且” (and)
规则:两边的问题都必须答“是”(true),最终答案才是“是”(true)。只要有一个“否”(false),最终就是“否”(false)。玩家.血量 > 0 && 玩家.饥饿值 > 0
意思:“玩家血量大于0”并且“饥饿值大于0”。
只有两个条件都满足,结果才是 true
(玩家状态良好)。
如果血量是0(死),或者饿到0,结果就是 false
。
|| —— “或” (or)
规则:两边的问题只要有一个答“是”(true),最终答案就是“是”(true)。只有两个都是“否”(false),最终才是“否”(false)。玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑"
意思:“玩家拿着木剑”或者“玩家拿着石剑”。
只要满足其中一个条件,结果就是 true
(玩家拿着基础剑)。
只有既不拿木剑也不拿石剑(比如拿弓),结果才是 false
。
! —— “取反”或“不是” (not)
规则:把原来的结果反过来。 true
变成 false
,false
变成 true
。!玩家.是管理员
意思:“不是管理员”。
如果 玩家.是管理员
是 true
(是管理员),那么 !玩家.是管理员
就是 false
(不是普通玩家)。
如果 玩家.是管理员
是 false
(不是管理员),那么 !玩家.是管理员
就是 true
(是普通玩家)。
综合例子:用在 if 判断里
if (玩家.血量 > 0 && (玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑")) {
print("你可以用剑攻击!");
} else {
print("你无法攻击。");
}
分解:玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑"
先看“或者”部分——只要拿着木剑或者石剑,这部分就是 true
。
整个条件:玩家.血量 > 0 && (上面的结果)
玩家必须活着(血量>0)并且(&&)拿着基础剑(上面的结果为true),最终条件才是 true
。
结果:只有活着并且拿着基础剑的玩家,才能看到“你可以用剑攻击!”。
为什么先看“或者”部分?
使用括号括起来的部分 (玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑")
代表一个整体
print 是什么?
此篇中出现了很多 print(...)
但没有介绍,它是什么?
单词:print v. 打印、印刷。
在编程中表示:将...打印到控制台。
运行 print("你可以用剑攻击!")
后,就可以在控制台看到 你可以用剑攻击!
实际开发中,你可能用不到这个,也可能用得到这个。