如果加载界面出现异常,建议尝试刷新
规则:http://mj.lianzhong.com/gbmj/home/teaching_new_rule1
提供Python和C++的算番库Mahjong-GB-20180521-11.zip
标准国标麻将一局有十六桌,本游戏简化为一桌,每次随机风圈
所有麻将牌均以“大写字母+数字”组合表示。
如:“W4”表示“四万”,“B6”表示“六筒”,“T8”表示“8条”
“F1”~“F4”表示“东南西北”,“J1”~“J3”表示“中发白”,“H1”~“H8”表示“春夏秋冬梅兰竹菊”
输入输出格式参考:https://wiki.botzone.org.cn/index.php?title=Bot
支持JSON交互和简单交互
玩家输入request每条为空格隔开的字符串数组,其格式及样例如下:
编号 | 信息格式 | 样例 | 说明 |
0 | 0 playerID quan | 0 1 2 | 该信息只会出现在第一回合,playerID表示你的位置(门风),quan表示当前风圈。 |
1 | 1 hua0 hua1 hua2 hua3 Card1 Card2 ... Card13 HCard01 ... HCard0hua1 ... HCard31 ... HCard3hua3 | 1 1 2 1 1 W1 B1 ... T3 H1 H4 H2 H3 H6 | 该信息只会出现在第二回合,hua0~hua3表示四个玩家摸到的花牌数,Card1~Card13表示初始手牌,后面的hua0+...+hua3张牌表示所有人摸到的花牌。 保证Card1~Card13没有花牌,后面的均为花牌。 |
2 | 2 Card1 | 2 T6 | 表示玩家摸牌摸到Card1,保证Card1不是花牌。 |
3 | 3 playerID BUHUA Card1 | 3 2 BUHUA H7 | 该消息会发送给所有玩家,表示玩家摸牌摸到花牌Card1,并补花。 |
4 | 3 playerID DRAW | 3 2 DRAW | 表示其他玩家进行了摸牌操作。 |
5 | 3 playerID PLAY Card1 | 3 2 PLAY T1 | 该消息会发送给所有玩家,表示玩家摸牌后,直接打出了Card1。 |
6 | 3 playerID PENG Card1 | 3 2 PENG Card1 | 该消息会发送给所有玩家,表示玩家进行了碰牌操作,碰的牌为上一回合打出的牌,并打出了Card1。 | 7 | 3 playerID CHI Card1 Card2 | 3 2 CHI T2 W3 | 该消息会发送给所有玩家,表示玩家进行了吃牌操作,吃牌后的顺子,中间牌为Card1,并打出Card2。 |
8 | 3 playerID GANG | 3 2 GANG | 该消息会发送给所有玩家,表示玩家进行了杠牌操作,若上一回合为摸牌,表示进行暗杠,否则杠上回合打出的牌。 | 9 | 3 playerID BUGANG Card1 | 3 2 BUGANG W3 | 该消息会发送给所有玩家,表示玩家进行了补杠操作,补杠Card1。 |
玩家输出response每条为空格隔开的字符串数组,编号对应request,其格式及样例如下:
编号 | 信息格式 | 样例 | 说明 |
0 | PASS | PASS | 表示Bot成功获得位置和风圈信息。 |
1 | PASS | PASS | 表示Bot成功获得初始手牌信息。 |
2 | PLAY Card1 | PLAY T6 | 表示玩家摸牌后,直接打出Card1。 |
GANG Card1 | GANG T6 | 表示玩家摸牌后,手牌存在四张Card1,进行杠牌,成功后会再次摸牌。 | |
BUGANG | BUGANG | 表示玩家摸牌摸到一张牌,之前碰过这张牌,进行补杠,成功后会再次摸牌。 | |
HU | HU | 表示玩家进行和牌,此命令后无论是否和牌,游戏结束。 | |
3 | PASS | PASS | 表示Bot成功获得补花信息。 |
4 | PASS | PASS | 表示Bot成功获得其他玩家摸牌信息。 |
5 6 7 | PASS | PASS | 表示Bot成功获得打牌信息,玩家自己的吃、碰、杠牌操作是否成功,请在此处判断。 |
PENG Card1 | PENG T6 | 表示玩家手牌中有2张上一回合其他玩家打出的牌,想要进行碰牌,并打出Card1。 | |
CHI Card1 Card2 | CHI T2 T5 | 需要上回合为玩家上家出牌,表示玩家手牌加上上一回合其他玩家打出的牌能组成的顺子,中间牌为Card1,想要进行吃牌,并打出Card2。 | |
GANG | GANG | 表示玩家手牌中有3张上一回合其他玩家打出的牌,想要进行杠牌,成功后,下回合由该玩家开始摸牌。 | |
HU | HU | 表示玩家想要和牌,此命令后无论是否和牌,游戏结束。 | |
8 | PASS | PASS | 表示Bot成功获得杠牌信息。 |
9 | PASS | PASS | 表示Bot成功获得补杠信息。 |
HU | HU | 表示玩家想要抢杠和,此命令后无论是否和牌,游戏结束。 |
对于5 6 7号操作,由于和牌、吃牌、碰/杠牌可能同时出现,现规定其优先级如下:
和牌 > 碰/杠牌 > 吃牌
碰/杠牌、吃牌只可能有一个人出现,当多人和牌时,按“东南西北”顺序进行判定。
由于5 6 7操作可能失败,需要玩家自行通过下一回合的输入判断操作是否成功。
若Bot在游戏过程中发生错误,返回的操作不合法,和牌时不是和牌牌型或未到8番错和,发生错误的玩家-30分,其余玩家+10分,游戏结束。若有多个玩家同时出错,按“东南西北”的顺序判定第一个出错玩家。
#include <iostream> #include <string> #include <sstream> #include <vector> #include <algorithm> #ifdef _BOTZONE_ONLINE #include "jsoncpp/json.h" #else #include <json/json.h> #endif #define SIMPLEIO 1 //由玩家自己定义,0表示JSON交互,1表示简单交互。 using namespace std; vector<string> request, response; vector<string> hand; int main() { int turnID; string stmp; #if SIMPLEIO cin >> turnID; turnID--; getline(cin, stmp, '\n'); for(int i = 0; i < turnID; i++) { getline(cin, stmp, '\n'); request.push_back(stmp); getline(cin, stmp, '\n'); response.push_back(stmp); } cin >> stmp; request.push_back(stmp); #else Json::Value inputJSON; cin >> inputJSON; turnID = inputJSON["responses"].size(); for(int i = 0; i < turnID; i++) { request.push_back(inputJSON["requests"][i].asString()); response.push_back(inputJSON["responses"][i].asString()); } request.push_back(inputJSON["requests"][turnID].asString()); #endif if(turnID < 2) { response.push_back("PASS"); } else { int itmp, myPlayerID, quan; ostringstream sout; istringstream sin; sin.str(request[0]); sin >> itmp >> myPlayerID >> quan; sin.clear(); sin.str(request[1]); for(int j = 0; j < 5; j++) sin >> itmp; for(int j = 0; j < 13; j++) { sin >> stmp; hand.push_back(stmp); } for(int i = 2; i < turnID; i++) { sin.clear(); sin.str(request[i]); sin >> itmp; if(itmp == 2) { sin >> stmp; hand.push_back(stmp); sin.clear(); sin.str(response[i]); sin >> stmp >> stmp; hand.erase(find(hand.begin(), hand.end(), stmp)); } } sin.clear(); sin.str(request[turnID]); sin >> itmp; if(itmp == 2) { random_shuffle(hand.begin(), hand.end()); sout << "PLAY " << *hand.rbegin(); hand.pop_back(); } else { sout << "PASS"; } response.push_back(sout.str()); } #if SIMPLEIO cout << response[turnID] << endl; #else Json::Value outputJSON; outputJSON["response"] = response[turnID]; cout << outputJSON << endl; #endif return 0; }
未完待续
相关的比赛 | 开始时间 |
---|---|
没有开放的比赛 |