吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10352|回复: 264
收起左侧

[原创工具] PC单机版闲鱼麻将v1.0b,支持AI对战、多种难度、语音播报、番型计算~支持win10/11

    [复制链接]
Flanders 发表于 2026-6-4 15:42
PC单机版闲鱼麻将v1.0b,支持和AI对战、多难度、语音播报、番型计算~

start.jpg



【软件界面】

       前阵子熟悉了pygame框架,最近看北京亲戚打麻将都是带“桧”即“红中”的打法,看市面上还没有关于红中麻将的游戏玩法,于是突发奇想用pygame做一版PC单机的,便创作了这款小游戏。
ui.jpg
win.jpg



【注意事项】
1、使用快捷键时,需要把输入法切换到英文。
2、首次运行时,需要等待一段时间即可进入游戏。

【操作步骤】

快捷按键&功能&状态:


1、D / Enter:摸牌 / 出牌 | 对局中
2、← / →:选择手牌 | 出牌阶段
3、P:碰 | 可碰时
4、G: 杠 | 可杠时
5、空格 / ESC:过 | 等待操作时
6、H: 胡牌 | 可胡时
7、3 / Enter: 再来一局 | 结算界面
8、同时也支持鼠标点击操作

【使用教程】


1、癞子牌红中作为万能癞子,可替代任意牌;
2、其他规则不再敖述,玩过麻将的朋友都知道;




^_^ 分享给大家,没事来两局,主打一个修仙娱乐。欢迎大家继续提出宝贵改进意见,后期有时间会继续迭代完善,觉得好玩的朋友麻烦挥挥小手给个热心吧~



【免责声明】


本游戏背景图片、牌面、美女俊男人物头像、语音均由ai及免费开源模型制作生成,仅供学习和个人娱乐使用,请勿商用或用于其他非法目的。




【下载地址】(猛戳这里):
https://wwbmd.lanzout.com/iyzhW3r3ym2h
密码:917t

免费评分

参与人数 93吾爱币 +98 热心值 +84 收起 理由
zhongyihaitun + 1 谢谢@Thanks!
纯音乐 + 1 + 1 有没有 宠物连连看这种游戏的单机版 不限时的
火令2020 + 1 + 1 用心讨论,共获提升!
qq87700906 + 1 + 1 能做个作弊的工具吗 打不过AI
感悟 + 1 谢谢@Thanks!
对味 + 1 + 1 谢谢@Thanks!
Wyljj + 1 + 1 我很赞同!
yyb414 + 1 + 1 热心回复!
chinasongziming + 1 鼓励转贴优秀软件安全工具和文档!
jie520yun + 1 + 1 我很赞同!
Eddie-sjm + 1 + 1 我很赞同!
swen.tan + 1 热心回复!
wzywxi + 1 + 1 谢谢@Thanks!
q7122581 + 1 我很赞同!
Undefine + 1 热心回复!
andyfeifei + 1 + 1 我很赞同!
循环水 + 1 + 1 热心回复!
wqx520 + 1 + 1 谢谢@Thanks!
ljq0527 + 1 谢谢@Thanks!
陌宇尘 + 1 谢谢@Thanks!
wangyongdesign + 1 + 1 谢谢@Thanks!
风雨008 + 1 + 1 谢谢@Thanks!
叶樱枫 + 1 + 1 谢谢@Thanks!
confiant + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dahan531 + 1 + 1 我很赞同!
fengzhongdexin + 1 + 1 我很赞同!
logafo + 1 + 1 谢谢@Thanks!
twomoon + 1 + 1 谢谢@Thanks!
molazbyc + 1 + 1 谢谢@Thanks!
sodark + 1 + 1 看打的牌眼花
HuLZ2006 + 1 + 1 我很赞同!
w19890614 + 1 + 1 谢谢@Thanks!
maoweigeda2025 + 1 + 1 谢谢@Thanks!
klmytwb + 1 + 1 谢谢@Thanks!
seezheword + 1 + 1 热心回复!
741852waholzk + 1 + 1 我很赞同!
ymhoho + 2 + 1 谢谢@Thanks!
and11 + 1 + 1 谢谢@Thanks!
longwangv1 + 1 + 1 谢谢@Thanks!
zj_tj + 1 + 1 我很赞同!
gym66777 + 1 + 1 谢谢@Thanks!
shaunkelly + 1 + 1 我很赞同!
恶念 + 1 + 1 谢谢@Thanks!
18898589561 + 1 + 1 我很赞同!
icy0012 + 1 + 1 谢谢@Thanks!
smallscrew + 1 谢谢@Thanks!
Cmzlwc + 1 + 1 谢谢@Thanks!
开心熊猫741 + 1 + 1 热心回复!
kuangshen133 + 1 + 1 谢谢@Thanks!
zjdals + 1 + 1 我很赞同!
xiaobailoulou + 1 + 1 谢谢@Thanks!
gunxsword + 1 + 1 热心回复!
Gsn. + 1 + 1 谢谢@Thanks!
zhyasi + 1 + 1 谢谢@Thanks!
luo2qiang + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
david9999 + 1 谢谢@Thanks!
打不过就加入 + 1 + 1 谢谢@Thanks!
天天上天庭 + 1 + 1 谢谢@Thanks!
nana5212 + 1 + 1 谢谢@Thanks!
jy00812995 + 1 + 1 谢谢@Thanks!
shishi0655 + 1 + 1 谢谢@Thanks!
mainid + 1 + 1 热心回复!
carlshi + 1 + 1 谢谢@Thanks!
fei0415 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
bfgxp + 1 + 1 我很赞同!
小师叔 + 1 + 1 用心讨论,共获提升!
mwxrr + 1 + 1 谢谢@Thanks!
hzzq2018 + 1 + 1 用心讨论,共获提升!
Blueyes + 1 + 1 我很赞同!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
jmz14865220 + 1 + 1 我很赞同!
g123458 + 1 + 1 谢谢@Thanks!
btdodo + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
mysy1108 + 1 + 1 谢谢@Thanks!
game0128 + 1 + 1 有个巨大BUG,可以一直摸牌,只要你够快,牌都让你摸完!
nidecunzai + 1 + 1 谢谢@Thanks!
jumpbull + 2 + 1 我很赞同!
blywq + 1 + 1 谢谢@Thanks!
mryouan + 1 + 1 我很赞同!
浓茶 + 1 + 1 热心回复!
huixiaochuna + 1 + 1 这款自创软件可以登上如今吾爱的顶峰了!
YYL7535 + 1 + 1 谢谢@Thanks!
grrr_zhao + 1 + 1 谢谢@Thanks!
wang82530 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
诸葛文诚 + 1 + 1 谢谢@Thanks!
清淡如风 + 1 + 1 我很赞同!
xiaoyu2032 + 1 有问题,我打八筒,别人碰回去变成了6条。。。。。。
wanfon + 1 + 1 热心回复!
thinkineye + 1 + 1 谢谢@Thanks!
e2003919 + 1 + 1 谢谢@Thanks!
yelloroad666 + 1 + 1 热心回复!
geliang715 + 1 + 1 谢谢@Thanks!
qjlfl + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Flanders 发表于 2026-6-4 15:58
zadmg 发表于 2026-6-4 15:51
能不能单独发一个帖子讲解下其中Ai部分的思路?

[Asm] 纯文本查看 复制代码
"""
AI策略
多难度级别 + 防守策略 + 手牌效率分析
"""
from collections import Counter
from engine.hu_checker import HuChecker
from engine.config import AI_CONFIG

class MahjongAI:
    def __init__(self, difficulty=None):
        self.difficulty = difficulty or AI_CONFIG['difficulty']
        self.enable_defense = AI_CONFIG['enable_defense']

    def choose_discard(self, hand, river=None, dangerous_tiles=None):
        """
        选择打出的牌
        hand: 当前手牌
        river: 全局牌河(用于防守)
        dangerous_tiles: 危险牌列表
        """
        if self.difficulty == 'easy':
            return self._easy_strategy(hand)
        elif self.difficulty == 'hard':
            return self._hard_strategy(hand, river, dangerous_tiles)
        else:  # normal
            return self._normal_strategy(hand, river, dangerous_tiles)

    def _easy_strategy(self, hand):
        """简单策略:随机打出,优先打边张"""
        # 简单权重:红中最后打,数字大的优先打
        weights = {}
        for t in hand:
            score = 0
            if hand.count(t) >= 2:
                score += 8  # 对子留着
            if t == '中':
                score += 15  # 红中最后打
            # 数字大的优先打(简化)
            if t != '中':
                score -= int(t[0])
            weights[t] = score
        return min(weights, key=weights.get)

    def _normal_strategy(self, hand, river=None, dangerous_tiles=None):
        """中等策略:计算手牌效率,适当防守"""
        best_tile = None
        best_score = -99999

        # 尝试打出每一张牌,计算打后的听牌距离
        for tile in set(hand):
            test_hand = [t for t in hand if t != tile or (t == tile and hand.index(t) != hand.index(tile))]
            # 确保只移除一张
            test_hand = hand.copy()
            if tile in test_hand:
                test_hand.remove(tile)

            score = self._evaluate_hand(test_hand)

            # 防守扣分:危险牌额外扣分
            if self.enable_defense and dangerous_tiles and tile in dangerous_tiles:
                score -= 20

            # 牌河出现次数少的少打(生张扣分)
            if river and river.count(tile) <= 1:
                score -= 3

            if score > best_score:
                best_score = score
                best_tile = tile

        return best_tile or hand[0]

    def _hard_strategy(self, hand, river=None, dangerous_tiles=None):
        """困难策略:精确计算听牌数,强力防守"""
        best_tile = None
        best_ting_count = -1
        best_score = -99999

        for tile in set(hand):
            test_hand = hand.copy()
            if tile in test_hand:
                test_hand.remove(tile)

            # 计算打这张后听牌的数量
            ting_count = len(HuChecker.waiting_tiles(test_hand))

            # 手牌效率分
            eff_score = self._evaluate_hand(test_hand)

            # 综合评分:听牌数优先,其次效率分
            total_score = ting_count * 100 + eff_score

            # 强力防守:危险牌打了直接大扣分
            if self.enable_defense and dangerous_tiles and tile in dangerous_tiles:
                total_score -= 1000

            # 生张扣分更严
            if river and river.count(tile) == 0:
                total_score -= 10

            if total_score > best_score:
                best_score = total_score
                best_ting_count = ting_count
                best_tile = tile

        return best_tile or hand[0]

    def _evaluate_hand(self, hand):
        """评估手牌价值(越高越好)"""
        # 已经听牌,满分
        if HuChecker.is_tingpai(hand):
            return 1000

        score = 0
        cnt = Counter(hand)
        wild = hand.count('中')

        # 对子数量
        pairs = sum(1 for k, v in cnt.items() if v >= 2 and k != '中')
        score += pairs * 15
        # 刻子数量
        trips = sum(1 for k, v in cnt.items() if v >= 3 and k != '中')
        score += trips * 30
        # 杠数量
        kongs = sum(1 for k, v in cnt.items() if v >= 4 and k != '中')
        score += kongs * 50
        # 红中数量
        score += wild * 20

        # 顺子潜力检测
        score += self._check_sequence_potential(hand) * 5

        return score

    def _check_sequence_potential(self, hand):
        """检测顺子潜力"""
        potential = 0
        nums = {'万': [], '条': [], '筒': []}

        for t in hand:
            if t == '中':
                continue
            for suit in ['万', '条', '筒']:
                if t.endswith(suit):
                    num = int(t[0])
                    nums[suit].append(num)
                    break

        for suit in ['万', '条', '筒']:
            nlist = sorted(nums[suit])
            # 检测连牌
            for i in range(len(nlist) - 1):
                if nlist[i+1] - nlist[i] == 1:
                    potential += 2  # 两张连
                elif nlist[i+1] - nlist[i] == 2:
                    potential += 1  # 卡张

        return potential

    def evaluate(self, hand):
        """简单评估"""
        if HuChecker.can_hu(hand):
            return 999
        pairs = len(set([x for x in hand if hand.count(x) >= 2]))
        return pairs

    def get_dangerous_tiles(self, river, player_melds=None):
        """
        推断可能的危险牌
        用于AI防守决策
        """
        dangerous = set()

        # 牌河中出现少的是危险牌
        cnt = Counter(river)
        for tile, count in cnt.items():
            if count == 0 and tile != '中':
                dangerous.add(tile)

        # 根据玩家碰杠推测危险牌
        if player_melds:
            peng_tiles = [m['tile'] for m in player_melds if m['type'] == '碰']
            for t in peng_tiles:
                # 碰了某张,可能在做清一色
                suit = t[-1] if t != '中' else None
                if suit:
                    for i in range(1, 10):
                        dangerous.add(f'{i}{suit}')

        return list(dangerous)

    def decide_peng_gang(self, hand, tile, my_melds):
        """
        决定是否碰/杠
        返回: 'peng', 'gang', None
        """
        count = hand.count(tile)

        # 可以杠的情况
        if count >= 3:
            if self.difficulty in ('normal', 'hard'):
                # 碰了之后容易听牌就杠
                return 'gang'
            else:
                return 'gang' if count >= 3 else None

        # 可以碰的情况
        if count >= 2:
            if self.difficulty == 'easy':
                return 'peng'  # 简单模式有碰就碰
            elif self.difficulty == 'normal':
                # 中等模式:听牌附近碰
                test_hand = [t for t in hand if t != tile]
                test_hand = test_hand[:-1]  # 移除两张
                if HuChecker.is_tingpai(test_hand):
                    return 'peng'
                return 'peng' if len(my_melds) >= 1 else None
            else:
                # 困难模式:计算碰后的效率
                test_hand = hand.copy()
                test_hand.remove(tile)
                test_hand.remove(tile)
                before = self._evaluate_hand(hand)
                after = self._evaluate_hand(test_hand)
                return 'peng' if after >= before else None

        return None

    def set_difficulty(self, difficulty):
        """设置难度"""
        self.difficulty = difficulty

点评

谢谢,学习  发表于 2026-6-4 18:57

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
oopoo + 1 我很赞同!
福森108 + 1 + 1 谢谢@Thanks!

查看全部评分

hh3100 发表于 2026-6-4 23:14
本帖最后由 hh3100 于 2026-6-5 00:04 编辑

玩了几局了,好玩。
为什么不给我自摸胡牌列?我那么好的牌

点评

碰杠后不能胡牌,只能自摸胡牌,看左下角提示:应该是你碰过或者杠过了,必须打一张,再接到能胡的才会系统判定胡牌。  发表于 2026-6-5 16:10
long88888888 发表于 2026-6-4 15:51
small龙 发表于 2026-6-4 15:54
可惜了,不支持win7 “错误 无法加载Python DLL C:\ Users \ ADMINI ~ 1 \ AppData \ Local \ TempL _ mei 67602 \ python 31 3 . dll '。 LoadLibrary: <FormatMessageW失败。>”
liuzumeng 发表于 2026-6-4 15:49
这家个好玩,值得一试
zadmg 发表于 2026-6-4 15:51
能不能单独发一个帖子讲解下其中Ai部分的思路?
hongshao987 发表于 2026-6-4 15:57
谢谢分享。请问有没有PC电脑版的单机无需联网的的广东麻将游戏 就是有鬼 可以 鸡 平 的那种 家里老人无聊在家 想下载给他玩一下 先谢为敬,为什么不能是联网版的 因为现在联网的东西太多扣费陷阱  而且他又不会用智能手机 你们懂的 老人嘛
canghaisui 发表于 2026-6-4 15:59
谢谢分享,这个娱乐一下方便
 楼主| Flanders 发表于 2026-6-4 16:00
small龙 发表于 2026-6-4 15:54
可惜了,不支持win7 “错误 无法加载Python DLL C:\ Users \ ADMINI ~ 1 \ AppData \ Local \ TempL _ mei  ...

win老版本不推荐食用,适配难度较大
yaorongbaobao 发表于 2026-6-4 16:01
看着不错啊,WIN7能玩吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-8 04:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表