AI麻将游戏 - 更新日志
1.2.1(2026-01-25)
增加麻将模板,麻将更有肉感!
1.2(2026-01-22)
1.不再使用uniCloud服务器调度云函数,开发者直接不用开通uniCloud服务,直接减少一半运营费用,营收利润空间更大。 2.试用版和普通授权版均可以修改优化AI调用的提示词,无形中普通授权版提高了权限。
1.1.02(2026-01-11)
优化麻将桌面样式
1.1.01(2026-01-10)
完善文档教程:新增扫描二维码下载游戏体验。
1.1.00(2026-01-10)
1.修改出牌:点击牌实现偏移,再次点击才出牌。 2.叫牌是提示叫牌情况。
1.0.02(2026-01-04)
完善部分css
1.0.01(2026-01-01)
1.更新部分教程文档。 2.保留真实deepseek接口连接。 3.其他微调。
1.0.0(2025-12-31)
wj-mjaigame
功能简介
该游戏为人机对战麻将游戏,AI为玩家提供出牌策略指导,提升玩家麻将水平,实现百战百胜。 1.本人作为其中一个玩家,其他玩家为程序出牌。 2.已有胡牌规则有:平胡、龙七对、七对、大对子、清一色 3.抓鸡规则有:幺鸡、八筒以及胡牌后翻的鸡,没叫牌时已出的鸡被扣分 4.AI在线思考出牌决策:在线连接Deepseek现场指导出牌决策,提升玩家麻将水平,实现百战百胜。 5.配备完备的广告体系:视频激励+信息流广告,多重立体广告收益。
基本使用方法
1.修改广告adpid为自己的:插件wj-mjaigame/common/constants.js第34行
//视频奖励广告位adpid
export const adpid = '1507000689';
//游戏界面信息流广告位adpid
export const adXXLpid = '1111111111';
2.修改deepseek的key:插件wj-mjaigame/uniCloud/cloudfunctions/ai-demo/index.js的69行
const llmManager = uniCloud.ai.getLLMManager({
provider: 'deepseek',
apiKey:'在deepseek.com上申请的Key',
proxy:'https://api.deepseek.com' //也可以是ip
}) //创建llm对象
通过以上两步已经实现:推广使用、坐等广告收益。
二开基本思路
修改胡牌规则,实现本地特色麻将规则,更受本地人喜欢。
修改胡牌逻辑
// 检查七对/杠七对
if (tempHand.length === 14 & this.checkSevenPairs(tempHand)) {
paixingfen = paixingfen + 3;
//如果七对中有4张牌相同,则说明是杠七对
if (this.findFourthDuplicate(tempHand)) {
paixing.push('杠七对');
paixingfen = paixingfen + 20;
} else {
paixing.push('七对');
paixingfen = paixingfen + 10;
}
// 检查是否是同一色(即清一色牌型的基础)
const special = this.players[player].special;
if (this.checkQingYiSe(tempHand, special)) {
paixing.push('清一色');
paixingfen = paixingfen + 10;
}
this.paixingfen = paixingfen;
return paixing.map(t => t).join(' ');
}
// 检查大对子
if (this.checkDaDuizi(tempHand)) {
paixingfen = paixingfen + 3;
paixing.push('大对子');
paixingfen = paixingfen + 5;
// 检查是否是同一色(即清一色牌型的基础)
const special = this.players[player].special;
if (this.checkQingYiSe(tempHand, special)) {
paixing.push('清一色');
paixingfen = paixingfen + 10;
}
this.paixingfen = paixingfen;
return paixing.map(t => t).join(' ');
}
// 检查平胡
if (this.checkPingHu(tempHand)) {
paixingfen = paixingfen + 3;
//检查自己是否有杠
const gangCombos = this.players[player].special.filter(combo => combo.type === 'gang');
// 如果是自摸或者有杠,平胡可以胡
if (isZimo || this.gang || gangCombos.length > 0) {
paixing.push('平胡');
paixingfen = paixingfen;
if (this.gang) {
paixingfen = paixingfen + 2;
}
}
// 检查是否是同一色(即清一色牌型的基础)
const special = this.players[player].special;
if (this.checkQingYiSe(tempHand, special)) {
paixing.push('清一色');
paixingfen = paixingfen + 10;
}
this.paixingfen = paixingfen;
return paixing.map(t => t).join(' ');
}
新建具体规则函数
// 大对子检查
checkDaDuizi(tiles) {
// 碰碰胡牌数要求: 2,5,8,11,14
const validLengths = [2, 5, 8, 11, 14];
if (!validLengths.includes(tiles.length) || tiles[0] != tiles[1]) return false;
if (tiles.length === 2 & tiles[0] === tiles[1]) return true;
// 提取所有name值
const names = tiles.map(item => item);
// 统计数字出现频率
const freq = {};
for (const num of names) {
freq[num] = (freq[num] || 0) + 1;
}
const counts = Object.values(freq);
// 检查频率模式:一个数字出现2次,其余数字每个出现3次
return counts.includes(2) && counts.filter(c => c === 3).length === counts.length - 1;
}
// 清一色检查
checkQingYiSe(tiles, special) {
if (tiles.length === 0) return false;
const firstTileType = tiles[0].charAt(1);
// 检查手牌
for (const tile of tiles) {
if (tile.charAt(1) !== firstTileType) {
return false;
}
}
// 检查特殊牌组
if (special && special.length > 0) {
for (const group of special) {
for (const tile of group.tiles) {
if (tile.name.charAt(1) !== firstTileType) {
return false;
}
}
}
}
return true;
}