# Entropy | 熵 Rust Game. 一个Rustå°æ¸¸æˆã€‚ --- --- --- # 入门 欢迎游玩Entropyï¼ ç›®å‰æ¸¸æˆä»¥HTTP APIçš„æ ¼å¼æä¾›æœåŠ¡ï¼ŒPython SDK以åŠæ›´å¤šå®¢æˆ·ç«¯æ£åœ¨å¼€å‘ä¸ã€‚ é¦–å…ˆï¼Œä½ éœ€è¦è¿žæŽ¥åˆ°æ¸¸æˆæœåŠ¡å™¨ï¼Œå¹¶æ³¨å†Œä¸€ä¸ªè´¦å·ã€‚ ## 注册 ### API端点 `POST /player` ### 请求内容 请求ä¸éœ€è¦é‰´æƒï¼›è¯·æ±‚需附带jsonæ ¼å¼çš„å‚数表,详情如下: | å‚æ•°å | 类型 | æè¿° | | -------- | ------ | ------ | | name | String | 用户å | | password | String | 密ç | ### 返回内容 ä¸å‡ºæ„外的è¯ï¼ŒæœåŠ¡å™¨è¿”回状æ€ç 200,附带内容为一个玩家对象的所有信æ¯ï¼Œæ ¼å¼ä¸ºjson: | 返回值 | 类型 | æè¿° | | -------- | ------ | -------------------------- | | id | int | 身份å·ï¼Œç”¨ä»¥ç™»é™†çš„å”¯ä¸€ç¼–å· | | name | String | 用户å,对外展示的åå— | | password | String | 密ç | ### 例å 使用`helloworld`作为用户å,`123456`作为密ç (仅仅演示用,éžå¸¸ä¸æŽ¨è简å•çš„密ç )注册一个账å·ï¼Œåˆ™ï¼šå¯¹`/player`端点`POST`方法å‘起请求,并附带信æ¯Body: ```json { "name": "helloworld", "password": "helloworld" } ``` æœåŠ¡å™¨è¿”回状æ€ç 200,并返回内容: ```json { "id": 449, "name": "helloworld", "password": "helloworld" } ``` æœåŠ¡å™¨è¿”回的ID和密ç 请一定记录好,这就是登入的唯一å‡è¯ã€‚ ## 获å–玩家信æ¯ðŸ”’ ## API端点 `GET /player` 是的没错,和注册是åŒä¸€ä¸ªç«¯å£ï¼Œä½†æ˜¯è¯·æ±‚方法å˜ä¸ºäº†`GET`。 这是一个需è¦é‰´æƒçš„接å£ï¼Œåœ¨è¯·æ±‚çš„åŒæ—¶éœ€è¦æ供用户ID和密ç ,å¦åˆ™æœåŠ¡å™¨å°†è¿”回400错误 ### 鉴æƒç›¸å…³ æœåŠ¡å™¨é‡‡ç”¨HTTPå议的Basic基础鉴æƒæ–¹æ¡ˆï¼Œåœ¨æ¯ä¸€æ¬¡è¯·æ±‚ä¸é™„带用户ID和密ç ,如果访问需è¦é‰´æƒçš„接å£ä½†æœªæ供相应的信æ¯æ—¶ï¼ŒæœåŠ¡å™¨ä¼šè¿”回400错误。 关于更多鉴æƒè¯·å‚阅[MDN的文档](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication) ### 请求内容 GETè¯·æ±‚æ— éœ€é™„å¸¦è¯·æ±‚ä½“ï¼Œé‰´æƒå†…容ä¸å·²é™„带玩家账å·ä¿¡æ¯ ### 返回内容 如果鉴æƒæˆåŠŸï¼Œåˆ™è¿”å›žçŽ©å®¶çš„æ‰€æœ‰ä¿¡æ¯ | 返回值 | 类型 | æè¿° | | -------- | ------ | -------------------------- | | id | int | 身份å·ï¼Œç”¨ä»¥ç™»é™†çš„å”¯ä¸€ç¼–å· | | name | String | 用户å,对外展示的åå— | | password | String | 密ç | 返回内容与åŒURIçš„POST方法接å£å®Œå…¨ä¸€è‡´ï¼Œè¿™éƒ½æ˜¯æ•°æ®åº“玩家表包å«çš„å—段 ## 创建第一个Guest🔒 人生旅程,皆为过客。一个玩家å¯ä»¥æŽ§åˆ¶å¤šä¸ªå®žä½“角色,在Entropy游æˆä¸ï¼Œè¿™äº›å®žä½“被称作**Guest**,这个特殊称谓å–代了Character,一定程度上å‡å°äº†ä»£ç é‡ï¼ŒåŒæ—¶ä¹Ÿæ˜¯å‚考了虚拟机系统ä¸çš„Server-Client-Guest的三级å称。 一个玩家注册时是没有控制Guest的,常识地讲,玩家需è¦ä¸€ä¸ªGuestæ¥è¿›è¡Œæ¸¸çŽ©ï¼Œä¸ºæ¤éœ€è¦è®¿é—®`/player/guest/spawn`端å£ï¼Œè¿™ä¸ªç«¯å£ä¹Ÿæ˜¯éœ€è¦ä½¿ç”¨ID和密ç 鉴æƒçš„。 ### API端点 `GET /player/guest/spawn` 我们从`/player`深入,æ¥åˆ°äº†`/player/guest`,这代表ç€çŽ©å®¶çš„Guestæ“作,创建æ“作被命å为spawn,似乎很常规 ### 鉴æƒç›¸å…³ 该端点需è¦é‰´æƒï¼Œæ–¹å¼åŒä¸Š ### 请求内容 GETè¯·æ±‚æ— éœ€é™„å¸¦è¯·æ±‚ä½“ï¼Œé‰´æƒå†…容ä¸å·²é™„带玩家账å·ä¿¡æ¯ ### 返回内容 如果鉴æƒæˆåŠŸï¼Œåˆ™ç«‹å³åˆ›å»ºä¸€ä¸ªGuest,并将这个Guest的主人设置为请求的玩家,完æˆè¿™ä¸€åˆ‡åŽè¿”回新创建的Guestçš„ä¿¡æ¯ã€‚ æ¯ä¸ªçŽ©å®¶é€šè¿‡è¿™ä¸ªç«¯ç‚¹åˆ›ç”Ÿçš„第一个Guest是**å…费的**ï¼Œæ²¡æœ‰ä»»ä½•å¼€é”€ã€‚ä½†è¿™æ ·çš„spawn也åªæœ‰ä¸€æ¬¡æœºä¼šã€‚ 如果玩家在已有guest的情况下å†æ¬¡è°ƒç”¨è¿™ä¸ªç«¯ç‚¹ï¼Œåˆ™ä¼šæŠ¥é”™ã€‚ ç¨åŽä¼šä»‹ç»å…¶ä»–创建更多Guest的方法。 | 返回值 | 类型 | æè¿° | | ----------- | --------- | ----------------------------------------- | | id | int | Guest的身份å·ï¼Œç”¨ä»¥æŸ¥è¯¢ã€æŽ§åˆ¶ç‰çš„å”¯ä¸€ç¼–å· | | energy | int | 能é‡ï¼Œä¸€ç§æ”¶é›†ç‰© | | pos | (int,int) | Guestçš„ä½ç½®ï¼Œä¸€ä¸ªäºŒç»´åæ ‡ | | temperature | int | Guest的温度,一ç§çŠ¶æ€ | | master_id | int | Guest的拥有者的ID,对应了玩家ID | ## 查看玩家控制的Guest🔒 ### API端点 `GET /player/guest` ### 鉴æƒç›¸å…³ 该接å£éœ€è¦é‰´æƒï¼Œæ–¹å¼åŒä¸Š ### 请求内容 玩家信æ¯å·²åŒ…å«åœ¨é‰´æƒä¿¡æ¯å†…ï¼Œæ— éœ€æ交é¢å¤–的请求内容 ### 返回内容 将会返回一个json的列表对象,其ä¸æ¯ä¸€ä¸ªå…ƒç´ 就是一个Guest的所有属性,详细å—段如下: | å…ƒç´ å±žæ€§ | 类型 | æè¿° | | ----------- | --------- | ----------------------------------------- | | id | int | Guest的身份å·ï¼Œç”¨ä»¥æŸ¥è¯¢ã€æŽ§åˆ¶ç‰çš„å”¯ä¸€ç¼–å· | | energy | int | 能é‡ï¼Œä¸€ç§æ”¶é›†ç‰© | | pos | (int,int) | Guestçš„ä½ç½®ï¼Œä¸€ä¸ªäºŒç»´åæ ‡ | | temperature | int | Guest的温度,一ç§çŠ¶æ€ | | master_id | int | Guest的拥有者的ID,对应了玩家ID | 例如: ```json [ { "id": 1, "energy": 19, "pos": [ 0, 0 ], "temperature": 19, "master_id": 1 } ] ``` --- --- --- # 游æˆçš„åæ ‡ç³»ç»Ÿï¼ŒGRID GRID这个åå—çµæ„Ÿæ¥æºäºŽã€Šåˆ›ï¼šæˆ˜çºªã€‹ä¸çš„*电å世界网络*,类似的用法还有*国家电网 State Grid*。 而实际上这个åå—çš„æ„æ€å°±æ˜¯ä¸€ä¸ªåæ ‡ç³»ç»Ÿâ€”â€”å¹³é¢ç›´è§’åæ ‡ç³»ã€‚ Entropy的世界是二维的,拥有*x*å’Œ*y*两个维度,但是在数æ®åº“ä¸çš„å˜å‚¨å¹¶ä¸æ˜¯ä¸¤ä¸ªå—段(主è¦åŽŸå› 是Sea-ORM对pgsql的二维索引并ä¸å‹å¥½ï¼‰ï¼Œæ‰€ä»¥å¹²è„†ç›´æŽ¥ 将两个维度压缩为一个æ‰å¹³ç»´åº¦è¿›è¡Œå˜å‚¨ï¼Œåœ¨å¯¹ç½‘络æœåŠ¡çš„时候由定制的åºåˆ—化ç–略,在对åæ ‡åºåˆ—化时将低维度的索引转æ¢ä¸ºäºŒç»´çš„åæ ‡ï¼ˆè¿™æ ·åšçš„缺点是ä¸æ”¯æŒæ•°æ®åº“空间索引,但Sea-ORM本æ¥å°±ä¸æ”¯æŒäºŒç»´ç´¢å¼•ï¼‰ã€‚ 虽然上é¢è½¬æ¢çš„过程看起æ¥å¾ˆå¤æ‚,但是ä¸è¦ç´§ï¼Œåæ ‡ç³»ç»Ÿæœ¬èº«å…¶å®žå¾ˆç®€å•ã€‚ ## 世界地图与节点 首先,整个世界是一个二维的梯度平é¢ï¼Œä¸–界由很多节点*Node*æž„æˆã€‚æ¯ä¸€ä¸ªNode有两个属性。一个是åæ ‡ç´¢å¼•ï¼Œæ˜¯äºŒç»´æ•°ç»„(i16,i16)ï¼›å¦ä¸€ä¸ªæ˜¯èŠ‚点值,是一个ä¸å®šé•¿çš„数组Vec<u8>,最长ä¸è¶…过1024,长度全éšæœºã€‚代ç å°±åƒè¿™æ ·ï¼š ```rust struct NodeID(i16, i16); // 二维空间åæ ‡ struct Node{ // 这是一个Node id: NodeID, data: Vec<i8>, // 节点包å«è®¸å¤šCell } struct FlatID(i32); // 压缩åŽçš„æ‰å¹³ç´¢å¼•ï¼Œç”¨ä»¥æ•°æ®åº“å˜å‚¨ ``` 为了交æµæ–¹ä¾¿ï¼Œå°±å°†èŠ‚点ä¸æ•°æ®æ•°ç»„的一个特定数值称之为å•å…ƒCell。 Cell既是一个å—节,也是一个1ä½å®½çš„æ— ç¬¦å·æ•´æ•°ï¼ŒEntropy游æˆä¸ä¸€ä¸ªCell的值就被认为是这个Cell的温度。由æ¤å¼•å‡ºä¸»é¢˜ï¼š **玩家通过Guestå’ŒCell的温度差进行å‘电,收集能é‡ï¼›æ¶ˆè€—能é‡ï¼Œä¸æ–增殖** - 玩家控制Gueståªèƒ½è®¿é—®ä¸Žå…¶åŒèŠ‚点上的Cell进行å‘电 - å‘电的效率为å¡è¯ºçƒæœºçš„ç†è®ºæ•ˆçŽ‡[^1],关于å¡è¯ºå¾ªçŽ¯è¯¦è§[知乎专æ ](https://zhuanlan.zhihu.com/p/514761818) - ç»è¿‡æ•ˆçŽ‡æŠ˜ç®—åŽï¼Œæ”¶é›†èƒ½é‡ä¸Žæ¸©åº¦è½¬æ¢çš„比例是1:1,也就是1点温度差ç‰ä»·äºŽ1点温度 - å°æ•°éƒ¨åˆ†åœ¨å¯¹çŽ©å®¶æ”¶èŽ·èƒ½é‡æ—¶å‘下å–整,å¦ä¸€éƒ¨åˆ†å‘上å–整,总和ä¸å˜ [^1]: 虽然Entropy的概念设计ä¸ä¸æ¶‰åŠå†…能与体积,但是效率ä¾ç„¶é€‰æ‹©äº†ç»å…¸çš„å¡è¯ºå¾ªçŽ¯æ•ˆçŽ‡ã€‚ 访问一个节点也很简å•ï¼Œç”šè‡³ä¸éœ€è¦é‰´æƒ ### API端点 `GET /node/:x/:y` `GET /node/bytes/:x/:y` å…¶ä¸x是节点的横åæ ‡ï¼Œy是纵åæ ‡ï¼›ç¬¬ä¸€ä¸ªç«¯ç‚¹å°†è¿”å›žjsonæ ¼å¼æ•°æ®ï¼Œè€Œç¬¬äºŒä¸ªç«¯ç‚¹å°†ç›´æŽ¥è¿”回Nodeçš„data属性对应的å—节串(由于æ¯ä¸ªCell宽度仅为1,所以这里ä¸å˜åœ¨å¤§å°ç«¯åºé—®é¢˜ï¼‰ ### 请求内容 ä¸éœ€è¦ä»»ä½•å‚数,åæ ‡ä¿¡æ¯ç›´æŽ¥åœ¨API端点的URIä¸æä¾› ### 返回内容 返回一个Nodeçš„ä¿¡æ¯ï¼Œè¯¦æƒ…如下: | 返回值 | 类型 | æè¿° | | ------ | ---------- | -------------------------------------- | | id | (int, int) | Nodeçš„åæ ‡ | | data | [int] | Nodeçš„data部分,å³ç”±Cellæž„æˆçš„æ•°å—列表 | 值得注æ„的是,json返回结果ä¸çš„Cell部分的温度为1ä½å®½æœ‰ç¬¦å·æ•´æ•°ï¼ŒèŒƒå›´ä»Ž-128到127ï¼› 而bytes返回的则是å—节串,需è¦å¯¹æ¯ä¸€ä½å¼ºåˆ¶è½¬æ¢ä¸ºint8æ‰æ˜¯Cell的温度。 ### 例å 例如`GET`请求`/node/1/1`,返回: ```json { "id": [ 1, 1 ], "data": [ -49, -28, -26, 102, 44 ] } ``` 这里åªæ˜¯ä¸ªç®€å•çš„例å。事实上,Nodeçš„data部分的长度从0到1024ä¸ç‰ï¼Œè¿™ä¹ˆçŸçš„data出现概率很å°ï¼Œåªæ˜¯ä¸ºäº†æ¼”示用的。 ## åæ ‡ä¸Žç§»åŠ¨ç³»ç»Ÿ 世界是éžè¿žç»çš„ï¼Œæ— è®ºGuest还是Node都有一个二维的整数åæ ‡ã€‚ 玩家åªèƒ½ä¸Žå½“å‰èŠ‚点上的å•å…ƒäº¤äº’,但是玩家å¯ä»¥ä¸»åŠ¨ç§»åŠ¨ï¼Œæ¯æ¬¡åªèƒ½å‘周围8个方å‘ç§»åŠ¨ä¸€ä¸ªæ ¼åçš„è·ç¦»ã€‚移动没有除了现实世界时间以外的任何消耗。 玩家移动的速度(å•ä½æ—¶é—´å†…途径的节点数)å–决于客户端请求频率和æœåŠ¡å™¨ç®—力。 #### 开始移动 默认给予的Guest总是在(0, 0)ä½ç½®ä¸Šï¼Œæˆ‘们定义第一个维度æ£æ–¹å‘为å³ï¼Œç¬¬äºŒä¸ªç»´åº¦æ£æ–¹å‘为上(和平é¢ç›´è§’åæ ‡ç³»ä¸€è‡´ï¼‰ã€‚ 玩家å¯ä»¥æŽ§åˆ¶Guestå‘上下左å³4个ä½ç½®ç§»åŠ¨ï¼Œæ¯æ¬¡ç§»åŠ¨1ä¸ªæ ¼åã€æ¶ˆè€—1点能é‡ï¼Œå…·ä½“如下表: | æ–¹å‘ | å‚æ•° | | ---- | ------ | | 上 | [0,1] | | å·¦ | [-1,0] | | å³ | [1,0] | | 下 | [0,-1] | 现在我们开始æ£å¼ç§»åŠ¨ï¼Œç§»åŠ¨åœ¨Entropyä¸ç§°ä½œWalk,移动是Guest的一个方法。首先,玩家需è¦ç¡®å®šç§»åŠ¨çš„是哪个Guest以åŠç§»åŠ¨çš„æ–¹å‘。 ### API端点 `POST /guest/walk/:id` å…¶ä¸id为玩家控制的Guestçš„ç¼–å·ï¼Œå¦‚æžœä¸æ¸…楚IDå¯ä»¥è°ƒç”¨`/player/guest`接å£æŸ¥è¯¢å…¨éƒ¨Guest ### 请求内容 例如,我è¦å°†æˆ‘控制的编å·ä¸º449çš„Guestå‘å³è¾¹ç§»åŠ¨ä¸€ä¸ªå•ä½ï¼Œé‚£ä¹ˆä½ç§»å‚数就是[1,0],控制ID就是449。在请求ä¸éœ€è¦æä¾› 1. 玩家鉴æƒä¿¡æ¯ï¼Œå³Authentication Header 2. 玩家控制的Guestçš„ç¼–å·ï¼Œå¦‚果该编å·çš„Guestä¸å˜åœ¨æˆ–éžçŽ©å®¶æŽ§åˆ¶éƒ½ä¼šè¿”回400错误 3. 在请求体ä¸å†™æ˜Žç§»åŠ¨çš„æ–¹å‘,必须为9个方å‘之一,超出é™åˆ¶ä¹Ÿä¼šè¿”回400错误 请求体的å‚数如下: | å‚æ•°å | 类型 | æè¿° | | ------ | --------- | ----------------------------------------- | | to | (int,int) | å°†è¦ä½ç§»çš„æ–¹å‘,åªèƒ½åœ¨ä¸Šæ–‡4个方å‘ä¸é€‰ä¸€ä¸ª | ### å“应内容 如果移动æˆåŠŸï¼Œåˆ™ä¼šè¿”回Guest的最新状æ€ï¼Œå³å…¨éƒ¨å±žæ€§ï¼Œå…·ä½“如下(å†æ¬¡å’Œå‰æ–‡é‡å¤ï¼‰ | 返回值 | 类型 | æè¿° | | ----------- | --------- | ----------------------------------------- | | id | int | Guest的身份å·ï¼Œç”¨ä»¥æŸ¥è¯¢ã€æŽ§åˆ¶ç‰çš„å”¯ä¸€ç¼–å· | | energy | int | 能é‡ï¼Œä¸€ç§æ”¶é›†ç‰© | | pos | (int,int) | Guestçš„ä½ç½®ï¼Œä¸€ä¸ªäºŒç»´åæ ‡ | | temperature | int | Guest的温度,一ç§çŠ¶æ€ | | master_id | int | Guest的拥有者的ID,对应了玩家ID | ## æ”¶èŽ·èƒ½é‡ Entropy的设计ä¸ï¼Œèƒ½é‡æ˜¯ä»Žé€šè¿‡Guest的温差å‘电机产生的。 ### 温度系统 Entropy的温度由一个å—节表示,å³åœ¨å¼€å°”æ–‡æ¸©æ ‡ä¸‹ï¼Œæœ€ä½Žæ¸©0K度(ç»å¯¹é›¶åº¦ï¼‰ï¼Œæœ€é«˜æ¸©255K度。 çƒåŠ›å·®å‘电的æ¥éª¤ä¸ºï¼š 1. 获å–高低çƒæºæ¸©åº¦å·®$\Delta H$ 2. 通过å¡è¯ºå…¬å¼è®¡ç®—效率$\eta = 1 - \frac{T_C}{T_H}$[^2] 3. 计算实际å¯åˆ©ç”¨çš„温度差$\hat{\Delta T} = {\Delta H} * \eta$ 4. 对å¯åˆ©ç”¨æ¸©åº¦å·®å‘下å–整,得到实际温度å˜åŒ–$\Delta T = \lfloor\hat{\Delta T}\rfloor$ 5. 对高ã€ä½Žçƒæºåˆ†åˆ«å‡åŽ»ã€åŠ 上温度å˜åŒ–,使温度å˜å¾—“平å‡â€ $$ T'_C = T_C + \Delta T\\T'_H = T_H - \Delta T $$ [^2]: å…¶ä¸ï¼Œ$T_C$是冷端ç»å¯¹æ¸©åº¦ï¼Œ$T_H$是çƒç«¯ç»å¯¹æ¸©åº¦ã€‚ WIP ## 增殖更多Guest WIP ## 尾声 æå–œä½ çœ‹åˆ°è¿™é‡Œï¼Œä½ å·²ç»å¦ä¼šäº†å…¨éƒ¨çš„API了ï¼