Unity开发案例:斗地主游戏中获取扑克牌类型
发表于2018-04-22
1.以这个斗地主游戏开发案例给大家讲解如何获取扑克牌类型,在写游戏算法之前,要思考有什么功能要实现,功能于功能之间有没有关联。带着这些问题来写代码会很有意思。
既然要获取扑克牌的类型, 我们可以在程序中用枚举来定义:
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; }
举一反三 。
来自:https://blog.csdn.net/microsoftmsdnnet/article/details/51013174