麻将算法(三)碰牌以及杠牌
洗牌,接牌都有了,那就再来个扔牌。扔牌的思路:如果传入的时牌索引直接找到手牌中的这个位置,将个数-1;如果传入的是牌值,通过牌型转换后再进行以上操作:
public static void RemoveCard(int[] cbCardIndex, int cbRemoveCardindex)
{
if (cbCardIndex[cbRemoveCardindex] > 0)
{
cbCardIndex[cbRemoveCardindex]--;
}
}
利用以上的方法可以做到扔牌和接牌的方法,下面要做的是怎么去判断碰牌与杠牌:
我的思路是将碰过的牌、杠过牌存在一个list里面,list中保存的是一个结构, List<FrontageItem> ,FrontageItem这个结构中对应分别是类型、牌索引、玩家:
public enum cbFrontage
{
PENGPAI,
GANGPAI,
}
public structFrontageItem
{
private cbFrontage cbFron;
public cbFrontage CbFron
{
get { return cbFron; }
set { cbFron = value; }
}
private int cardindex;
public int CardINdex
{
get { return cardindex; }
set { cardindex = value; }
}
private int Player;
public int Player1
{
get { return Player; }
set { Player = value; }
}
public FrontageItem(cbFrontage CbFron, int CardIndex, int Player)
{
this.cbFron = CbFron;
this.cardindex = CardIndex;
this.Player = Player;
}
}
在判断决定碰牌时,手里一定会有2张这样的牌,把这两张牌减掉后,加入List<FrontageItem>里面:
//这个是碰牌的核心代码
//
//
public static void IS_WIK_PENG(bool ispeng, int[] cbCardIndex, int index, int player, List<FrontageItem> Frontage)
{
if (ispeng)
{
cbCardIndex[index] = cbCardIndex[index] - 2;
Frontage.Add(new FrontageItem(cbFrontage.PENGPAI, index, player));
}
}
在判断决定杠牌时,会有两种可能,一是手里一定会有3张这样的牌,把这三张牌减掉后,加入List<FrontageItem>里面,还有一种可能就是已经碰过了,现在可以进行杠牌操作了,这种可能的解决办
法就是找到这个碰的牌,将他的类型转化成杠牌,手牌不用进行改变:
//这个是杠牌的核心代码
//
//
public static void IS_WIK_GANG(bool ispeng, int[] cbCardIndex, int index, int player, List<FrontageItem> Frontage) //这个判断是否去杠牌牌的方法
{
int number = 0;
int Ynumber = 0;
List<int> other = new List<int>();
foreach (FrontageItem card in Frontage)
{
other.Add(card.CardINdex);
}
if (ispeng)
{
if (other.Contains(index))
{
foreach (FrontageItem card in Frontage)
{
number++;
if (card.CardINdex == index)
{
Ynumber = number;
}
}
Frontage[Ynumber].CbFron = cbFrontage.GANGPAI;
}
else
{
if (player == 2)
{
cbCardIndex[index] = cbCardIndex[index] - 4;
Frontage.Add(new FrontageItem(cbFrontage.GANGPAI, index, player));
}
else
{
cbCardIndex[index] = cbCardIndex[index] - 3;
Frontage.Add(new FrontageItem(cbFrontage.GANGPAI, index, player));
}
}
}
}
碰牌和杠牌做完后再来个吃牌,吃牌请看下章:
麻将算法(三)碰牌以及杠牌相关推荐
- jpanel麻将自动打牌,碰牌,杠牌
不多说,拷贝就能用 package com;import java.awt.event.ActionEvent;import javax.swing.*;import main.MahjongTile ...
- node.js——麻将算法(三)胡牌相关明牌
最近在做一款叫做"卡五星"的三人麻将,来自湖北,麻将里只有筒和条(没有万)以及中发白这些牌. 其他的特殊功能暂且不提,其中有一个需求是玩家听牌后需要将与胡牌有关系的牌显示出来给其他 ...
- node.js——麻将算法(五)胡牌算法的一些优化处理方案(有赖子版)
以前有赖子判胡算法 http://blog.csdn.net/sm9sun/article/details/65632646 以前的帖子说明了处理赖子的两种方案:枚举代替及插空补缺,并最终选择了枚举遍 ...
- 癞子麻将胡牌以及听牌算法实现
最先实现的就是算法的实现. 需求:碰杠胡 ,不能吃 ,不能听 ,只能自摸胡,其中癞子可以做任意牌但是不能碰和杠. 写的时候还不会玩麻将,还是老板教的.^_^ 最麻烦的是胡牌算法.之前搜到的都是不包含 ...
- swift--广东麻将v2.0(带胡牌、听牌算法和自动打牌功能)
本程序实现了广东麻将的全部功能:自动摸牌.打牌.碰.杠.听牌.胡牌(其中庄家手动打牌,其它电脑玩家自动打牌),具体功能有: 系统通过骰子确定庄家,然后发牌,最开始从庄家手动打牌. 可以碰,杠,不能吃牌 ...
- 麻将的和牌、听牌以及一向听(即能否打一张牌进行立直)的算法。
感觉网上关于麻将的源码资源很少,一般这种算法都是用递归,把牌堆分解成若干子牌堆然后针对2-3张牌的情形给出一个出口. 和牌算法比较常见,毕竟只要是麻将编程都要用到,后面两种虽然普通的麻将编程用不到,但 ...
- node.js——麻将算法(六)简易版麻将出牌AI1.0
普通麻将的出牌AI如果不是要求特别高的话,其实蛮容易实现的,毕竟大多数人打牌都只是看自己的手牌. 所以作为简易版的AI,出牌的策略只要奔着胡牌去就可以了.我们能想到的就是把相邻或相同的牌凑到一起,把单 ...
- node.js——麻将算法(七)简易版麻将出牌AI2.0
*文本为上一篇博客http://blog.csdn.net/sm9sun/article/details/77898734的部分追加优化 上一篇博客已经实现了基本的出牌逻辑,大部分情况能够给出正确的策 ...
- 麻将算法之 ------ 胡牌算法
麻将数据牌集合 private int[] cardDataArray ={0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, //万子 1 2 ...
最新文章
- html文件显示不了box,Workbox.js registerNavigationRoute找不到/加载html文件
- electron.js_在使用Electron.js之前我希望知道的事情
- web开发的一些心得
- 32岁封神!苏炳添博士重磅论文:我怎么跑这么快?
- 5.13T1Send 题(send)
- Mac python3.x使用HTMLTestRunner.py
- STM32 基础系列教程 42 - SDMMC+Fatfs
- Linux的起源与各发行版的基本知识
- php左侧,php左侧补零
- 2020十大新消费人群
- 嫁人要嫁IT男 ,嫁对了人天天都是情人节
- 解决长email在表格td中不自动换行的问题 CSS强制不换行
- 微软与 OpenAI 达成合作,获得 GPT-3 独家使用授权!
- selenium 配合多线程_Selenium Webdriver 远程测试和多线程并发测试
- latex论文模板双栏
- OpenPDF 或 itext5 根据pdf模板生成多页PDF
- 中国银行实习笔试面试经验
- 写论文时遇到的问题及解决办法
- 微信小程序太阳落日效果
- Invalid drive错误的解决方案