在写游戏算法之前,要思考有什么功能要实现,功能于功能之间有没有关联。
带着这些问题来写代码会很有意思。
既然要获取扑克牌的类型, 我们可以在程序中用枚举来定义。
public enum Rule
{
不出,一张,对子,三不带,炸弹,顺子,连对,
飞机不带,三飞机不带,四飞机不带,五飞机不带,
三带一,三带二,四带二,飞机带二,飞机带二对,
三飞机带三,四飞机带四,三飞机带三对,四带二对,
王炸,四飞机带四对,五飞机带五,六飞机不带
}
// unity3d5.3版本支持枚举是中文,不过不建议这样做,这里只是让大家看懂具体类型
定义完类型,就要去判读扑克牌属于什么类型
// 从大到小排序
public void Format(int [] args)
{
for (int i = 0; i < args.Length; i++)
{
for (int j = 0; j < args.Length; j++)
{
if (args[i]<args[j])
{
int tmp = args[i];
args[i] = args[j];
args[j] = tmp;
}
}
}
}
public int mPokerType;
//判断类型
public bool Judge(int [] args)
{
Format(args);
bool b = false;
switch (args.Length)
{
case 1: b = true; mPokerType = (int)Rule.一张; break;
case 2: b = ErZhang(args); break;
case 3: b = SanZhang(args); break;
case 4: b = SiZhang(args); break;
case 5: b = WuZhang(args);break ;
case 6: b = LiuZhang(args);break ;
case 7: b = QiZhang(args);break ;
case 8: b = BaZhang(args);break ;
case 9: b = JiuZhang(args);break ;
case 10: b = ShiZhang(args);break ;
case 11: b = ShiYiZhang(args);break ;
case 12: b = ShiErZhang(args);break ;
case 14: b = ShiSiZhang(args);break ;
case 15: b = ShiWuZhang(args);break ;
case 16: b = ShiLiuZhang(args);break ;
case 18: b = ShiBaZhang(args);break ;
case 20: b = ErZhang(args);break ;
default:
break;
}
return b;
}
// 这里面的函数命名不规范,请谅解
上面的函数是判断所有扑克类型 在这里我找几个典型的类型写一下。
四张牌 :炸弹 或者 三带一
public bool SiZhang(int[] args)
{
if (ZhaDan(args) || San_1(args))
{
return true;
}
return false;
}
public bool ZhaDan(int [] args)
{
if (args[0]== args[1] && args[1]== args[2] && args[2] == args[3])
{
mPokerType = (int)Rule.炸弹;
return true;
}
return false;
}
public bool San_1(int [] args)
{
ArrayList mList = BreakUpArgs(args,3,false);
foreach (int[] item in mList)
{
mPokerType = (int)Rule.三带一;
return true;
}
return false ;
}
// 判断三张或四张带牌的方法
public ArrayList BreakUpArgs(int [] args,int lenght,bool daiduizi)
{
ArrayList mList = new ArrayList();
int [] a = new int[lenght];
int count = 0;
if (daiduizi == false )
{
count = args.Length - lenght + 1;
for (int i = 0; i < count; i++)
{
int k = 0;
for (int j = 0; j < args.Length; j++)
{
a[k] = args[j];
k++;
if (k==a.Length)
{
break;
}
}
mList.Add(a.Clone());
}
}
else
{
count = (args.Length - lenght) / 2 + 1;
ArrayList mList1 = new ArrayList();
ArrayList mList2 = new ArrayList();
int [] b = new int[args.Length-lenght];
for (int i = 0; i < count *2; i+=2)
{
int ii = 0; int j = 0; int k = 0;
for (ii = 0; ii < i; ii++)
{
b[ii] = args[ii];
}
for ( j = i; j < args.Length; j++)
{
a[k] = args[j];
k++;
if (k==a.Length)
{
break;
}
}
for (int jj = j+1; jj < args.Length; jj++)
{
b[ii + k] = args[jj];
k++;
}
mList1.Add(a.Clone());
mList2.Add(b.Clone());
}
mList.Add(a.Clone());
mList.Add(b.Clone());
}
return mList;
}
九张牌: 顺子 或者 飞机
public bool JiuZhang(int [] args)
{
if (ShunZi(args) || Fly9(args))
{
return true;
}
return false ;
}
// 飞机 九张牌
public bool Fly9(int [] args)
{
if (Fly(args))
{
mPokerType = (int)Rule.三飞机不带;
return true;
}
return false;
}
// 顺子
public bool ShunZi(int [] args)
{
if (args[0]>14)
{
return false ;
}
for (int i = 0; i < args.Length-1; i++)
{
if (args[i] - 1 != args[i+1])
{
return false ;
}
}
mPokerType = (int)Rule.顺子;
return true;
}
// 飞机
public bool Fly(int [] args)
{
if (args[0] >14) return false;
int [] a = new int[3];
int k =0 ;
for (int i = 0; i < args.Length/a.Length; i++)
{
for (int j = 0; j < a.Length; j++)
{
a[j] = args[k];
k++;
}
if (SanZhang(a) == false ) return false ;
if (k<args.Length)
{
if (args[k-1]-1!=args[k])
return false ;
}
}
return true ;
}
// 三张不带
public bool SanZhang(int[] args)
{
if (args[0] == args[1] && args[1]==args[2])
{
mPokerType = (int)Rule.三不带;
return true;
}
return false;
}
举一反三 。