今天跟大家唠唠我最近在家里捣鼓的“温州麻将”小项目,纯粹是个人兴趣,想把小时候玩的麻将用代码实现出来,也算是给自己练练手。

我啥也没想,直接上手就干。先在电脑上新建了个文件夹,名字就叫“温州麻将”,然后就开始琢磨,这麻将都有牌!那就先定义牌。
我用一个数组来表示所有的麻将牌,包括万、筒、条、风牌和箭牌。为了方便,我直接用的数字和字母来代替,比如“1w”代表一万,“dong”代表东风。想着要模拟温州麻将,我还特意查了下规则,温州麻将好像是136张牌,比一般的麻将多了一些花色。
let pai = ['1w', '2w', '3w', ..., 'dong', 'nan', 'xi', 'bei', 'zhong', 'fa', 'bai'];
定义好牌之后,我就开始考虑怎么洗牌。这可是个技术活,不能让电脑洗出来的牌太有规律了。我想了个简单的办法,就是随机打乱数组的顺序。
用了一个循环,每次随机取两个牌的位置,然后交换一下。多循环几次,牌就彻底乱了。洗完牌,接下来就是发牌了。温州麻将好像是每人先发13张牌,然后庄家再多摸一张。
javascript
function xiPai(pai) {
for (let i = 0; i < 1000; i++) {
let a = *(*() *);
let b = *(*() *);
let temp = pai[a];
pai[a] = pai[b];

pai[b] = temp;
return pai;
发牌的时候,我用了一个循环,每人发13张牌,然后把剩下的牌放到一个“牌堆”里。庄家再从牌堆里摸一张牌,这样,游戏就可以开始了。
发牌之后,我就开始考虑怎么判断胡牌。这可是麻将的核心!温州麻将的胡牌规则比较复杂,要考虑各种番型、癞子等等。
我先实现了一个简单的胡牌判断,就是判断手里的牌是否符合“33332”的结构,也就是四个刻子(或杠)加一个对子。这只是最基本的胡牌牌型,还有很多其他的牌型,比如七对、十三幺等等,我后面再慢慢加上。
javascript
function checkHu(hand) {
// 简单的胡牌判断,判断是否为 33332 的结构
// 还没实现具体的逻辑
return false;
为了让程序跑起来,我写了一个简单的界面,用 HTML 和 JavaScript 实现。界面上显示每个人的手牌、牌堆、以及一些操作按钮,比如“摸牌”、“出牌”、“碰”、“杠”、“胡”等等。
这个界面非常简陋,只是为了方便我测试程序。不过看到自己的麻将程序终于可以跑起来了,心里还是挺激动的。
遇到的坑:- 洗牌算法:一开始的洗牌算法太简单了,洗出来的牌还是比较有规律。后来我增加了循环次数,才让牌变得更乱一些。
- 胡牌判断:温州麻将的胡牌规则太复杂了,要考虑各种番型和癞子。我还在研究中,争取把各种胡牌牌型都实现出来。
- 界面设计:界面太简陋了,操作起来很不方便。后面我会花点时间,把界面做得更漂亮一些。
- 完善胡牌判断:实现各种胡牌牌型,包括七对、十三幺、清一色等等。
- 加入癞子:温州麻将的癞子玩法很有特色,我要把这个功能加上。
- 优化界面:把界面做得更漂亮、更易用。
- 加入网络对战功能:如果有可能,我想把这个麻将程序做成一个网络游戏,让大家可以一起玩。
这回的“温州麻将”小项目让我学到了很多东西。虽然还有很多不足,但我会继续努力,争取把这个程序做得更也欢迎大家给我提提意见,一起交流学习!
