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){//先复制一个listList 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>();//要删除的Cardsif(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,6for(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//1for(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.csdn.net/cq361106306/article/details/7851913
java单机斗地主游戏教程2 http://blog.csdn.net/cq361106306/article/details/7853078
java单机斗地主游戏教程3 http://blog.csdn.net/cq361106306/article/details/7855582
java单机斗地主游戏教程4 http://blog.csdn.net/cq361106306/article/details/7857801