最近在研究麻将的算法,自己手写了一份记录一下以后查阅 只实现了听牌,翻数计算还没有做处理,后期在写
麻将万1-9
条11-19
筒21-29
核心:枚举出对子,然后找出刻子,找出顺子
直接上代码:
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(4);
list.add(4);
list.add(4);
list.add(14);
List<Integer> integers = new HuPai().checkTing(list);
System.err.println(list);
System.err.println("可以胡的牌:"+integers);
}
public List<Integer> checkTing(List<Integer> list){
List<Integer> hu = new ArrayList<Integer>();
for(int i = 1;i<30;i++){
ArrayList<Integer> pai = new ArrayList<Integer>(list);
pai.add(i);
List<Integer> integers = removeDuizi(pai);
if(integers.size()<1){
continue;
}
for(int j = 0;j<integers.size();j++){
//移除对子
ArrayList<Integer> pai2 = new ArrayList<Integer>(pai);
int index =0;
Iterator<Integer> it = pai2.iterator();
while(it.hasNext()){
Integer next = it.next();
if (next == integers.get(j)){
it.remove();
index++;
}
if (index>1){
break;
}
}
// System.out.println("对子被移除"+pai2);
removeKezi(pai2);
// System.out.println("移除刻字:"+pai2);
Collections.sort(pai2);
List<Integer> removeShunzi = removeShunzi(pai2);
// System.out.println("结果"+pai2);
if(removeShunzi.size()==0){
hu.add(i);
break;
}
}
}
return hu;
}
//枚举出所有的对子
public List<Integer> removeDuizi(List<Integer> pai){
ArrayList<Integer> integers = new ArrayList<Integer>();
for(int i = 0;i< pai.size();i++){
for(int j=i+1;j<pai.size();j++){
if(pai.get(i)==pai.get(j)){
boolean falg = false;
for(int k = 0;k<integers.size();k++){
if (pai.get(i) ==integers.get(k) ){
falg=true;
break;
}
}
if(!falg){
integers.add(pai.get(i));
}
}
}
}
return integers;
}
public List<Integer> removeKezi(List<Integer> pai){
Map<Integer,Integer> tmpMap = new HashMap<Integer, Integer>();
Iterator<Integer> it = pai.iterator();
while (it.hasNext()){
Integer next = it.next();
if(tmpMap.get(next) ==null){
tmpMap.put(next, 1);
}else{
tmpMap.put(next,tmpMap.get(next)+1 );
}
}
for(Map.Entry<Integer,Integer> ent : tmpMap.entrySet()){
if(ent.getValue()>2){
int index = 0;
Iterator<Integer> it2 = pai.iterator();
while (it2.hasNext()){
Integer next = it2.next();
if(ent.getKey()==next){
it2.remove();
index++;
}
if(index>2){
break;
}
}
}
}
return pai;
}
public List<Integer> removeShunzi(List<Integer> pai){
for(int i = 0;i<pai.size();i++){
for(int j = i+1;j<pai.size();j++){
for(int k = j+1; k< pai.size() ; k++){
if(pai.get(i)+1==pai.get(j) && pai.get(j)+1 ==pai.get(k)){
pai.remove(i);
pai.remove(j-1);
pai.remove(k-2);
return removeShunzi(pai);
}
}
}
}
return pai;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)