java版单机斗地教主程4
java版单机斗地主教程4
本篇讲拆牌。
拆牌可以说算斗地主AI里面最难的一部分之一了,因为涉及到太多动态变化,要做出一个好的AI斗地主,必须要在这里下功夫。
但是极端化的AI又有点失去可玩性,比如说电脑拿到一副好牌,不管你怎么打,都是输的。甚至他能推出你自己手中的牌是什么。呵呵开玩笑了。
第一次做这种斗地主的东西,网上找了很多资料,但是都没一种完美的算法,在这我只实现了一个较弱智的“机器人” = =,。但目前还只是一部分,
下一节再做出牌和发牌。这一节只讲牌盘好了。为后面做准备。
因为牌型变化多端,我把他分为几个模块,
1.单牌
2.对子
3.3带
4.顺子
5.飞机
6.双顺
7.炸弹
这几个模块,可在后面择优调用
意思是,根据调用的顺序不同,优先就不同,比如一个牌型 7666543 , 你说是分成76543和66 还是分成 7,666,5,4,3呢
显然不能确定分为哪种,因为在出牌的时候, 你要根据上家的牌型来对应,合理拆牌
下面是每部分的代码
逻辑有点重复的地方,代码复用性不强,本人还是菜鸟见谅。
//拆牌 public static Model getModel(List<Card> list){ //先复制一个list List list2=new ArrayList<Card>(list); Model model=new Model(); //------先拆炸弹 Common.getBoomb(list2, model); //ok //------拆3带 Common.getThree(list2, model); //拆飞机 Common.getPlane(list2, model); //------拆对子 Common.getTwo(list2, model); //拆连队 Common.getTwoTwo(list2, model); //拆顺子 Common.get123(list2, model); //拆单 Common.getSingle(list2, model); return model; } //拆连子 public static void get123(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards if(Common.getValue(list.get(0))<7 ||Common.getValue(list.get(list.size()-1))>10) return; if(list.size()<5) return; for(int i=0,len=list.size();i<len;i++) { int k=i; for(int j=i;j<len;j++){ if(Common.getValue(list.get(i))-Common.getValue(list.get(j))==j-i) { k=j; } } if(k-i>=4) { String s=""; for(int j=i;j<k;j++) { s+=list.get(j).name+","; del.add(list.get(j)); } s+=list.get(k).name; del.add(list.get(k)); model.a123.add(s); i=k; } } list.removeAll(del); } //拆双顺 public static void getTwoTwo(List<Card> list,Model model){ List<String> del=new ArrayList<String>();//要删除的Cards //从model里面的对子找 List<String> l=model.a2; if(l.size()<3) return ; Integer s[]=new Integer[l.size()]; for(int i=0,len=l.size();i<len;i++){ String []name=l.get(i).split(","); s[i]=Integer.parseInt(name[0].substring(2,name[0].length())); } //s0,1,2,3,4 13,9,8,7,6 for(int i=0,len=l.size();i<len;i++){ int k=i; for(int j=i;j<len;j++) { if(s[i]-s[j]==j-i) k=j; } if(k-i>=2)//k=4 i=1 {//说明从i到k是连队 String ss=""; for(int j=i;j<k;j++) { ss+=l.get(j)+","; del.add(l.get(j)); } ss+=l.get(k); model.a112233.add(ss); del.add(l.get(k)); i=k; } } l.removeAll(del); } //拆飞机 public static void getPlane(List<Card> list,Model model){ List<String> del=new ArrayList<String>();//要删除的Cards //从model里面的3带找 List<String> l=model.a3; if(l.size()<2) return ; Integer s[]=new Integer[l.size()]; for(int i=0,len=l.size();i<len;i++){ String []name=l.get(i).split(","); s[i]=Integer.parseInt(name[0].substring(2,name[0].length())); } for(int i=0,len=l.size();i<len;i++){ int k=i; for(int j=i;j<len;j++) { if(s[i]-s[j]==j-i) k=j; } if(k!=i) {//说明从i到k是飞机 String ss=""; for(int j=i;j<k;j++) { ss+=l.get(j)+","; del.add(l.get(j)); } ss+=l.get(k); model.a111222.add(ss); del.add(l.get(k)); i=k; } } l.removeAll(del); } //拆炸弹 public static void getBoomb(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards //王炸 if(list.size()>=2 &&Common.getColor(list.get(0))==5 && Common.getColor(list.get(1))==5) { model.a4.add(list.get(0).name+","+list.get(1).name); //按名字加入 del.add(list.get(0)); del.add(list.get(1)); } //如果王不构成炸弹咋先拆单 if(Common.getColor(list.get(0))==5) { del.add(list.get(0)); model.a1.add(list.get(0).name); } list.removeAll(del); //一般的炸弹 for(int i=0,len=list.size();i<len;i++){ if(i+3<len && Common.getValue(list.get(i))==Common.getValue(list.get(i+3))) { String s=list.get(i).name+","; s+=list.get(i+1).name+","; s+=list.get(i+2).name+","; s+=list.get(i+3).name; model.a4.add(s); for(int j=i;j<=i+3;j++) del.add(list.get(j)); i=i+3; } } list.removeAll(del); } //拆3带 public static void getThree(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards //连续3张相同 for(int i=0,len=list.size();i<len;i++){ if(i+2<len&&Common.getValue(list.get(i))==Common.getValue(list.get(i+2))) { String s=list.get(i).name+","; s+=list.get(i+1).name+","; s+=list.get(i+2).name; model.a3.add(s); for(int j=i;j<=i+2;j++) del.add(list.get(j)); i=i+2; } } list.removeAll(del); } //拆对子 public static void getTwo(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards //连续2张相同 for(int i=0,len=list.size();i<len;i++){ if(i+1<len&&Common.getValue(list.get(i))==Common.getValue(list.get(i+1))) { String s=list.get(i).name+","; s+=list.get(i+1).name; model.a2.add(s); for(int j=i;j<=i+1;j++) del.add(list.get(j)); i=i+1; } } list.removeAll(del); } //拆单牌 public static void getSingle(List<Card> list,Model model){ List<Card> del=new ArrayList<Card>();//要删除的Cards //1 for(int i=0,len=list.size();i<len;i++){ model.a1.add(list.get(i).name); del.add(list.get(i)); } list.removeAll(del); }
转载请注明出处谢谢
java单机斗地主游戏教程1 http://blog.****.net/cq361106306/article/details/7851913
java单机斗地主游戏教程2 http://blog.****.net/cq361106306/article/details/7853078
java单机斗地主游戏教程3 http://blog.****.net/cq361106306/article/details/7855582
java单机斗地主游戏教程4 http://blog.****.net/cq361106306/article/details/7857801