麻将算法(三)碰牌以及杠牌
来源:互联网 发布:linux管道命令是啥 编辑:程序博客网 时间:2024/05/19 04:03
洗牌,接牌都有了,那就再来个扔牌。扔牌的思路:如果传入的时牌索引直接找到手牌中的这个位置,将个数-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));
}
}
}
}
碰牌和杠牌做完后再来个吃牌,吃牌请看下章:
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));
}
}
}
}
碰牌和杠牌做完后再来个吃牌,吃牌请看下章:
阅读全文
0 0
- 麻将算法(三)碰牌以及杠牌
- 麻将算法(二)牌型转换以及接牌
- 麻将听牌算法
- 麻将胡牌算法
- 麻将算法(四)吃牌
- node.js——麻将算法(三)胡牌相关明牌
- 麻将的胡牌算法
- 麻将胡牌的算法
- 通用麻将胡牌算法
- 麻将简单胡牌算法
- node.js——麻将算法(六)简易版麻将出牌AI1.0
- node.js——麻将算法(七)简易版麻将出牌AI2.0
- 麻将的和牌、听牌以及一向听(即能否打一张牌进行立直)的算法。
- 判断麻将和牌的算法(转载)
- 判断麻将和牌的算法(转载)
- 麻将算法(五)胡牌之M选N
- 麻将算法(七)胡牌之对子判断
- 麻将听牌的算法(java)
- 费翔林, 骆斌. 操作系统教程(第五版).第121页28、29题笔记
- 文本字数统计
- 高软实验五报告
- es6之三
- Centos7开机启动自己的脚本的方法
- 麻将算法(三)碰牌以及杠牌
- 我的C语言矩阵库
- python 虚拟环境配置(二)
- 03Python中的运算符
- bzoj1503: [NOI2004]郁闷的出纳员(伸展树)
- 方便自己查看
- [NOIP模拟][拓扑排序][贪心]拆网线
- 存储类-static extern
- 制作ZedBoard-linaro-desktop-ubuntu全过程之编译BOOT.bin