用Python写一个“麻将胡了”游戏,教你用编程玩转传统娱乐!
你有没有想过,把小时候在老家打麻将的快乐,搬到电脑屏幕上?不是靠运气,而是靠你的代码!我就带大家用Python写一个简单的“麻将胡了”小游戏——它不仅能让你重温童年记忆,还能锻炼逻辑思维、提升编程能力,无论你是编程新手,还是想尝试趣味项目的老手,这篇文章都能带你一步步实现这个看似复杂实则有趣的项目。
为什么选“麻将胡了”?
麻将是中国最具代表性的传统游戏之一,讲究策略、计算和心理博弈,但现实中,找人凑局不容易,而且规则繁杂,如果我们能用代码模拟出一套完整的麻将逻辑,不仅方便随时玩,还能扩展成多人在线版本(比如微信小程序或网页版),简直是一举多得!
准备工作:Python基础+几个小库
你需要安装Python 3.8以上版本,并确保已安装numpy用于数组处理,以及random用于洗牌和发牌,如果还没装,直接运行:
pip install numpy
核心逻辑拆解:
代码实现(简化版):
我先给你一个可运行的最小原型:
import random
import numpy as np
tiles = [i for i in range(1, 10)] * 4 # 万、筒、条各36张
tiles += [10, 11, 12, 13] * 4 # 字牌:东、南、西、北(数字表示)
tiles += [14, 15, 16, 17] * 4 # 中、发、白、红中(实际用数字代表)
def deal_hand():
random.shuffle(tiles)
return tiles[:14]
def is_valid_set(group):
"""判断是否为顺子或刻子"""
if len(group) == 3:
if group[0] == group[1] == group[2]: # 刻子
return True
elif group[0] + 1 == group[1] and group[1] + 1 == group[2]: # 顺子
return True
return False
def check_win(hand):
"""检测是否胡牌:需满足4组+1对"""
from collections import Counter
count = Counter(hand)
# 找到所有可能的组合
pairs = [k for k, v in count.items() if v >= 2]
if not pairs:
return False
for pair in pairs:
temp_hand = hand.copy()
temp_hand.remove(pair)
temp_hand.remove(pair)
# 尝试分组
groups = []
while temp_hand:
tile = temp_hand.pop(0)
found = False
for i, g in enumerate(groups):
if len(g) < 3 and (g[-1] + 1 == tile or g[-1] == tile):
groups[i].append(tile)
found = True
break
if not found:
groups.append([tile])
if len(groups) == 4 and all(is_valid_set(g) for g in groups):
return True
return False
# 模拟一局
hand = deal_hand()
print("你的手牌:", sorted(hand))
if check_win(hand):
print("恭喜!你胡了!")
else:
print("没胡,继续努力!")
这段代码虽然简略,但已经实现了基本功能:发牌、胡牌判断,你可以把它运行起来,看看是不是每次都能胡?其实不然,因为规则太复杂,这里只是初步版本,真正的麻将算法需要更复杂的递归回溯(比如用DFS遍历所有可能组合),但这已经足够作为入门项目!
为什么值得做?
编程不仅是工具,更是创造力的延伸,通过写一个“麻将胡了”游戏,我们不仅能理解传统游戏的底层逻辑,还能把文化传承变成代码世界的一部分,下次聚会时,别光聊麻将,试试用你的程序来一场“代码对决”吧!
如果你觉得有趣,欢迎留言告诉我你想加什么功能——比如支持多人联机、AI对手,或者加入语音提示!我们一起把传统玩出新花样!
