Skip to content

编程基础

我将用最通俗的表达方式
此篇也是全文中唯一一篇通俗的文档,其他文档我会用专业名称
此文档内的所有代码都不要尝试在开发环境中使用,仅用于理解

“基本词汇和语法”

变量:就是“小盒子”

你想计算机记住一个东西,比如玩家的名字、血量,就得找个“盒子”装起来。
比如:var 名字 = "小明"var 血量 = 100
var就是声明“我要用一个盒子了”。名字自己起,值(=后面的东西)随便放。

数据类型:盒子里能装啥?

在厨房中,我们会使用一个单独的盒子装盐,另一个单独的盒子装糖。这里的就是数据类型,但编程里面可没有,但有以下类型。
数字(Number)var 攻击力 = 5
字符串“文字”(String)var 名字 = "火焰剑" (文字得用引号 "' 括起来)
布尔值“是否”(Boolean)var 是否发光 = truevar 是否损坏 = falsetrue 是“是”,false 是“否”)
数组(Array):一串小盒子var 背包 = ["苹果", "木剑", "药水"] 你可以通过 背包[0] 拿到第一个东西("苹果"
对象(Object):一个大工具箱,里面分好多格子:这是最重要的!游戏里几乎所有东西都是“对象”。里面的格子里面放了盒子(变量)或按钮(函数)。

对象:大工具箱

假如有一个叫 玩家 的“对象”,里面有一个名为 血量 的盒子和一个名为 打招呼 的按钮,你可以用 玩家.血量 看血量,用 玩家.打招呼() 让他说话。

点.:的

你可以用 玩家.血量 看血量

玩家.血量 就是:“玩家这个大工具箱里,那个叫‘血量’的小格子”
它的作用就是连接,告诉你:“嘿,别只看‘玩家’这个整体,我要找的是它‘里面’的那个具体东西。”

其他好记的叫法:
“取”:玩家.血量 = “取玩家的血量”。

括号():按一下或 “执行”

玩家.打招呼() 让他说话

在“玩家”这个大工具箱上,除了小格子,还贴着几个按钮。
打招呼 就是其中一个按钮的名字。
玩家.打招呼() 就是:“找到‘玩家’工具箱,找到上面写着‘打招呼’的按钮,然后——用力按下去!
你光看按钮(玩家.打招呼)是没用的,只有按了(加上 ()),它才会“叮咚!”一声响起来,执行打招呼的动作。

其他好记的叫法:
“执行”:玩家.打招呼() = “执行打招呼这个动作”。
“跑起来”:玩家.打招呼() = “让打招呼这个程序跑起来”。

函数:就是“按钮”或“动作”

把一连串操作打包起来,起个名字,以后想用就喊一声。

JavaScript
function 给玩家加血(玩家对象, 加多少) {
    玩家对象.血量 = 玩家对象.血量 + 加多少;
    print(玩家对象.名字 + "回复了" + 加多少 + "点血!");
}
// 用的时候:
给玩家加血(玩家, 20); // 给“玩家”这个对象加20血

function就是“自己动手做个新按钮”

按钮

JavaScript
function 全服超级补给() {
    所有玩家.设置血量(20);
    所有玩家.发信息("补给已送达!");
// 用的时候:
全服超级补给();
}

全服超级补给:是你给这个新做的按钮起的名字。制造机需要知道“我做的这个按钮叫啥?”
():括号表示这个按钮不需要你额外提供信息就能按(就像电灯开关,按就亮)。
{ ... }:这是代表按钮按下后要执行的动作。你把想要执行的那一连串操作(设置血量, 发信息),像零件一样装进去。

带“额外信息”的按钮

JavaScript
function 超级补给(玩家) {
    玩家.设置血量(20);
    玩家.发信息("补给已送达!");
}
// 假设我们给玩家 小明 超级补给
var 小明 = ...; // 获取玩家 小明 省略
超级补给(小明);

(玩家):这就是按钮的“投递口”(我们假装这个按钮是自动售货机或公共电话的按钮)。
它的意思是:“每次有人按这个按钮时,必须从这个口子里塞进来一个‘玩家对象’!

条件判断:让游戏“做选择”

if 就是“如果...就...”。

JavaScript
var 玩家血量 = 15;

if (玩家血量 < 20) {
    print("警告!血量过低,请注意!");
}
print("游戏继续...");

if...else 语句就是“如果...就...,否则...就...”

JavaScript
var 玩家血量 = 5;

if (玩家血量 > 0) {
    print("玩家还活着,可以继续战斗!");
} else {
    print("玩家已阵亡,游戏结束!");
}
print("状态已更新。");

循环:让游戏“重复做”

for 循环,比如给背包里每个物品都检查一遍:

JavaScript
for (var i = 0; i < 背包.length; i++) { // i 从 0 开始,一直到背包最后一个
    print("背包里有:" + 背包[i]);
}

返回:“吐出结果”

记得我们刚刚说的,假装按钮是自动售货机或公共电话的按钮吗?
想象一下:我们点击自动售货机的按钮时,自动售货机应该突出我们购买的物品。
return 的作用就是:当自动贩卖机完成工作后,把最终的“货物”吐出来,交给你!

JavaScript
function 获得超级补给包(补给包id) {
    var 超极补给包 = ...;
    return 超级补给包;
}

return 超级补给包;:这句话的意思就是:“好了,购买完成了!现在把‘超极补给包’这个值,从这个自动贩卖机里拿出来,交给外面使用这个函数的人。”

怎么用这个“获得超级补给包”

JavaScript
var 超级补给包 = 获得超极补给包(123); // 调用函数

return 的核心作用:把函数内部计算出的值,“返回”给调用它的地方。

例子

JavaScript
// 判断玩家是否可以进入某个区域
function 可以进入城堡(玩家) {
    if (玩家.等级 >= 10 && 玩家.持有钥匙) {
        return true;  // 可以进入!返回 true
    } else {
        return false; // 不可以进入!返回 false
    }
}

// 使用
if (可以进入城堡(当前玩家)) { // 这里直接用函数的返回值做判断
    当前玩家.传送(城堡坐标);
    print("欢迎来到城堡!");
} else {
    print("你的等级不够或没有钥匙,无法进入。");
}

需要理解的Java概念

这里是Java的概念,理解即可。不理解也没事,后面还会详细介绍。

Java类:设计图纸

“类”就是制作“对象”这个大工具箱的“设计图纸”或“模具”。
它规定了:这个工具箱(对象)里应该有哪些“盒子”(变量),比如“血量”、“攻击力”、“名字”。
它也规定了:这个工具箱(对象)里应该有哪些“按钮”(函数/方法),比如“打招呼()”、“攻击()”、“受伤()”。
类本身不是工具箱,它只是描述了工具箱长什么样、有什么功能。

Java静态方法:设计图纸上的按钮

静态方法就像是贴在“设计图纸”(类)上的“按钮”。
它不属于任何一个具体的工具箱(对象),而是属于这张图纸本身。

你不需要拿起任何一个具体的工具箱(对象),你走到这个“设计图纸”(类)的旁边就可以直接按下“按钮”(函数/方法)。
在代码里,你用 类名.方法名() 来调用它(静态方法)。
例如:玩家.查询玩家总数()

Java包:文件夹

直接理解成文件夹。
假设你在管理一个公司的文件,这些文件按规律放在不同的(子)文件夹中。现在你想找 战斗逻辑 这个“设计图纸”(类),他的包就是 公司.游戏部门.战斗系统.战斗逻辑 。和计算机中的文件系统相同,只是使用 . 而不是 \

txt
公司 
├── 游戏部
│   ├── 玩家 
│   │   ├── 玩家(设计图纸)
│   │   └── 玩家属性(设计图纸)
│   ├── 怪物
│   │   ├── 小怪(设计图纸)
│   │   └── 大Boss(设计图纸)
│   └── 战斗系统
│       └── 战斗逻辑(设计图纸)
└── 前台
    ├── 登录界面(设计图纸)
    └── 游戏主界面(设计图纸)

比较运算符

它们的作用就是比较两个东西的大小或是否相等,然后给出一个“是”(true)或“否”(false)的答案。
我认为学过小学数学的人都能理解

> (大于)

规则:如果左边的值在数值上大于右边的值,返回 true;否则返回 false
10 > 5true (10 比 5 大)
3 > 7false (3 不大于 7)
5 > 5false (5 不大于 5,它俩相等)

< (小于)

规则:如果左边的值在数值上小于右边的值,返回 true;否则返回 false
2 < 8true (2 比 8 小)
9 < 4false (9 不小于 4)
6 < 6false (6 不小于 6)

>= (大于或等于)

规则:如果左边的值大于右边的值,或者两边相等,返回 true;只有左边小于右边时才返回 false
7 >= 3true (7 > 3)
4 >= 4true (4 == 4)
1 >= 5false (1 既不大于也不等于 5)

<= (小于或等于)

规则:如果左边的值小于右边的值,或者两边相等,返回 true;只有左边大于右边时才返回 false
3 <= 9true (3 < 9)
5 <= 5true (5 == 5)
8 <= 2false (8 既不小于也不等于 2)

== (相等 / 抽象相等)

规则:判断两个值是否“相等”。关键特性:它会尝试将不同类型的操作数转换成相同类型再比较(这叫“类型强制转换”)。
警告:这个转换规则比较复杂,容易出错。
5 == 5true (都是数字,相等)
5 == "5"true (数字 5 和字符串 "5"== 会把字符串转成数字再比,所以相等!)
0 == falsetrue (0false 在转换后被认为是相等的)
null == undefinedtrue (这是特殊规则)
"hello" == "world"false (字符串内容不同)

!= (不相等 / 抽象不相等)

规则:== 的反面。如果 == 返回 false!= 就返回 true,反之亦然。同样会进行类型转换。
3 != 5true (3 不等于 5)
5 != "5"false (因为 5 == "5"true,所以 !=false)
0 != falsefalse (因为 0 == falsetrue)

=== (严格相等)

规则:判断两个值是否“严格相等”。必须同时满足两个条件:值相等类型相同
不会进行任何类型转换。这是最安全、最推荐使用的相等比较。
5 === 5true (都是数字5)
5 === "5"false (类型不同!一个是 number,一个是 string)
true === truetrue
null === undefinedfalse (类型不同)
[] === []false (两个不同的数组对象,内存地址不同)

!== (严格不相等)

规则:=== 的反面。如果 === 返回 false!== 就返回 true,反之亦然。
3 !== 5true (3 不严格等于 5)
5 !== "5"true (因为类型不同)
null !== undefinedtrue

三大核心逻辑运算符

&& —— “和”或“并且” (and)

规则:两边的问题都必须答“是”(true),最终答案才是“是”(true)。只要有一个“否”(false),最终就是“否”(false)。
玩家.血量 > 0 && 玩家.饥饿值 > 0
意思:“玩家血量大于0”并且“饥饿值大于0”。
只有两个条件都满足,结果才是 true(玩家状态良好)。
如果血量是0(死),或者饿到0,结果就是 false

|| —— “或” (or)

规则:两边的问题只要有一个答“是”(true),最终答案就是“是”(true)。只有两个都是“否”(false),最终才是“否”(false)。
玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑"
意思:“玩家拿着木剑”或者“玩家拿着石剑”。
只要满足其中一个条件,结果就是 true(玩家拿着基础剑)。
只有既不拿木剑也不拿石剑(比如拿弓),结果才是 false

! —— “取反”或“不是” (not)

规则:把原来的结果反过来。 true 变成 falsefalse 变成 true
!玩家.是管理员
意思:“不是管理员”。
如果 玩家.是管理员true(是管理员),那么 !玩家.是管理员 就是 false(不是普通玩家)。
如果 玩家.是管理员false(不是管理员),那么 !玩家.是管理员 就是 true(是普通玩家)。

综合例子:用在 if 判断里

JavaScript
if (玩家.血量 > 0 && (玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑")) {
    print("你可以用剑攻击!");
} else {
    print("你无法攻击。");
}

分解:玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑"
先看“或者”部分——只要拿着木剑或者石剑,这部分就是 true

整个条件:玩家.血量 > 0 && (上面的结果)
玩家必须活着(血量>0)并且(&&)拿着基础剑(上面的结果为true),最终条件才是 true
结果:只有活着并且拿着基础剑的玩家,才能看到“你可以用剑攻击!”。

为什么先看“或者”部分?

使用括号括起来的部分 (玩家.手持物品 == "木剑" || 玩家.手持物品 == "石剑") 代表一个整体

此篇中出现了很多 print(...) 但没有介绍,它是什么?
单词:print v. 打印、印刷。
在编程中表示:将...打印到控制台。
运行 print("你可以用剑攻击!") 后,就可以在控制台看到 你可以用剑攻击!
实际开发中,你可能用不到这个,也可能用得到这个。