package com;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.Delayed;
public class Common {
//判断牌型
public static CardType jugdeType(List<Card> list){
//因为之前排序过所以比较好判断
int len=list.size();
//单牌,对子,3不带,4个一样炸弹
if(len<=4)
{ //如果第一个和最后个相同,说明全部相同
if(list.size()>0&&Common.getValue(list.get(0))==Common.getValue(list.get(len-1)))
{
switch (len) {
case 1:
return CardType.c1;
case 2:
return CardType.c2;
case 3:
return CardType.c3;
case 4:
return CardType.c4;
}
}
//双王,化为对子返回
if(len==2&&Common.getColor(list.get(1))==5)
return CardType.c2;
//当第一个和最后个不同时,3带1
if(len==4 &&((Common.getValue(list.get(0))==Common.getValue(list.get(len-2)))||
Common.getValue(list.get(1))==Common.getValue(list.get(len-1))))
return CardType.c31;
else {
return CardType.c0;
}
}
//当5张以上时,连字,3带2,飞机,2顺,4带2等等
if(len>=5)
{//现在按相同数字最大出现次数
Card_index card_index=new Card_index();
for(int i=0;i<4;i++)
card_index.a[i]=new ArrayList<Integer>();
//求出各种数字出现频率
Common.getMax( card_index,list); //a[0,1,2,3]分别表示重复1,2,3,4次的牌
//3带2 -----必含重复3次的牌
if(card_index.a[2].size()==1 &&card_index.a[1].size()==1 && len==5)
return CardType.c32;
//4带2(单,双)
if(card_index.a[3].size()==1 && len==6)
return CardType.c411;
if(card_index.a[3].size()==1 && card_index.a[1].size()==2 &&len==8)
return CardType.c422;
//单连,保证不存在王
if((Common.getColor(list.get(0))!=5)&&(card_index.a[0].size()==len) &&
(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==len-1))
return CardType.c123;
//连队
if(card_index.a[1].size()==len/2 && len%2==0 && len/2>=3
&&(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/2-1)))
return CardType.c1122;
//飞机
if(card_index.a[2].size()==len/3 && (len%3==0) &&
(Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/3-1)))
return CardType.c111222;
//飞机带n单,n/2对
if(card_index.a[2].size()==len/4 &&
((Integer)(card_index.a[2].get(len/4-1))-(Integer)(card_index.a[2].get(0))==len/4-1))
return CardType.c11122234;
//飞机带n双
if(card_index.a[2].size()==len/5 && card_index.a[2].size()==len/5 &&
((Integer)(card_index.a[2].get(len/5-1))-(Integer)(card_index.a[2].get(0))==len/5-1))
return CardType.c1112223344;
}
return CardType.c0;
}
//移动效果的函数,用于发牌
public static void move(Card card,Point from,Point to){
if(to.x!=from.x){
double k=(1.0)*(to.y-from.y)/(to.x-from.x);
double b=to.y-to.x*k;
int flag=0;//判断向左还是向右移动步幅
if(from.x<to.x)
flag=20;
else {
flag=-20;
}
for(int i=from.x;Math.abs(i-to.x)>20;i+=flag)
{
double y=k*i+b;//这里主要用的数学中的线性函数
card.setLocation(i,(int)y);
try {
Thread.sleep(5); //延迟,可自己设置
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//位置校准
card.setLocation(to);
}
//对list排序
public static void order(List<Card> list){
Collections.sort(list,new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
// TODO Auto-generated method stub
int a1=Integer.parseInt(o1.name.substring(0, 1));//花色
int a2=Integer.parseInt(o2.name.substring(0,1));
int b1=Integer.parseInt(o1.name.substring(2,o1.name.length()));//数值
int b2=Integer.parseInt(o2.name.substring(2,o2.name.length()));
int flag=0;
//如果是王的话
if(a1==5) b1+=100;
if(a1==5&&b1==1) b1+=50;
if(a2==5) b2+=100;
if(a2==5&&b2==1) b2+=50;
//如果是A或者2
if(b1==1) b1+=20;
if(b2==1) b2+=20;
if(b1==2) b1+=30;
if(b2==2) b2+=30;
flag=b2-b1;
if(flag==0)
return a2-a1;
else {
return flag;
}
}
});
}
//重新定位 flag代表电脑1 ,2 或者是我
public static void rePosition(Main m,List<Card> list,int flag){
Point p=new Point();
if(flag==0)
{
p.x=50;
p.y=(450/2)-(list.size()+1)*15/2;
}
if(flag==1)
{//我的排序 _y=450 width=830
p.x=(800/2)-(list.size()+1)*21/2;
p.y=450;
}
if(flag==2)
{
p.x=700;
p.y=(450/2)-(list.size()+1)*15/2;
}
int len=list.size();
for(int i=0;i<len;i++){
Card card=list.get(i);
Common.move(card, card.getLocation(), p);
m.container.setComponentZOrder(card, 0);
if(flag==1)p.x+=21;
else p.y+=15;
}
}
//地主牌权值,看是否抢地主
public static int getScore(List<Card> list){
int count=0;
for(int i=0,len=list.size();i<len;i++){
Card card=list.get(i);
if(card.name.substring(0, 1).equals("5"))
{
//System.out.println(card.name.substring(0, 1));
count+=5;
}
if(card.name.substring(2, card.name.length()).equals("2"))
{
//System.out.println(2);
count+=2;
}
}
return count;
}
//返回花色
public static int getColor(Card card){
return Integer.parseInt(card.name.substring(0,1));
}
//返回值
public static int getValue(Card card){
int i= Integer.parseInt(card.name.substring(2,card.name.length()));
if(card.name.substring(2,card.name.length()).equals("2"))
i+=13;
if(card.name.substring(2,card.name.length()).equals("1"))
i+=13;
if(Common.getColor(card)==5)
i+=2;//是王
return i;
}
//得到最大相同数
public static void getMax(Card_index card_index,List<Card> list){
int count[]=new int[14];//1-13各算一种,王算第14种
for(int i=0;i<14;i++)
count[i]=0;
for(int i=0,len=list.size();i<len;i++){
if(Common.getColor(list.get(i))==5)
count[13]++;
else
count[Common.getValue(list.get(i))-1]++;
}
for(int i=0;i<14;i++)
{
switch (count[i]) {
case 1:
card_index.a[0].add(i+1);
break;
case 2:
card_index.a[1].add(i+1);
break;
case 3:
card_index.a[2].add(i+1);
break;
case 4:
card_index.a[3].add(i+1);
break;
}
}
}
//拆牌
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(list.size()>0&&(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
评论0
最新资源