Git Product home page Git Product logo

majsoulai's People

Contributors

747929791 avatar masaiki avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

majsoulai's Issues

proto重新编译之后的错误

报错如下

Similarity: 0.9904546210729466
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection: <class 'socket.socket'> <socket.socket fd=1800, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 8445)> ('127.0.0.1', 8445)
waiting for the game to start
Traceback (most recent call last):
File "main.py", line 744, in
MainLoop(level=level)
File "main.py", line 705, in MainLoop
while not aiWrapper.isPlaying():
File "main.py", line 107, in isPlaying
result = liqiProto.parse(flow_msg)
File "D:\MajsoulAI\majsoul_wrapper\liqi.py", line 85, in parse
liqi_pb2_req = getattr(pb, proto_domain['requestType'])
AttributeError: module 'majsoul_wrapper.proto.liqi_pb2' has no attribute 'ReqFetchLastPrivacy'

main.py的第90行有致命的错误.改了之后大大提高一下稳定性

self.lastOp = self.tenhouEncode({'opcode': None})
上面一行代码,应该改为
self.lastOp = {'opcode': None}
因为 这个变量在程序全程赋值的时候都是以解码之后的 msg字典 (Disct) 的格式来保存的
所以如果lastOp这个变量如果以 编码tenhouDecode后的String 的形式来初始化,在游戏运行的时候会出现致命性错误.

AI子进程启动失败种种问题的解决方案

根本原因是某些py版本或者系统上子进程无法继承父进程的venv,所以在venv环境下配置的包在ai子进程都是感知不到的,环境变量、搜索路径也不继承,打个断点就能发现它报找不到‘xxxx’模块,这些模块在venv确定是已经安装的,因此需要全局安装所有依赖项。
然后,python版本是很重要的,尽量避免使用py39,最好使用py37,py39会导致某几个包的依赖项本地构建失败,然而看错误信息根本牛头不对马嘴。

食断问题

遇到食断的情况 不会考虑食断 超时后报错退出

无法正常出牌

AI在算出第一张牌之后程序停止运行。

AI认为我应该出西风。

AI的logs:

2020-10-08 15:23:34:     Players are: [tst-tio - 1級 - None, user1 - 1級 - None, user2 - 1級 - None, user3 - 新人 - None]
2020-10-08 15:24:07:     --------------------------------------------------
2020-10-08 15:24:07:     Round number:0, Honba sticks:0, Bonus tile indicator:?
2020-10-08 15:24:07:     Players: [tst-tio - 1級 - 25000, user1 - 1級 - 25000, user2 - 1級 - 25000, user3 - 新人 - 25000]
2020-10-08 15:24:07:     Dealer: tst-tio - 1級 - 25000
2020-10-08 15:24:07:     Round  wind: ?
2020-10-08 15:24:07:     Player wind: ?
2020-10-08 15:24:07:
2020-10-08 15:24:07:
2020-10-08 15:24:07:     [Bot] draws a tile: ????????????? + ?
2020-10-08 15:24:07:         ?[Waiting prediction]
2020-10-08 15:24:07:         ?[Shantins]: NM: 3  PH: 3  NO19: 5  PPH: 7  7P: 5  QH: 5
2020-10-08 15:24:07:     [Bot] discards:  + ?
2020-10-08 15:24:08:     [Bot] hand tiles after discarding: ?????????????
2020-10-08 15:24:08:
2020-10-08 15:24:08:     Remaining tiles: 69
2020-10-08 15:24:08:     --------------------------------------------------
2020-10-08 15:24:08:
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
Exception in thread Thread-1:
[WinError 10054] 远程主机强迫关闭了一个现有的连接。
Traceback (most recent call last):
  File "E:\Download\MajsoulAI\JianYangAI\client\tenhou_client.py", line 697, in _send
    self.skt.sendall(msg_.encode())
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\office04\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\office04\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "E:\Download\MajsoulAI\JianYangAI\client\tenhou_client.py", line 727, in send_alive
    self._send('<Z />')
  File "E:\Download\MajsoulAI\JianYangAI\analysis\analyzer.py", line 30, in wrapper
    ret = func(*args,**kwargs)
  File "E:\Download\MajsoulAI\JianYangAI\client\tenhou_client.py", line 700, in _send
    self.end_game(False)
  File "E:\Download\MajsoulAI\JianYangAI\analysis\analyzer.py", line 30, in wrapper
    ret = func(*args,**kwargs)
  File "E:\Download\MajsoulAI\JianYangAI\client\tenhou_client.py", line 195, in end_game
    self.keep_alive_thread.join()
  File "C:\Users\office04\AppData\Local\Programs\Python\Python38\lib\threading.py", line 1008, in join
    raise RuntimeError("cannot join current thread")
RuntimeError: cannot join current thread
2020-10-08 15:24:19:     Game was ended unexpected
2020-10-08 15:24:19:
[WinError 10038] 在一个非套接字上尝试了一个操作。
2020-10-08 15:24:19:     Game End
2020-10-08 15:24:19:

main.py的logs:

[AI EVENT] : <Z />
recv: <JOIN t="0,1" />
send: b'<GO type="1" lobby="0" gpid="EE26C0F2-327686F1"/>\x00'
send: b'<UN n0="tst-tio" n1="user1" n2="user2" n3="user3" dan="9,9,9,0" rate="985.47,1648.57,1379.50,1500.00" sx="M,M,M,M"/>\x00'
send: b'<TAIKYOKU oya="0" log="xxxxxxxxxxxx-xxxx-xxxx-xxxxxxxx"/>\x00'
recv: <GOK /
[AI EVENT] : <GOK /
recv: <NEXTREADY />
recv: <Z />
recv: <Z />
recv: <Z />
recv: <Z />
recv: <Z />
send: b'<INIT seed="0,0,0,-1,-1,100" ten="250,250,250,250" oya="0" hai="17,24,32,33,40,68,76,80,84,92,96,104,116"/>\x00'
send: b'<T120/>\x00'
recv: <Z />
recv: <Z />
recv: <Z />
recv: <D p="116"/>
Traceback (most recent call last):
  File "e:/Download/MajsoulAI/main.py", line 742, in <module>
    MainLoop(level=level)
  File "e:/Download/MajsoulAI/main.py", line 715, in MainLoop
    aiWrapper.recv(data)
  File "e:/Download/MajsoulAI/main.py", line 134, in recv
    self._eventHandler(msg.decode('utf-8'))
  File "e:/Download/MajsoulAI/main.py", line 159, in _eventHandler
    self.on_DiscardTile(d)
  File "e:/Download/MajsoulAI/main.py", line 593, in on_DiscardTile
    self.actionDiscardTile(tile)
  File "e:\Download\MajsoulAI\majsoul_wrapper\action\action.py", line 187, in actionDiscardTile
    raise Exception(
Exception: ('GUIInterface.discardTile tile not found. L:', [('5m', (146, 567)), ('7m', (192, 567)), ('9m', (237, 567)), ('9m', (282, 567)), ('2p', (327, 567)), ('9p', (373, 567)), ('5z', (495, 569)), ('9s', (644, 567))], 'tile:', '3z')
PS E:\Download\MajsoulAI>

JianYangAI无法运行

Traceback (most recent call last):
File "main.py", line 78, in
main()
File "/root/program/MahjonAI/MajsoulAI/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "main.py", line 74, in main
run_jianyang_ai()
File "/root/program/MahjonAI/MajsoulAI/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "main.py", line 57, in run_jianyang_ai
ensemble_clfs = waiting_prediction_class()
File "/root/program/MahjonAI/MajsoulAI/JianYangAI/agents/jianyang_ai.py", line 239, in init
self.clfs_richii.append(pickle.load(open(self.root_dir + f, 'rb')))
ModuleNotFoundError: No module named 'sklearn.neural_network.multilayer_perceptron'

ubuntu16 python3.8.3 scikit-learn 0.24.0
win10 python3.9 scikit-learn 0.24.0
均报一样错误
试着run了原版的AI 也是提示没有sklearn.neural_network.multilayer_perceptron
是不是需要sklearn老版本呢

遇到一个碰的时候会卡住的bug

普通的碰没问题。我遇到的bug是,手上3个5饼,其中有个红5饼。
外面打出5饼,然后AI选择了碰,这时候需要选择是用两个普通5饼碰,还是用红5饼碰。
这时候程序会卡住,不会进行选择。

报错KeyError: 'fetchLastPrivacy'

在调用majsoul_wrapper时会报错KeyError: 'fetchLastPrivacy'

具体报错信息:

(venv) D:\MajsoulAI-master>python main.py
waiting to calibrate the browser location
  Number of good matches: 642
  Homography Matrix: [[ 6.48872443e-01 -1.81677678e-04  6.75356641e+02]
 [ 5.29145342e-04  6.48279953e-01  2.50010905e+02]
 [ 5.38194002e-07 -1.41332255e-07  1.00000000e+00]]
Similarity: 0.9973840146991272
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection:  <class 'socket.socket'> <socket.socket fd=1628, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 60383)> ('127.0.0.1', 60383)
waiting for the game to start
Traceback (most recent call last):
  File "main.py", line 744, in <module>
    MainLoop(level=level)
  File "main.py", line 705, in MainLoop
    while not aiWrapper.isPlaying():
  File "main.py", line 107, in isPlaying
    result = liqiProto.parse(flow_msg)
  File "D:\MajsoulAI-master\majsoul_wrapper\liqi.py", line 84, in parse
    proto_domain = self.jsonProto['nested'][lq]['nested'][service]['methods'][rpc]
KeyError: 'fetchLastPrivacy'

AI强制关闭

AI在进入对局时自行关闭

我感觉可能会有敏感信息的位置打一下码

捕获

在clone的时候遇到权限访问的问题

在source tree使用 SSH “[email protected]:747929791/MajsoulAI.git” colne代码
回来的代码 JianYangAI majsoul_wrapper 这两个 submodule 都是空的

自己有更新过自己的SSH密钥 以及把防火墙关闭 依然如此
我想我可能犯了什么很愚蠢的错误

git -c filter.lfs.smudge= -c filter.lfs.required=false -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks clone --branch master --recursive [email protected]:Lica3265/MajsoulAI.git C:\Users\user\Desktop\MajsoulAI
Cloning into 'C:\Users\user\Desktop\MajsoulAI'...
Submodule 'JianYangAI' ([email protected]:747929791/MahjongAI.git) registered for path 'JianYangAI'
Submodule 'majsoul_wrapper' ([email protected]:747929791/majsoul_wrapper.git) registered for path 'majsoul_wrapper'

Cloning into 'C:/Users/user/Desktop/MajsoulAI/JianYangAI'...
FATAL ERROR: Incorrect MAC received on packet
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
fatal: clone of '[email protected]:747929791/MahjongAI.git' into submodule path 'C:/Users/user/Desktop/MajsoulAI/JianYangAI' failed
Failed to clone 'JianYangAI'. Retry scheduled

Cloning into 'C:/Users/user/Desktop/MajsoulAI/majsoul_wrapper'...
Cloning into 'C:/Users/user/Desktop/MajsoulAI/JianYangAI'...
FATAL ERROR: Incorrect MAC received on packet
fatal: the remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
fatal: clone of '[email protected]:747929791/MahjongAI.git' into submodule path 'C:/Users/user/Desktop/MajsoulAI/JianYangAI' failed
Failed to clone 'JianYangAI' a second time, aborting

google.protobuf.message.DecodeError: Wrong wire type in tag.

Traceback (most recent call last):
File "main.py", line 744, in
MainLoop(level=level)
File "main.py", line 724, in MainLoop
aiWrapper.recvFromMajsoul()
File "main.py", line 124, in recvFromMajsoul
result = self.liqiProto.parse(flow_msg)
File "D:\maj\MajsoulAI-master\majsoul_wrapper\liqi.py", line 66, in parse
action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)
File "C:\python\lib\site-packages\google\protobuf\internal\python_message.py", line 812, in FromString
message.MergeFromString(s)
File "C:\python\lib\site-packages\google\protobuf\internal\python_message.py", line 1145, in MergeFromString
if self._InternalParse(serialized, 0, length) != length:
File "C:\python\lib\site-packages\google\protobuf\internal\python_message.py", line 1198, in InternalParse
(data, new_pos) = decoder._DecodeUnknownField(
File "C:\python\lib\site-packages\google\protobuf\internal\decoder.py", line 993, in _DecodeUnknownField
raise _DecodeError('Wrong wire type in tag.')
google.protobuf.message.DecodeError: Wrong wire type in tag.
能启动, 进入放见后, 就报这个错误, 我怀疑是protobuf版本问题, 我用3.10.0编译出来配合protobuf==3.10.0 , 与3.14.0编译出来配合protobuf==3.14.0报同样的错误,不知道是不是 pbjs的问题,我用的是[protobufjs提供的最新的pbjs,之前用旧版本的也是报同样的错误, 可以传一份新的liqi.proto与liqi_pb2 试试吗,谢谢

sklearn import错误

打开pickle文件时sklearn import 错误

❯ python main.py
waiting to calibrate the browser location
Number of good matches: 1426
Homography Matrix: [[ 1.26028472e+00 -2.85660313e-03 3.76300012e+01]
[ 4.82342015e-03 1.25286812e+00 5.04039975e+02]
[ 3.20553576e-06 -1.47682354e-06 1.00000000e+00]]
Similarity: 0.9598514660493828
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg', 'player'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg', 'attr_name'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['auth_code'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'ai_obj', 'opponent_class', 'user_id', 'user_name', 'lobby_type', 'game_type', 'logger_obj', 'drawer'], varargs=None, keywords=None, defaults=(None,))
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'success'], varargs=None, keywords=None, defaults=(True,))
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=('',))
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg', 'meld_tile'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'game_type'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['ai_obj', 'opponent_class', 'user', 'username', 'lobbytype', 'gametype', 'logger_obj', 'drawer'], varargs=None, keywords=None, defaults=(None,))
ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['drawer'], varargs=None, keywords=None, defaults=(None,))
ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'ensemble_clfs'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 't34', 'hand_ana'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'tile136', 'from_opponent'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'tile136', 'might_call_chi'], varargs=None, keywords=None, defaults=None)
Traceback (most recent call last):
File "main.py", line 78, in
main()
File "/Users/ly/Documents/MajsoulAI/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "main.py", line 74, in main
run_jianyang_ai()
File "/Users/ly/Documents/MajsoulAI/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "main.py", line 57, in run_jianyang_ai
ensemble_clfs = waiting_prediction_class()
File "/Users/ly/Documents/MajsoulAI/JianYangAI/agents/jianyang_ai.py", line 245, in init
self.clfs_richii.append(pickle.load(open(self.root_dir + f, 'rb')))
ModuleNotFoundError: No module named 'sklearn.neural_network.multilayer_perceptron'

服务器执行会卡在 80 richii classifiers loaded

首先requirements.txt里面,少了scikit-learn==0.19.2
这个安装完之后,运行会变成这样

$ python remote.py 
remote server starting up on 0.0.0.0 port 14782
AI server starting up on 127.0.0.1 port 7479
wating for client.
client connection:  <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('某 IP', 14782), raddr=('某IP', 52289)> ('某IP', 52289)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg', 'player'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['data', 'meld'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['msg', 'attr_name'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['auth_code'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'ai_obj', 'opponent_class', 'user_id', 'user_name', 'lobby_type', 'game_type', 'logger_obj', 'drawer'], varargs=None, keywords=None, defaults=(None,))
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'success'], varargs=None, keywords=None, defaults=(True,))
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=('',))
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg', 'meld_tile'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'game_type'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'msg'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['ai_obj', 'opponent_class', 'user', 'username', 'lobbytype', 'gametype', 'logger_obj', 'drawer'], varargs=None, keywords=None, defaults=(None,))
ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['drawer'], varargs=None, keywords=None, defaults=(None,))
ArgSpec(args=[], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'ensemble_clfs'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 't34', 'hand_ana'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'tile136', 'from_opponent'], varargs=None, keywords=None, defaults=None)
ArgSpec(args=['self', 'tile136', 'might_call_chi'], varargs=None, keywords=None, defaults=None)
80 richii classifiers loaded

本地运行

python main.py --level 0 --remote_ip XXX

就一直卡在call remote AI

无法在macos上运行 因为代码中有个参数只能在win上使用

‘from subprocess import Popen, CREATE_NEW_CONSOLE’ 中CREATE_NEW_CONSOLE这个函数仅在windows上可用,查了查mac上的平替版本,但因为本人太菜,没搞出来。 也就是说在创建新的终端的时候,mac上无法执行main.py中的代码,希望大佬有空大时候研究一下怎么办。

无法执行碰杠吃立直等操作

在运行的时候软件点不中按钮(会点到按钮右上方的区域,大概两三个鼠标的距离),请问这个问题该如何解决

AI强度的疑问

在铜间打了38场渡劫到雀士。铜间的一、二、三、四位率分别为33.33% 25.00% 19.44% 22.22%。而且发现数次不可理解操作包括早巡切dora拒听、不要0s改良等,更不用说一些立直判断了。因此估计该AI实力并不及介绍中说的天凤2段qwq。

吐槽一下AI

虽然说有的用已经不错了不该bb啥,作者付出了很大的努力,我前两年就想搞了,然而牌谱都没地方收集。。
但是引用的那个ai实在是。。。一言难尽。
1.牌效判断有大问题,
2.筋璧牌判断也有大问题,明显的筋牌居然直接打了。。
3.看到有gay友说这个ai注重防守,我觉得不是注重防守,是它的局势判断有问题。
较为明显的错误是:
1)对于吃牌的基本规则判断错误,吃了以后会去选规则不允许出的牌。(这点可以直接照搬天凤的牌效代码解决)
2)可以立直二向听的它不听改立一向听,甚至有一局三向听改立一向听我人直接傻了。
机会把握上:
1)可以试着立直的牌不立,立直除非前几巡进章NB,要么很后面应该考虑不立直或者弃胡的时候去立直,这应该属于错误判断。
2)在点数大落后的情况下不够激进,开杠,不会尝试做大牌逆转局势(清一色这种赌脸的牌,人的话有机会一定会去试的)。
银之间的3、4位率很高,越往上防守越厉害,这个AI进攻性太差(牌效判断有问题的话进攻也无从谈起了),防守又有逻辑上的错误,往上测没什么意义。

目前自带的这个ai和AI的差别比较明显就是不会“思考”,或者说它思考的时间太短了,几乎2-3秒就出牌了,在双核4线程电脑上预测4个人的行为算20巡起码要3秒,使用gpu的话另说。然而真正要能有明显效果起码要领先25巡。。
目前棋牌类游戏民间采用的流行方案都是nn,这个方案下的AI才不是使用穷举而是真正能够模拟思考的过程。
以上是我基于围棋和象棋AI的想法,麻将应该不是这个方案。
看了一下issue,有朋友提到有个ai不错,感觉更新一下可以替换了试试看看效果。
不知道那个AI是怎么写的,我先拜读一下代码再说。。

麻将的识别好像有点不太准确

四五六筒子识别好像不是很准确,不知道是不是分别率的关系,理论上应该影响不大。四五六筒会被都识别为四筒, 7s和9s也是会被识别为7s。有时红dora也是识别不一定100%准确(很难100%),估计这个很可能就是ai比较弱的原因(之一?)

进入对局后报错xmlrpc.client.Fault: <Fault 1: "<class 'IndexError'>:list index out of range">

本地一些配置
Mitmproxy: 8.0.0
Python: 3.8.8
scikit-learn: 0.19.2
终于可以开始游戏了,但是进了就报错,也不清楚是哪里出了问题

starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection:  <class 'socket.socket'> <socket.socket fd=1896, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 27781)> ('127.0.0.1', 27781)
waiting for the game to start
Traceback (most recent call last):
  File "C:\Users\admin\anaconda3\lib\xmlrpc\client.py", line 1153, in request
    return self.single_request(host, handler, request_body, verbose)
  File "C:\Users\admin\anaconda3\lib\xmlrpc\client.py", line 1169, in single_request
    return self.parse_response(resp)
  File "C:\Users\admin\anaconda3\lib\xmlrpc\client.py", line 1341, in parse_response
    return u.close()
  File "C:\Users\admin\anaconda3\lib\xmlrpc\client.py", line 655, in close
    raise Fault(**self._stack[0])
xmlrpc.client.Fault: <Fault 1: "<class 'IndexError'>:list index out of range">
python-BaseException

Process finished with exit code 1

There is a high probability of reporting this error when the game starts.

majsoul_wrapper\action\action.py", line 188, in actionDiscardTile
'GUIInterface.discardTile tile not found. L:', L, 'tile:', tile)
Exception: ('GUIInterface.discardTile tile not found. L:', [('3m', (1458, 884)), ('4m', (1519, 884)), ('5m', (1581, 884)), ('3p', (1643, 884)), ('3p', (1704, 884)), ('5s', (1934, 887)), ('4z', (2137, 884)), ('5z', (2208, 884)), ('7z', (2280, 884))], 'tile:', '3z')

当初始dora数量超过一个时无法正常启动

这次活动新增了宝牌狂热模式 开局自动翻出3张宝牌 此时报错 无法正常启动
Traceback (most recent call last): File "main.py", line 744, in <module> MainLoop(level=level) File "main.py", line 724, in MainLoop aiWrapper.recvFromMajsoul() File "main.py", line 125, in recvFromMajsoul failed = self.parse(result) File "C:\Users\Administrator\Desktop\MajsoulAI\majsoul_wrapper\sdk.py", line 128, in parse assert(len(data['doras']) == 1) AssertionError

请问最后运行main.py识别后会出现10061错误。是什么原因?

新人。安装py以后按照运行提示缺的模块一步步装的,不过到最后一步这错误我是真不知道什么情况了。。。
F:\AI\MajsoulAI>python main.py
waiting to calibrate the browser location
Number of good matches: 7
Not enough matches are found - 7/50
majsoul menu not found, calibrate again
Number of good matches: 7
Not enough matches are found - 7/50
majsoul menu not found, calibrate again
Number of good matches: 4
Not enough matches are found - 4/50
majsoul menu not found, calibrate again
Number of good matches: 856
Homography Matrix: [[ 6.89966104e-01 -6.34156176e-03 1.34787601e+02]
[ 3.95522318e-04 6.88621178e-01 1.44913969e+02]
[-1.10450468e-06 -1.20214125e-05 1.00000000e+00]]
Similarity: 0.7355346284450762
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection: <class 'socket.socket'> <socket.socket fd=1460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 8379)> ('127.0.0.1', 8379)
waiting for the game to start
Traceback (most recent call last):
File "main.py", line 711, in
MainLoop()
File "main.py", line 686, in MainLoop
while not aiWrapper.isPlaying():
File "main.py", line 100, in isPlaying
n = self.majsoul_server.get_len()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\xmlrpc\client.py", line 1109, in call
return self.__send(self.__name, args)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\xmlrpc\client.py", line 1450, in __request
response = self.__transport.request(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\xmlrpc\client.py", line 1153, in request
return self.single_request(host, handler, request_body, verbose)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\xmlrpc\client.py", line 1165, in single_request
http_conn = self.send_request(host, handler, request_body, verbose)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\xmlrpc\client.py", line 1278, in send_request
self.send_content(connection, request_body)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\xmlrpc\client.py", line 1308, in send_content
connection.endheaders(request_body)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 1235, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 1006, in _send_output
self.send(msg)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 946, in send
self.connect()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\http\client.py", line 917, in connect
self.sock = self._create_connection(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\socket.py", line 808, in create_connection
raise err
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\socket.py", line 796, in create_connection
sock.connect(sa)
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

吃啥打啥(食替)问题

在测试中发现AI会出现违反食替规则的操作,会试图打出禁止打出的牌 例如23p吃1p,后打出1p的迷惑操作
考虑到天凤貌似也有这个规则,识别出错也有可能
当然这是AI的问题,也不指望能简单地解决(

waiting for the AI

作者您好,按照您的教程一步一步部署完了,但是最后一步,启动ai之后,却没有进入比赛
以下是cmd的显示

E:\Desktop\majsoul\MajsoulAI>python main.py --level 0
waiting to calibrate the browser location
  Number of good matches: 684
  Homography Matrix: [[ 2.24332037e+00 -3.77328306e-03  1.37736202e+02]
 [-2.35230320e-03  2.23792866e+00  1.17235623e+02]
 [ 3.02871161e-06 -1.99469636e-06  1.00000000e+00]]
Similarity: 0.9994439683317009
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI

我尝试用手动的方式(也就是不输入--level 0),显示也是一样,手动进入比赛之后,也没有自动做出选择。
请问这是什么原因呢?

以下是我的其它信息
系统:Microsoft Windows [Version 10.0.18362.1082]
python:3.7.9
cuda:10.2

连续两次测试出现KeyError: 'hand'导致进程退出,请问如何解决

Traceback (most recent call last):
File "main.py", line 728, in
MainLoop(level=level)
File "main.py", line 710, in MainLoop
aiWrapper.recvFromMajsoul()
File "main.py", line 125, in recvFromMajsoul
failed = self.parse(result)
File "C:\Users\Blaze\Desktop\MajsoulAI-master\majsoul_wrapper\sdk.py", line 172, in parse
hands = [players[i]['hand'] if tingpai[i] else []
File "C:\Users\Blaze\Desktop\MajsoulAI-master\majsoul_wrapper\sdk.py", line 172, in
hands = [players[i]['hand'] if tingpai[i] else []
KeyError: 'hand'

错误提示如上,麻烦看下,谢谢

AI启动之后 无法识别到页面

日志重复打印
Number of good matches: 520
Homography Matrix: [[ 7.58815864e-01 1.30117867e-02 1.88943925e+02]
[-1.23362225e-02 8.14198957e-01 1.22952681e+02]
[-4.38856516e-05 5.86492828e-06 1.00000000e+00]]
Similarity: 0.10787834584598473
majsoul menu not found, calibrate again

桌面分辨率1920*1080,浏览器已最大化

liqi.json应该更新了

waiting for the game to start
Traceback (most recent call last):
  File ".\main.py", line 742, in <module>
    MainLoop(level=level)
  File ".\main.py", line 705, in MainLoop
    while not aiWrapper.isPlaying():
  File ".\main.py", line 107, in isPlaying
    result = liqiProto.parse(flow_msg)
  File "E:\mahjong\MajsoulAI\majsoul_wrapper\liqi.py", line 86, in parse
    proto_domain = self.jsonProto['nested'][lq]['nested'][service]['methods'][rpc]
KeyError: 'fetchChallengeInfo'

这个fetchChallengeInfo应该是更新“试炼之道”后出现的.

AI思考过慢导致未及时出牌数据不对

有些时候AI思考太长时间,超出了雀魂的时间,导致实际上出出去的牌和AI想出出去的牌不同,然后下一巡再出牌的时候AI里的牌和实际的牌就会不一样,程序报错

Traceback (most recent call last):
  File "main.py", line 744, in <module>
    MainLoop(level=level)
  File "main.py", line 715, in MainLoop
    aiWrapper.recv(data)
  File "main.py", line 134, in recv
    self._eventHandler(msg.decode('utf-8'))
  File "main.py", line 159, in _eventHandler
    self.on_DiscardTile(d)
  File "main.py", line 593, in on_DiscardTile
    self.actionDiscardTile(tile)
  File "D:\MajsoulAI-master\majsoul_wrapper\action\action.py", line 187, in actionDiscardTile
    raise Exception(
Exception: ('GUIInterface.discardTile tile not found. L:', [('9m', (1095, 828)), ('3p', (1143, 828)), ('4p', (1190, 828)), ('4p', (1238, 828)), ('7p', (1285, 828)), ('8p', (1332, 828)), ('9p', (1380, 828)), ('4s', (1427, 828)), ('0s', (1474, 828)), ('6s', (1522, 828)), ('7s', (1569, 828)), ('7s', (1616, 828)), ('8s', (1664, 828)), ('4s', (1726, 828))], 'tile:', '3m')

运行AI对局中会出现GUIInterface.discardTile tile not found.

send: b'\x00'
recv:
send: b'\x00'
recv:
send: b'\x00'
recv:
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
recv:
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
recv:
send: b'\x00'
recv:
recv:
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
send: b'\x00'
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
clickCandidateMeld AI_combination ('0m', '4m')
clickCandidateMeld tiles: [('4m', (1211, 695)), ('0m', (1262, 695)), ('4m', (133
9, 695)), ('5m', (1391, 695))]
recv:
recv:
send: b'\x00'
recv:
recv:
recv:
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
send: b'\x00'
recv:
send: b'\x00'
recv:
recv:
send: b'\x00'
recv:
Traceback (most recent call last):
File "G:\MajsoulAI-master\main.py", line 744, in
MainLoop(level=level)
File "G:\MajsoulAI-master\main.py", line 715, in MainLoop
aiWrapper.recv(data)
File "G:\MajsoulAI-master\main.py", line 134, in recv
self._eventHandler(msg.decode('utf-8'))
File "G:\MajsoulAI-master\main.py", line 159, in _eventHandler
self.on_DiscardTile(d)
File "G:\MajsoulAI-master\main.py", line 593, in on_DiscardTile
self.actionDiscardTile(tile)
File "G:\MajsoulAI-master\majsoul_wrapper\action\action.py", line 191, in acti
onDiscardTile
'GUIInterface.discardTile tile not found. L:', L, 'tile:', tile)
Exception: ('GUIInterface.discardTile tile not found. L:', [('3m', (857, 850)),
('6m', (918, 850)), ('6s', (979, 850)), ('6s', (1040, 850)), ('6s', (1101, 850))
], 'tile:', '5m')
就是正常打着偶尔会蹦出这个报错,没搞懂具体原因,我用置顶工具置顶了页面也还是会出现这个问题。。。

因为本地GPU太旧,连用远程模式也会出错误

我自己电脑有点老了,pytorch不支持了,然后我在AWS上开了一个Deep Learning的AMI实例,而且成功运行remote.py了

$ python remote.py
remote server starting up on 0.0.0.0 port 14782
AI server starting up on 127.0.0.1 port 7479
wating for client.

但本地依然直接pytorch报错,说显卡的CUDA版本太旧。

(venv) E:\Dropbox\MajsoulAI>python main.py --remote_ip {我AWS的IP}
E:\Dropbox\MajsoulAI\venv\lib\site-packages\torch\cuda\__init__.py:81: UserWarning:
    Found GPU0 Quadro K600 which is of cuda capability 3.0.
    PyTorch no longer supports this GPU because it is too old.
    The minimum cuda capability that we support is 3.5.

  warnings.warn(old_gpu_warn % (d, name, major, capability[1]))
Traceback (most recent call last):
  File "E:\Dropbox\MajsoulAI\main.py", line 747, in <module>
    MainLoop(isRemoteMode=True, remoteIP=args.remote_ip, level=level)
  File "E:\Dropbox\MajsoulAI\main.py", line 665, in MainLoop
    aiWrapper = AIWrapper()
  File "E:\Dropbox\MajsoulAI\main.py", line 71, in __init__
    super().__init__()
  File "E:\Dropbox\MajsoulAI\majsoul_wrapper\action\action.py", line 170, in __init__
    self.classify = Classify()
  File "E:\Dropbox\MajsoulAI\majsoul_wrapper\action\classifier.py", line 95, in __init__
    self.__call__(np.ones((32, 32, 3), dtype=np.uint8))  # load cache
  File "E:\Dropbox\MajsoulAI\majsoul_wrapper\action\classifier.py", line 102, in __call__
    _, predicted = torch.max(self.model(img), 1)
  File "E:\Dropbox\MajsoulAI\venv\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "E:\Dropbox\MajsoulAI\majsoul_wrapper\action\classifier.py", line 79, in forward
    x = self.pool(F.relu(self.conv1(x)))
  File "E:\Dropbox\MajsoulAI\venv\lib\site-packages\torch\nn\modules\module.py", line 727, in _call_impl
    result = self.forward(*input, **kwargs)
  File "E:\Dropbox\MajsoulAI\venv\lib\site-packages\torch\nn\modules\conv.py", line 423, in forward
    return self._conv_forward(input, self.weight)
  File "E:\Dropbox\MajsoulAI\venv\lib\site-packages\torch\nn\modules\conv.py", line 419, in _conv_forward
    return F.conv2d(input, weight, self.bias, self.stride,
RuntimeError: CUDA error: no kernel image is available for execution on the device

如果是远程模式的话,有没有办法跳过这个检测?

成功启动并定位之后,一开局程序就立刻结束

本地装了scikit-learn==0.19.2,终于能让服务器部分跑起来了
但只要启动对局,立刻就程序结束了

waiting to calibrate the browser location
  Number of good matches: 351
  Homography Matrix: [[ 5.18007803e-01  9.81474025e-03  1.01919695e+03]
 [-3.84975970e-04  5.20930195e-01  1.51841392e+02]
 [-2.34987214e-07  5.65038455e-06  1.00000000e+00]]
Similarity: 0.7652690698690114
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection:  <class 'socket.socket'> <socket.socket fd=1688, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 54204)> ('127.0.0.1', 54204)
waiting for the game to start
recv: <HELO name="ID696E3BCC-hLHNE8Wf" tid="f0" sx="M" />
send: b'<HELO uname="%74%73%74%5F%74%69%6F" auth="XXX" PF4="9,50,986.91,-4027.0,29,43,71,107,14,1362,162,257,226,135" ratingscale="PF3=1.000000&PF4=1.000000&PF01C=0.582222&PF02C=0.501632&PF03C=0.414869&PF11C=0.823386&PF12C=0.709416&PF13C=0.586714&PF23C=0.378722&PF33C=0.535594&PF1C00=8.000000" rr="PF3=0,0&PF4=272284,0&PF01C=0,0&PF02C=0,0&PF03C=0,0&PF11C=0,0&PF12C=0,0&PF13C=0,0&PF23C=0,0&PF33C=0,0&PF1C00=0,0"/>\x00'
beginGame (self = <__main__.AIWrapper object at 0x0000022686E22D48>)
BeginGame Game
recv: <AUTH val="XXX"/>
[AI EVENT] : <AUTH val="XXX"/>
recv: <PXR V="9" />
send: b'<LN n="XXX" j="XXX" g="XXX"/>\x00'
authGame (accountId = 11358654, seatList = [0, 0, 0, 11358654])
recv: <Z />
[AI EVENT] : <Z />
closing server after reading no data

liqi.json 需要更新了

Traceback (most recent call last):
File "main.py", line 742, in
MainLoop(level=level)
File "main.py", line 705, in MainLoop
while not aiWrapper.isPlaying():
File "main.py", line 107, in isPlaying
result = liqiProto.parse(flow_msg)
File "C:\xxxx\MajsoulAI-master\majsoul_wrapper\liqi.py", line 84, in parse
proto_domain = self.jsonProto['nested'][lq]['nested'][service]['methods'][rpc]
KeyError: 'fetchABMatchInfo'

ai在别人和自己多次碰吃杠之后会陷入发呆,此时必需手动出一下牌才行

日志有一个编码的错误,但是不会影响程序运行

--- Logging error ---
Traceback (most recent call last):
File "/usr/lib64/python3.6/logging/init.py", line 996, in emit
stream.write(msg)
UnicodeEncodeError: 'ascii' codec can't encode character '\u7d1a' in position 67: ordinal not in range(128)
Call stack:
File "/www/wwwroot/myai/JianYangAI/main.py", line 78, in
main()
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/main.py", line 74, in main
run_jianyang_ai()
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/main.py", line 69, in run_jianyang_ai
connect_and_play(ai_obj, opponent_class, user, user_name, '0', game_type, logger_obj, drawer) # play one game
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/main.py", line 18, in connect_and_play
return client.start_game()
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/client/tenhou_client.py", line 152, in start_game
'<REACH' in msg and 'step="1"' in msg and self._handle_reach_claim(msg)
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/client/tenhou_client.py", line 505, in _handle_reach_claim
self.both_log(reach_msg)
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/client/tenhou_client.py", line 776, in both_log
self._stream_log(msg)
File "/www/wwwroot/myai/JianYangAI/analysis/analyzer.py", line 30, in wrapper
ret = func(*args,**kwargs)
File "/www/wwwroot/myai/JianYangAI/client/tenhou_client.py", line 767, in _stream_log
(not self.logger_obj.buffer_mode) and self.logger_obj.add_line(msg)
File "/www/wwwroot/myai/JianYangAI/logger/logger_handler.py", line 51, in add_line
self.lg.info(msg)
Message: ' Reach was called by 2-th player: user2 - 1\u7d1a - 11400'
Arguments: ()

求帮助!!waiting for the AI

(env01) C:\mypython3ver2\env01\Scripts>python
Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Package Version


asgiref 3.3.1
blinker 1.4
Brotli 1.0.9
certifi 2020.12.5
cffi 1.14.5
click 7.1.2
cryptography 3.2.1
Flask 1.1.2
h11 0.12.0
h2 4.0.0
hpack 4.0.0
hyperframe 6.0.0
itsdangerous 1.1.0
Jinja2 2.11.3
kaitaistruct 0.9
ldap3 2.8.1
MarkupSafe 1.1.1
mitmproxy 5.3.0
MouseInfo 0.1.3
msgpack 1.0.2
numpy 1.20.1
opencv-python 4.5.1.48
passlib 1.7.4
Pillow 8.1.0
pip 21.0.1
protobuf 3.13.0
publicsuffix2 2.20191221
pyasn1 0.4.8
PyAutoGUI 0.9.52
pycparser 2.20
pydivert 2.1.0
PyGetWindow 0.0.9
PyMsgBox 1.0.9
pyOpenSSL 19.1.0
pyparsing 2.4.7
pyperclip 1.8.1
PyRect 0.1.4
PyScreeze 0.1.26
PyTweening 1.0.3
ruamel.yaml 0.16.12
ruamel.yaml.clib 0.2.2
scikit-learn 0.19.2
scipy 1.6.0
selenium 3.141.0
setuptools 52.0.0
six 1.15.0
sortedcontainers 2.2.2
torch 1.7.1+cu110
torchaudio 0.7.2
torchvision 0.8.2+cu110
tornado 6.1
typing-extensions 3.7.4.3
urllib3 1.26.3
urwid 2.1.2
Werkzeug 1.0.1
wheel 0.36.2
wsproto 0.15.0
zstandard 0.14.1

弄了好几天都开不了AI,请帮帮我:(

waiting for the AI 跟 Authentication code was not received!

这个ai好像有点弱

玉之间银之间分别试了几次,基本都吃4了,大佬有兴趣试试akochan这个ai?

你好,请问下auth_code为空怎么解决呀?

80 richii classifiers loaded
148 normal waiting classifiers loaded
2021-02-16 12:39:47: Authentication code was not received!
2021-02-16 12:39:47: Game End
对python不太熟,试了一下原因是
.\JianYangAI\client下tenhou_client.py里
if not auth_code:
self._log(" Authentication code was not received!")
这个的原因,
print(msgs)结果(删掉了开头,不然不能发表)%74%5F%74%69%6F"PF4="9,30,1091.57,-12895.0,90,128,233,348,43,4365,468,807,1005,423" PF3="0,0,1470.07,-63.0,0,0,1,0,1,7,0,2,0,0"ratingscale="PF3=1.000000&PF4=1.000000&PF01C=0.582222&PF02C=0.501632&PF03C=0.414869&PF11C=0.823386&PF12C=0.709416&PF13C=0.586714&PF23C=0.378722&PF33C=0.535594&PF1C00=8.000000" rr="PF3=0,0&PF4=389733,0&PF01C=0,0&PF02C=0,0&PF03C=0,0&PF11C=0,0&PF12C=0,0&PF13C=0,0&PF23C=0,0&PF33C=0,0&PF1C00=0,0"/>']

AI无法正确在本地运行

問題

RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.

問題2

进入对局后报错(更新proto后仍报错)

使用了-level 1 命令
在AI自动点击银之间按钮之后AI报错,经多次测试仍出现相同情况
报错信息如下

  majsoul menu not found, calibrate again]
  Number of good matches: 1071
  Homography Matrix: [[ 8.18263740e-01 -1.19836177e-03  6.32067758e+00]
 [-2.10630195e-03  8.22187602e-01  1.73237682e+02]
 [-3.05598975e-06 -5.09500683e-07  1.00000000e+00]]
Similarity: 0.7084269662921349
create AI subprocess locally
starting up on 127.0.0.1 port 7479
waiting for the AI
AI connection:  <class 'socket.socket'> <socket.socket fd=1404, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 7479), raddr=('127.0.0.1', 56918)> ('127.0.0.1', 56918)
waiting for the game to start
Traceback (most recent call last):
  File "main.py", line 744, in <module>
    MainLoop(level=level)
  File "main.py", line 705, in MainLoop
    while not aiWrapper.isPlaying():
  File "main.py", line 107, in isPlaying
    result = liqiProto.parse(flow_msg)
  File "C:\Desktop\MajsoulAI\majsoul_wrapper\liqi.py", line 84, in parse
    proto_domain = self.jsonProto['nested'][lq]['nested'][service]['methods'][rpc]
KeyError: 'fetchLastPrivacy'

NotADirectoryError: [WinError 267] 目录名称无效。

从运行到报错的所有过程如下:
(venv) C:\Users\ASUS>python D:\MajsoulAI-master\main.py
waiting to calibrate the browser location
Number of good matches: 1056
Homography Matrix: [[ 7.10571639e-01 -1.45690154e-03 -6.29690002e-01]
[-4.85931031e-04 7.08416136e-01 1.82045108e+02]
[-8.68727350e-07 -1.36823215e-06 1.00000000e+00]]
Similarity: 0.9993328382910734
create AI subprocess locally
Traceback (most recent call last):
File "D:\MajsoulAI-master\main.py", line 744, in
MainLoop(level=level)
File "D:\MajsoulAI-master\main.py", line 676, in MainLoop
creationflags=CREATE_NEW_CONSOLE)
File "d:\program files (x86)\microsoft visual studio\shared\python37_64\lib\subprocess.py", line 800, in init
restore_signals, start_new_session)
File "d:\program files (x86)\microsoft visual studio\shared\python37_64\lib\subprocess.py", line 1207, in _execute_child
startupinfo)
NotADirectoryError: [WinError 267] 目录名称无效。

请问一直无法识别窗口可能是什么问题呢

雀魂已经进入对局,处于屏幕最前端,大小为75%窗口大小,分辨率1920*1080,放缩125%,一直显示如下log

PS H:\majsoul\majsoul_wrapper-master> python3 main.py
waiting to calibrate the browser location
Number of good matches: 9
Not enough matches are found - 9/50
majsoul menu not found, calibrate again
Number of good matches: 11
Not enough matches are found - 11/50
majsoul menu not found, calibrate again
Number of good matches: 11
Not enough matches are found - 11/50
majsoul menu not found, calibrate again
Number of good matches: 12
Not enough matches are found - 12/50
majsoul menu not found, calibrate again
Number of good matches: 3
Not enough matches are found - 3/50
majsoul menu not found, calibrate again
Number of good matches: 3
Not enough matches are found - 3/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again
Number of good matches: 3
Not enough matches are found - 3/50
majsoul menu not found, calibrate again
Number of good matches: 8
Not enough matches are found - 8/50
majsoul menu not found, calibrate again
Number of good matches: 10
Not enough matches are found - 10/50
majsoul menu not found, calibrate again
Number of good matches: 12
Not enough matches are found - 12/50
majsoul menu not found, calibrate again
Number of good matches: 12
Not enough matches are found - 12/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again
Number of good matches: 6
Not enough matches are found - 6/50
majsoul menu not found, calibrate again
Number of good matches: 9
Not enough matches are found - 9/50
majsoul menu not found, calibrate again
Number of good matches: 10
Not enough matches are found - 10/50
majsoul menu not found, calibrate again
Number of good matches: 7

#此处以下进入对局

Not enough matches are found - 7/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again
Number of good matches: 2
Not enough matches are found - 2/50
majsoul menu not found, calibrate again
Number of good matches: 6
Not enough matches are found - 6/50
majsoul menu not found, calibrate again
Number of good matches: 7
Not enough matches are found - 7/50
majsoul menu not found, calibrate again
Number of good matches: 16
Not enough matches are found - 16/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again
Number of good matches: 17
Not enough matches are found - 17/50
majsoul menu not found, calibrate again
Number of good matches: 10
Not enough matches are found - 10/50
majsoul menu not found, calibrate again
Number of good matches: 10
Not enough matches are found - 10/50
majsoul menu not found, calibrate again
Number of good matches: 13
Not enough matches are found - 13/50
majsoul menu not found, calibrate again
Number of good matches: 8
Not enough matches are found - 8/50
majsoul menu not found, calibrate again
Number of good matches: 9
Not enough matches are found - 9/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again
Number of good matches: 7
Not enough matches are found - 7/50
majsoul menu not found, calibrate again
Number of good matches: 5
Not enough matches are found - 5/50
majsoul menu not found, calibrate again

#按下ctrl+c

Traceback (most recent call last):
File "main.py", line 742, in
MainLoop(level=level)
File "main.py", line 669, in MainLoop
time.sleep(3)
KeyboardInterrupt
PS H:\majsoul\majsoul_wrapper-master>

win rate有点低

挂了一天分数没怎么变。。有什么方法能提高胜率吗?

强迫关闭

[WinError 10054] 远程主机强迫关闭了一个现有的连接。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.