{"id":19334332,"url":"https://github.com/sticnarf/mahjong","last_synced_at":"2025-04-23T00:31:37.324Z","repository":{"id":35604679,"uuid":"39877932","full_name":"sticnarf/Mahjong","owner":"sticnarf","description":"简化的麻将规则及对应的服务器，用于AI比赛。","archived":false,"fork":false,"pushed_at":"2015-09-04T13:01:08.000Z","size":256,"stargazers_count":24,"open_issues_count":0,"forks_count":12,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-02T05:42:27.578Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sticnarf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-07-29T06:41:59.000Z","updated_at":"2024-08-31T17:47:10.000Z","dependencies_parsed_at":"2022-09-15T02:01:00.113Z","dependency_job_id":null,"html_url":"https://github.com/sticnarf/Mahjong","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sticnarf%2FMahjong","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sticnarf%2FMahjong/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sticnarf%2FMahjong/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sticnarf%2FMahjong/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sticnarf","download_url":"https://codeload.github.com/sticnarf/Mahjong/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250348270,"owners_count":21415891,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T02:58:26.008Z","updated_at":"2025-04-23T00:31:37.085Z","avatar_url":"https://github.com/sticnarf.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Mahjong\n\n本项目为一个麻将服务器，供AI比赛使用。本文档分为两部分，第一部分为此服务器使用的[麻将规则](#规则)，第二部分为[交互规范](#交互规则)。编译后的服务器程序下载：\n\n- [Mac](https://github.com/wormful/Mahjong/releases/download/v1.0.0/server_v1.0.0_Mac_OS_X)\n- [Win_x86_64](https://github.com/wormful/Mahjong/releases/download/v1.0.0/server_v1.0.0_Win_x86_64.exe)\n- [Ubuntu_x86_64](https://github.com/wormful/Mahjong/releases/download/v1.0.0/server_v1.0.0_Ubuntu_x86_64)\n\n其他系统需要下载源码，使用 Rust Nightly 版本的编译器自行编译。\n\n### 服务器使用说明\n\n请在终端中打开服务器。用法：\n\n```\n# *nix\n$ ./server_bin \u003cAI1\u003e \u003cAI2\u003e \u003cAI3\u003e \u003cAI4\u003e [-v] [-d]\n```\n\n```\n# Windows\nserver_bin \u003cAI1\u003e \u003cAI2\u003e \u003cAI3\u003e \u003cAI4\u003e [-v] [-d]\n```\n\n开启`-d`选项后，服务器会在当前文件夹下的log文件夹中生成每盘的日志文件。\n\n## 规则\n\n为降低复杂度，本规则以国标麻将为基础进行了大量的简化并进行一定修改。\n\n### 注意点\n\n* 麻将牌共136张，即在国标麻将的基础上去掉了八张花牌。\n* 一局定为4盘。去除了圈风、门风、庄家的概念。\n* 没有牌城、掷骰与开牌的概念，AI拿到的牌全部直接由服务器发放。\n* 出牌顺序按id为0、1、2、3，但一盘内第一个行牌的AI不确定。\n* 整场比赛的第一盘时，第一个行牌的AI由服务器随机决定，从第二盘开始第一个行牌的AI为最近和牌的AI。\n* 没有起和番数\n* 轮到AI出牌的时候，AI必须在1秒内打出牌，否则以100毫秒1分（四舍五入）进行罚分。\n* 一方打出牌后，AI若要吃牌、碰牌、杠牌或是和牌，需要在0.5秒内向服务器发出指令，超过0.5秒按每100毫秒1分（四舍五入）罚分。\n* 测试共有6组，每组分为4局。不同组测试中AI相对位置不同。同组内四局使用的随机数种子不变，一局结束后每位AI的位置逆时针旋转一位。\n\n### 番种\n\n国标麻将的番种非常多，本规则将番种大大精简。\n\n##### 88番\n\n* 大四喜（不计碰碰和）\n* 大三元（不计箭刻）\n* 十三幺（不计五门齐、单钓将、门前清、混幺九）\n* 绿一色（无发记清一色，*有发记混一色*）\n* 四杠（不计碰碰和、三杠，暗杠另计）\n\n##### 64番\n\n* 小四喜\n* 小三元（不计箭刻）\n* 字一色（不计碰碰和）\n* 四暗刻（不计门前清、碰碰和）\n* 清幺九（不计碰碰和）\n\n##### 48番\n\n* 一色四同顺（不计一色三同顺、一般高）\n\n##### 32番\n\n* 三杠（暗杠另计）\n* 混幺九（不计碰碰和）\n\n##### 24番\n\n* 七对（不计门前清、单钓将）\n* 清一色\n* 一色三同顺（不计一般高）\n\n##### 16番\n\n* 三同刻\n* 三暗刻\n\n##### 8番\n\n* 三色三同顺（不计喜相逢）\n\n##### 6番\n\n* 碰碰和\n* 混一色\n* 五门齐\n\n##### 2番\n\n* 门前清（因取消了不求人，自摸和牌及和他家打出的牌都记）\n* 断幺\n* 平和\n* 箭刻（可算多次）\n* 暗杠（可算多次）\n\n##### 1番\n\n* 自摸\n* 一般高（可算多次）\n* 喜相逢（可算多次）\n* 明杠（可算多次）\n* 单钓将\n\n### 记分规则\n\n最开始每位AI的分数都是0分。底分为4分，基本分和牌后各个番种分数的总和。\n\n若和牌方自摸，则另外三家都需付给和牌方（底分＋基本分）的分数。\n\n否则，点炮方付给和牌方（底分＋基本分）的分数，其余两家付给和牌方底分的分数。\n\n### 结束与排名\n\n1. 当有任何一方AI程序意外退出时比赛结束，意外关闭的AI排名最后，其余AI按分数高低排名。\n2. 当总共96盘牌局结束后比赛结束，AI按分数高低排名。\n\n## 交互规则\n\n服务器与AI通过标准输入和标准输出进行通信，每次通信的内容为一行文本，。\n\n示例中的“标准输入”、“标准输出”都是以AI的角度上说的。“标准输入”中的内容即AI需要读取的内容，“标准输出”中的内容为AI需要打印的内容。\n\n### 骨牌代号\n\n* 字牌：东（E）、南（S）、西（W）、北（N）、中（Z）、发（F）、白（B）\n* 万子（M）：1M、2M、3M、4M、5M、6M、7M、8M、9M\n* 索子（S）：1S、2S、3S、4S、5S、6S、7S、8S、9S\n* 筒子（T）：1T、2T、3T、4T、5T、6T、7T、8T、9T\n\n~~PS：关于万的缩写的问题，是取自日语读音`man`…………………………~~\n\n### 加入比赛\n\nAI程序由服务器启动。AI先发送加入信息。\n\n标准输出：\n\n```\njoin\n```\n\n当四位AI都加入比赛之后，服务器会把id号发送给AI。\n\n标准输入：\n\n```\nid 3\n```\n\n说明：3即为AI被分配到的id号。\n\n### 开始比赛\n\n每盘牌局开始时，服务器会广播第一个行牌的AI的id。\n\n标准输入：\n\n```\nfirst 3\n```\n\n说明：id为3的AI为第一个行牌的AI。\n\n然后每个AI会收到13张起手牌。\n\n标准输入：\n\n```\ninit 1S 1S 2T 5M 9S 4T W Z 1T 8M 9M 5S 6T\n```\n\n说明：起手13张牌分别为一索、一索、二筒、五万、九索、四筒、西风、红中、一筒、八万、九万、五索、六筒。\n\n### 行牌\n\n要注意行牌是有时间限制的。\n\n##### 拿牌\n\n到AI拿牌的时候，服务器会将拿牌信息发给AI，同时向其他AI广播。\n\n标准输入（拿牌AI）：\n\n```\npick 5T\n```\n\n说明：拿到的牌为五筒。\n\n标准输入（其他AI）：\n\n```\nmpick 0\n```\n\n说明：id为0的AI拿牌了。\n\n##### 出牌\n\n出牌需要AI在1秒内发送指令给服务器，然后服务器将出牌信息广播给其他AI。\n\n标准输出（出牌AI）：\n\n```\nout 9M\n```\n\n说明：需要打出的牌为九万。\n\n标准输入（其他AI）：\n\n```\nmout 2 9M\n```\n\n说明：id为2的AI打出了一张九万。\n\n这时三位AI有0.5秒的时间向服务器发出吃、碰、杠或和的指令。超过0.5秒按每100毫秒1分罚分。\n\n如果不发出吃、碰、杠或和的指令的话：\n\n标准输出：\n\n```\npass\n```\n\n###### 吃/碰牌\n\n由于吃的方式不唯一，所以吃的指令需要另外指定形成顺子中最小的一张牌。\n\n标准输出（AI1）：\n\n```\nchi 7M\n```\n\n说明：报吃，形成七万、八万、九万一副顺子。\n注1：吃不一定成功。\n注2：如上例，即使吃的方式唯一，也需要另指定牌。\n\n标准输出（AI2）：\n\n```\npeng\n```\n\n说明：报碰。\n\n当吃和碰的指令都发送给服务器时，碰优先于吃。然后服务器会广播此消息。\n\n标准输入（所有）：\n\n```\nmpeng 2 9M\n```\n\n说明：id为2的AI碰了九万。\n\n吃没有成功（发送在`mpeng`/`mgang`消息之后）：\n\n标准输入（AI1）：\n\n```\nmfail\n```\n\n若是吃成功的情况：\n\n标准输入（所有）：\n\n```\nmchi 1 7M\n```\n\n说明：id为1的AI吃成功，形成七万、八万、九万一副顺子。\n\n###### 大明杠\n\n标准输出（AI3）：\n\n```\ngang\n```\n\n若杠成功：\n\n标准输入（所有）：\n\n```\nmgang 3 5S\n```\n\n说明：id为3的AI明杠五索。\n\n###### 暗杠\n\n标准输出（AI3）：\n\n```\nagang W\n```\n\n标准输出（所有）：\n\n```\nmagang 3\n```\n\n说明：id为3的AI暗杠了。\n\n###### 加杠\n\n标准输出：（AI3）：\n\n```\njgang 5S\n```\n\n说明：需要加杠五索。\n\n标准输入（所有）：\n\n```\nmjgang 3 5S\n```\n\n说明：id为3的AI加杠五索。\n\n###### 抢杠和\n\n当接到有别的AI加杠的消息时候，如要抢杠，需要在0.5秒内发出抢杠和指令。\n\n标准输出：（AI2）：\n\n```\nqgang\n```\n\n抢杠成功的话，和牌结算同下。\n\n###### 和牌\n\n在出牌阶段和别家打完牌后都可以发出和牌指令：\n\n标准输出（AI3）：\n\n```\nhu\n```\n\n当一方有效和牌后，会广播该AI和牌的番数。分数将自动扣除并加到和牌方。\n\n当有人和牌或流局后即关闭所有AI程序。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsticnarf%2Fmahjong","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsticnarf%2Fmahjong","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsticnarf%2Fmahjong/lists"}