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