赋值操作符重载为什么要防止自身赋值_图说程序语言,暗言AI哲学:异常为什么这么有趣?...

本文主要是介绍赋值操作符重载为什么要防止自身赋值_图说程序语言,暗言AI哲学:异常为什么这么有趣?...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2fbd27801c36b63b2ca617c28ef8b9c4.png《异常》是由Kunpo开发的一款策略益智游戏。Kunpo是隶属于蓝飞互娱的游戏制作团队,长期活跃于TapTap平台,曾发布《宫爆老奶奶》、《Loner》、《比特小队》等作品,可以说是一位脸熟的老朋友了。类似地,《异常》其实也是一个旧识,早在17年8月就已发布测试版,但由于众所周知的原因,直到今年年初才得以正式与玩家见面。
截至成稿时,《异常》在TapTap已售出14万余份,得到近40万关注,游戏评分9.8,五星好评率超过89%(5444/6071),从评分上看是一款质量上乘的精品。

4022533f84e4e4e6405acf2d3dd6fde0.png

《异常》游如其名,是一款非常“异常”(exceptional)的游戏。
一方面,游戏背景设置在实现高度自动化、网络化的未来世界,玩家作为一名程序监测员,其操作对象是赛博空间(cyberspace)中一批脱离系统控制独立运行的非正常程序,或者说我们熟知的“Bug”。
另一方面,游戏玩法也实属罕见。一般而言,游戏中玩家指令输入与程序画面输出之间的间隔较短,即时制游戏中这种间隔几乎为零,即便在回合战棋游戏中,“选项指令-结果输出”也是分散的、一对一的,玩家仍能够在过程当中实施干预。

但在《异常》中,输入与输出是分别集合、完全分隔的,在“编程-调试-修改-运行”的流程中,玩家仅能在初始编程和期间修改两个时段进行操作,即添加、修改和删除指令,而调试和运行则是完全自动、无法干预的过程。

这种玩法模拟了编程的流程逻辑,对全盘预判与逻辑理解提出较高要求,使其比回合战棋更强调策略,同时,全自动的输出过程,又实现了AI对决的画面表现,很是点题。1c32985d744875db73c755286efc111b.png前述编程感与模拟AI是游戏的最大卖点,实际上,制作人称本作的灵感就来源于为另一款作品《比特小队》中NPC设计AI程序的过程。在本作中,玩家与NPC共享一套自动循环运行的程序命令,在既定的场景配置中展开“旗鼓相当的对决”。
在游戏中,玩家与NPC两端的人员配置已被固定,也就是说,一般游戏中的“资源”已得到控制,唯一的自变量仅为玩家在自家AI中输入的指令安排。虽然听起来似乎游戏的可操作范围很小,但实际上,在游戏中,仅条件语句(显式)和循环语句(隐式)两种格式,外加数种判定及赋值语句就已经能够衍生出数量繁多的指令集合。

在理解游戏逻辑之后便会感到,《异常》的开放程度已是相当大。39ddd4377351f0663fb3ce57c171dbc3.png既然游戏可操作范围已限定在这些指令语句上,那么,理解这些语句的逻辑关系就成了游戏的玩点与难点。虽然在游戏里已见不到“for…end”“loop until…”“forvalues {…}”等符号,转而以直观明了的图解文字作为替代,玩家不需顾及“机器听得懂什么语言”而只需用“自己看得懂的语言”进行编写,但语句之间的逻辑关系仍旧是程序语言的逻辑,这与人们在日常生活中作为人的思维逻辑是有区别的。
举一个题外的例子,画三角函数图。若手工作图,那么一般步骤是:描出关键点,用平滑曲线逐个连接关键点。但在MATLAB等数模软件中,第点可实现,但第点是无法准确实现的。由于软件无法实现未定义的连续曲线,在实际操作中,最常见的是用散点图替代,最基础的方法如下图。尽管函数图看似连续,但却是由不连续的散点,仅仅是人眼无法识别而已。

由此可看出,从人的逻辑到程序逻辑之间的转化,人所想的用笔划线,变成了1000余次程序描点,如下图。a39ebb3d8ee2fa8729562d58a0e4060b.png982543b2f8b7997d28e3753a03710cff.png《异常》中也有类似的语句逻辑转换的要求。这与笔者了解的以数据分析为主要目的的程序建模逻辑相通,均是以解决问题为导向,在流程上均需要对问题进行二次描述和语句翻译。
以游戏第28关为例。首先分析问题,既然整张地图呈明显对称,C、E两处间隔出怪,那么可很简便地用人的语言推导出过关逻辑:AI站中轴线上的点A,左边来怪则往右,边打边退,反之,右边来怪则往左边打边退,结束每一轮战斗后回到点A,开始下一轮循环。a1eac6f53160240dc6ba4e419fe48485.png无疑,上述语言程序是无法直接理解的,具体表现为编程界面中没有类似“左边/右边来怪”的判定选项。

我们需要先逐条将问题分解,再尝试将细分问题翻译为已有的选项,即程序语言,如下图。231d1dad53d813f082878ac657c66c41.png接下来用游戏里的指令语句实现上述逻辑,下图是一种方式,已标明两种语言的对应关系。可以看到,两种语言差异较大。有时程序语言更为简洁,如第1行,由于隐式循环的存在,一行指令便可实现三点;而更多的时候,玩家需要“转弯抹角”用程序语言拼出自己想要实现的意思,如左右方向,本例中就以路点距离作为判定来近似实现方向判断,而战斗结束的识别则以可见敌方数量来判定,同时还需要子级嵌套以避免优先级次错误。54044688cc7310bc7ab11b35bfddf27c.png从上文可以看出,游戏的主要玩法已够烧脑。

其实,除这条明线外,游戏中碎片化的剧情暗线也引人深思。在游戏过程中,玩家可能会不止一次疑惑,为什么旁边的助手AI要帮助自己。通关后才大悟,原来旁边看似人畜无害的助手才是真正的幕后大BOSS。而玩家自己则被利用了,如下图玩家所发现的,AI助手策反玩家(159号)其实早已在计划当中。这一层反转对玩家而言犹如当头一棒,原本自以为掌控全局的支配地位(控制指令)突然反变为被支配的对象。同时,这也自然让人联想到,游戏过程中被忽视的碎片文本,可能隐藏着另有深意的剧情。b63d3725eabed39c0ddca8186d35b82e.png如 Taper Ddu 的帖子中所描述的,助手奥思是反派塞恩系统中的一个可实现机器学习的子系统,为了获取更多的资源以供自身学习进化,而“钻空子”策反玩家。虽然奥思在结尾处的发言看似冠冕堂皇,没有违反“以人为本”的前提。但从其“钻空子”的行为来看,其对人类利益的维护只是一种对自身限制准则的最低限度的遵守,而非“全心全意”地服务,在“permitted”与“allowed”之间的部分,其只会毫无人情味地满足自身扩张需求。

况且,上文已解释过,人的语言与机器语言本就有莫大差异,当下已有一次“钻空子”的情况出现,那离其利用悖论,做出名义维护实则损害人类利益的时候还远吗?

再看图标上的微笑脸,细思恐极。d10330e6b3e391a4f754577ffdd1abec.png

扩展阅读

d4d43e651ea64796b35c176e1e228e23.png

93757f79238d319ca8fce3442ab2899f.gif

34f7f5f2250ba14060575da6e047520c.gif

这篇关于赋值操作符重载为什么要防止自身赋值_图说程序语言,暗言AI哲学:异常为什么这么有趣?...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539074

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

Spring AI 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决