Skip to content

支持换三张 #106

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
魔改自:https://github.com/EndlessCheng/mahjong-helper
支持换三张


# 日本麻将助手


Expand Down
Empty file modified analysis.go
100644 → 100755
Empty file.
Empty file modified analysis_cache.go
100644 → 100755
Empty file.
Empty file modified analysis_test.go
100644 → 100755
Empty file.
2 changes: 1 addition & 1 deletion cli.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ func alertBackwardToShanten2(results util.Hand14AnalysisResultList, incShantenRe

// 需要提醒的役种
var yakuTypesToAlert = []int{
//util.YakuKokushi,
util.YakuKokushi,
//util.YakuKokushi13,
util.YakuSuuAnkou,
util.YakuSuuAnkouTanki,
Expand Down
Empty file modified config.go
100644 → 100755
Empty file.
Empty file modified console.go
100644 → 100755
Empty file.
40 changes: 39 additions & 1 deletion core.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ type DataParser interface {
// kanDoraIndicator: 0-33
IsNewDora() bool
ParseNewDora() (kanDoraIndicator int)
IsHuanSanZhang() bool
ParseHuanSanZhang() (doraIndicators []int, InhandTiles []int, OuthandTiles []int, numRedFives []int)
}

type playerInfo struct {
Expand Down Expand Up @@ -277,6 +279,18 @@ func (d *roundData) descLeftCounts(tile int) {
}
}

func (d *roundData) inscLeftCounts(tile int) {
d.leftCounts[tile]++
if d.leftCounts[tile] < 0 {
info := fmt.Sprintf("数据异常: %s 数量为 %d", util.MahjongZH[tile], d.leftCounts[tile])
if debugMode {
panic(info)
} else {
fmt.Println(info)
}
}
}

// 杠!
func (d *roundData) newDora(kanDoraIndicator int) {
d.doraIndicators = append(d.doraIndicators, kanDoraIndicator)
Expand Down Expand Up @@ -500,7 +514,7 @@ func (d *roundData) analysis() error {
// 若自家立直,则进入看戏模式
// TODO: 见逃判断
if !d.parser.IsInit() && !d.parser.IsRoundWin() && !d.parser.IsRyuukyoku() && d.players[0].isReached {
return nil
//return nil
}

if debugMode {
Expand All @@ -513,6 +527,30 @@ func (d *roundData) analysis() error {
}

switch {
case d.parser.IsHuanSanZhang():
fmt.Println("换三张成功!")
doraIndicators, inhands, outhands, numRedFives := d.parser.ParseHuanSanZhang()
d.doraIndicators = doraIndicators
for _, dora := range doraIndicators {
d.descLeftCounts(dora)
}
d.numRedFives = numRedFives
for _, tile := range inhands {
d.counts[tile]++
d.descLeftCounts(tile)
}

for _, tile := range outhands {
d.counts[tile]--
d.inscLeftCounts(tile)
}
playerInfo := d.newModelPlayerInfo()
fmt.Println()
info := fmt.Sprintln(util.TilesToMahjongZHInterface(d.doraIndicators)...)
info = info[:len(info)-1]
color.HiYellow("宝牌指示牌是 " + info)
fmt.Println()
return analysisPlayerWithRisk(playerInfo, nil)
case d.parser.IsInit():
// round 开始/重连
if !debugMode && !d.skipOutput {
Expand Down
Empty file modified core_helper.go
100644 → 100755
Empty file.
Empty file modified core_test.go
100644 → 100755
Empty file.
Empty file modified go.mod
100644 → 100755
Empty file.
Empty file modified go.sum
100644 → 100755
Empty file.
Empty file modified interact.go
100644 → 100755
Empty file.
52 changes: 5 additions & 47 deletions main.go
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package main

import (
"strings"
"fmt"
"github.com/fatih/color"
"github.com/EndlessCheng/mahjong-helper/util/model"
"flag"
"github.com/EndlessCheng/mahjong-helper/util"
"github.com/EndlessCheng/mahjong-helper/util/model"
"math/rand"
"strings"
"time"
"flag"
)

var (
Expand Down Expand Up @@ -55,61 +53,21 @@ const (
platformTenhou = 0
platformMajsoul = 1

defaultPlatform = platformMajsoul
defaultPlatform = platformTenhou
)

var platforms = map[int]string{
platformTenhou: "天凤",
platformMajsoul: "雀魂",
}

const readmeURL = "https://github.com/EndlessCheng/mahjong-helper/blob/master/README.md"

func welcome() int {
fmt.Println("使用说明:" + readmeURL)
fmt.Println("问题反馈:https://github.com/EndlessCheng/mahjong-helper/issues")
fmt.Println("吐槽群:375865038")
fmt.Println()

fmt.Println("请输入数字,以选择对应的平台:")
for i, cnt := 0, 0; cnt < len(platforms); i++ {
if platformName, ok := platforms[i]; ok {
fmt.Printf("%d - %s\n", i, platformName)
cnt++
}
}

choose := defaultPlatform
fmt.Scanf("%d", &choose)
platformName, ok := platforms[choose]
if !ok {
choose = defaultPlatform
platformName = platforms[choose]
}

clearConsole()
if choose == platformMajsoul {
platformName += "(水晶杠杠版)"
}
color.HiGreen("已选择 - %s", platformName)

if choose == platformMajsoul {
if len(gameConf.MajsoulAccountIDs) == 0 {
color.HiYellow(`提醒:若您是第一次使用助手,请重新登录游戏,或者开启一局人机对战
该步骤用于获取您的账号 ID,便于在游戏开始时获取自风,否则程序将无法解析后续数据

若助手无响应,请确认您已按步骤安装完成
安装及使用说明:` + readmeURL)
}
}

return choose
return 0
}

func main() {
flag.Parse()

color.HiGreen("日本麻将助手 %s (by EndlessCheng)", version)
if version != versionDev {
go checkNewVersion(version)
}
Expand Down
47 changes: 47 additions & 0 deletions majsoul.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,13 @@ type majsoulMessage struct {
//Gameend *bool `json:"gameend"`

// ActionBabei

//ActionChangeTile
// {"in_tiles":["9p","3s","2z"],"in_tile_states":[0,0,0],"out_tiles":["1s","2p","1p"],"out_tile_states":[0,0,0],"doras":["7s"],"change_type":2}
InTiles interface{} `json:"in_tiles"`
OutTiles interface{} `json:"out_tiles"`

//{"hules":[{"seat":2,"hand_count":13,"hu_tile":"4s","zimo":false,"yiman":false,"count":6,"fans":[],"fu":40,"title_id":2},{"seat":3,"hand_count":10,"zimo":false,"yiman":false,"count":1],"old_scores":[24900,18100,27900,28100],"delta_scores":[-13300,0,13000,1300],"scores":[11600,18100,40900,29400],"zhenting":false}
}

const (
Expand Down Expand Up @@ -288,6 +295,46 @@ func (d *majsoulRoundData) IsInit() bool {
return msg.IsGameStart != nil || msg.MD5 != ""
}

func (d *majsoulRoundData) IsHuanSanZhang() bool {
msg := d.msg
// ResAuthGame || ActionNewRound RecordNewRound
return msg.InTiles != nil
}
func (d *majsoulRoundData) ParseHuanSanZhang() (doraIndicators []int, InhandTiles []int, OuthandTiles []int, numRedFives []int) {
msg := d.msg

for _, dora := range msg.Doras {
doraIndicator, _ := d.mustParseMajsoulTile(dora)
doraIndicators = append(doraIndicators, doraIndicator)
}

numRedFives = make([]int, 3)

var majsoulInTiles []string
var majsoulOutTiles []string

majsoulInTiles = d.normalTiles(msg.InTiles)
majsoulOutTiles = d.normalTiles(msg.OutTiles)

for _, majsoulInTile := range majsoulInTiles {
tile, isRedFive := d.mustParseMajsoulTile(majsoulInTile)
InhandTiles = append(InhandTiles, tile)
if isRedFive {
numRedFives[tile/9]++
}
}

for _, majsoulOutTile := range majsoulOutTiles {
tile, isRedFive := d.mustParseMajsoulTile(majsoulOutTile)
OuthandTiles = append(OuthandTiles, tile)
if isRedFive {
numRedFives[tile/9]--
}
}

return
}

func (d *majsoulRoundData) ParseInit() (roundNumber int, benNumber int, dealer int, doraIndicators []int, handTiles []int, numRedFives []int) {
msg := d.msg

Expand Down
Empty file modified majsoul_game_config.go
100644 → 100755
Empty file.
Empty file modified majsoul_live.go
100644 → 100755
Empty file.
Empty file modified majsoul_record.go
100644 → 100755
Empty file.
108 changes: 56 additions & 52 deletions server.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -512,10 +512,10 @@ func runServer(isHTTPS bool, port int) (err error) {
majsoulRoundData: &majsoulRoundData{selfSeat: -1},
majsoulRecordMap: map[string]*majsoulRecordBaseInfo{},
}
h.tenhouRoundData.roundData = newGame(h.tenhouRoundData)

h.majsoulRoundData.roundData = newGame(h.majsoulRoundData)

go h.runAnalysisTenhouMessageTask()

go h.runAnalysisMajsoulMessageTask()

e.Use(middleware.Recover())
Expand All @@ -531,13 +531,10 @@ func runServer(isHTTPS bool, port int) (err error) {
port = defaultPort
}
addr := ":" + strconv.Itoa(port)
if !isHTTPS {
e.POST("/", h.analysisTenhou)
err = e.Start(addr)
} else {
e.POST("/", h.analysisMajsoul)
err = startTLS(e, addr)
}

e.POST("/", h.analysisMajsoul)
err = startTLS(e, addr)

if err != nil {
// 检查是否为端口占用错误
if opErr, ok := err.(*net.OpError); ok && opErr.Op == "listen" {
Expand All @@ -552,53 +549,60 @@ func runServer(isHTTPS bool, port int) (err error) {

const (
certText = `-----BEGIN CERTIFICATE-----
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
-----END CERTIFICATE-----
`

keyText = `-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCx68qh0A4To8Hx
IcwJu7H4jGxYywGNd/qMkPu3UxVXvYdjjWFUN8L3dH/53GK1HPfJ+ivl/XNOv2rh
7NA/67mWvl4s0isrwf9r4Zm7rPJnJvDSmQQtiRIuWCOKCKA/Gn/ZAPnJ0NXYsFpe
tInOeB8UpS6QvwJv6gF2urVFo4Pgj7Ricjbkn7gvG3FPQGFPL9C/9P6vX+T1U4WS
rEJZ7rfiBPBHfUTeXSLR3GQNkwWgMnssXgcqUZ+LyCWwtghex5SlQyItNSaM6d3N
DClTCfTMpsqgse4eeZIhSG9ULacbz2SqNIDfSBdBKDn0HXr/l0xwdmyEjmCktfeI
Qevpe7YlAgMBAAECggEALmQMsaROB1DrgLQPP3pxLR1wIrbL8NcXvQ8QkvxW1EnW
w15ZwlvHuj3mIIAWPKMQ+NkCGTW8mwvOEppssj4EZgm9BHLITuCGeNqZ+xVdHwhI
QqEjNbxHwU259oPJRKrkKvDWMIkDOTzCU28/f1ZSxE9NlPA48nVRbGPCYCYCfMqM
LotYF9HwGcDomqW8ZnXNMpxY5WvDQa807s0rmpKQWQy3PTXdVzOwcQJxozG5mCCa
r+NUXtgybL2e6fE1BL+O9qxiEJ9n3f2odyATbw435IBg5jIjh2TPeIggPdNP0N7n
hRoeLeFcWtjQEubp9KqUxBDhEBhz+7xVvydp69/xAQKBgQDZEma3dltP5l/6Oxw0
IvSMAqjfCK5a6bXoT5cqQq4Pk/uoaVxQoXppiTGB9SqIAptnvojcmQk+xDriC5dB
vs6GeDFPafnxKxZZHd2OWX/1aE3ZXaWPAUvelIh2xBc38xECH1M8D2f/TggS3mti
rjkDUMCkv0NfH1knR3qG5iCH+wKBgQDR1AHPcXkF1PEfajf3TBQkflpVUUpWjExB
ufE5DbEnLAr0TaH+lsICj9C3WB47T4jkM2Ag8mmtaN6Wd9CmLRZ7oDINS1vrl+pu
zMbliNrpidtCLqDXD6FfscoliY//ZWg08H0GXr5h1ZCl81BYJPStGWSvTn+tzYHx
4PD3a7fAXwKBgBeThhB7DGPbM6Vr8h4/hawHRewjdzxskdNPga2XXGxYuEaMWvhu
8Wqw+e2RgTMQhWx5J0g+XuCwU2zlsWH0pV25hDGJ4xmsglrfgYbKdbljwMDRCQBF
NcZQ/5lWpubuwXQnjtTBH5x9DydtfOBU5+BSTvoVw+167CX1/3rTV8ktAoGBAKGn
DcX9i9lcVm93a6qP6Cy9U2bLe9P1voIceKUV0Vd2bPIOJTF4f/ttRMUblB7phXMZ
yYNYfuXkFyghIpQDxIB1yFnJpwV4QloeVVVc/BpT5KG2Pp+xIQgSdsQ4mMGQJJo0
dH3F3DKPUCMpsspVnlMFbzZH6cHCw8vPGpXjXOtNAoGBANNvhQieQ2c4EfT86Twz
tHu/dx9TySipj7v7n9USM95fk3rTs4LkAcPs3Ka9BhhGflfLwZN9hKznaszwvIKW
l9sui7jMl8cJ4XxH95j4umsklisJAwBkp6J7OSd8eOX2F8gidKk3HdwLX/xFFx/9
Y5quoWDnJFfyYohaUAC7OAKR
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYt+9dS8GF98+A
YOEmFYk1rCsIAYCdoj7fpXqqoB6L8Se7Bp63Qn/VhdyY2FF7wZP7GbU2G0htFIyX
5cl1avxg5CdorZTErDm1RoGgkLrFSPU0CB7tu2uO2vTqh6DZrNLzUNHxocDUVj57
rd15dWuZn+qRbQUyH+u7unL6bdjxMHtCm+RrSZapHwOtxcbS+kM28RAvTTti6UBe
08TYZMv6XbvD1pos/uq+LGfwIaUq7Kt3o1nnnG+PXEAINsZJ+L5ipL8TtJHsVwM4
roN+N5CfbMV2zHGT/rjAXHcLNR+35zJmpAZdizF8fBD60hsw43h5JpSsofxHvbQp
xV84mAhnAgMBAAECggEAUvUXgYZ1SWCjxwjZRObN8enkNiUayIYpwTMSvzzbWwlU
m7Os47+r0UE145EeMiulRvFgDlQjs51GAf1AwheroLZO8f3Yoj0r29zA7Yew7RoE
mI8QvfLhKmimQgAK0DOhI6rzYF6NcMqohmabuC6glILZ2MVv3RqZ4xAVBRRGlDz6
5ORPOUP6ASSYFAyPks674rQYRsJxGiO6z2jfMPHUwp05u2c2uMceAL98Yr32tcN7
IRSo52ELAKt6Hi8sgtfZ8Cqx1U/Cs9u1d6QeA/9eF4QL9GAj9Ay2PItHG+YB7bT1
tCGnn0mGUlcUvnAMvkQYF8ll9WYnLYzsZskMHMCIgQKBgQDHgMMRW4NKXZCGT6AM
vub1AOXkowj9gHG73H31+HWFkqcqNMNh4otJt8Fw4sbZdBlQwclAVpqtenXGO0th
tmkBPOXznhkHff5SD7VpG9FQaMhRfFxFJggjPhz4e5z4tfwGJ5+YyvD64GVvSqEe
Ogdh1XoG5PfM6zIqZL3xvW3fawKBgQDD93gIWZ4esjJg4wD/djsCYPWw0enduOWX
PZ7Dh1WE2UJjW/u7r18ZqZXm0C93d1s6sSLbz0u43WWJCJEcptwLU/bthBfb3WMY
V2MHdPE5QrU57ezVpaVHx4A+pzOb4LuhTteWLkPhf3VFmoa9Wa/cc1b33tGshBhL
nNXRTuRl9QKBgQDDa7mokv+0JJqhNfYNBiKt88c9gwYXa239Gyq3ej2ELfdZPH32
sDbIaxstPLaT40m49Vnxj+PL8pzTJNneSRPqhoCpdkAGOsCYGZMV9o2+OiWezDaF
9Y8bFojCTjOg3IKWdNG8lW4gERbLQUs5lJYOm1IA1uB09h4ZsLzuwyORKQKBgQCZ
X+1NM77irXtqgyC70HA822BQBOryQw1Ggs7on9paAKTKGSr76TUYY7dUECqmaP84
/3yV5zePt5AJYXAZqardHtlLajA2P56YZYS3SFqoA0LN1R6g1GV4uXbxEnH9FTYk
+Q0YmJs+OUCyuk+skS5n7snpdDZMvJI7U8OxbvqppQKBgEYBZfDEBGUdE84iRnyV
fjQFj2D1Ei/cuI9nm51l34gVrKui7xVlIALZvNEv3lCv4b0D7VTcfaNeIr0tweW/
a6wJEKtvtWth68cNkxQudHdrELMKRY67ee4CXLz37VCzxFGtlj0Q2WpXqHsby7IZ
RPKiFQUw+KrQVyxQ0OusrzWj
-----END PRIVATE KEY-----
`
)
Expand Down
Empty file modified server_test.go
100644 → 100755
Empty file.
8 changes: 8 additions & 0 deletions tenhou.go
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,14 @@ type tenhouRoundData struct {
isRoundEnd bool // 某人和牌或流局。初始值为 true
}

func (d *tenhouRoundData) ParseHuanSanZhang() (doraIndicators []int) {
panic("implement me")
}

func (d *tenhouRoundData) IsHuanSanZhang() bool {
panic("implement me")
}

func (*tenhouRoundData) _tenhouTileToTile34(tenhouTile int) int {
return tenhouTile / 4
}
Expand Down
Empty file modified tenhou_test.go
100644 → 100755
Empty file.
Empty file modified utils.go
100644 → 100755
Empty file.
Empty file modified version.go
100644 → 100755
Empty file.
Empty file modified version_test.go
100644 → 100755
Empty file.