诈金花从发牌到比大小
大神请绕路!
用java写的一段诈金花,从发牌到比大小选出最大的一副牌的程序,并不涉及网络或者多会话的,纯属个人娱乐之作:
直接上代码:
1.这是主程序入口,逻辑都在这里了
public class JinHua {
private List<Pai> totals;
private boolean isdebug = false;
public static void main(String[] args) {
// TODO Auto-generated method stub
int person = 6; //人数
int mode = 3; //固定三个牌
JinHua jinhua = new JinHua();
jinhua.init();
jinhua.fapai(person,mode);
}
//初始化牌的数据
private void init() {
totals = new ArrayList<Pai>();
for(int i=0;i<4;i++) {
for(int j=0;j<13;j++) {
Pai pai = new Pai();
pai.setIndex(j+(i*13));
pai.setTag(i+1);
pai.setTitle(j+1);
totals.add(pai);
}
}
if(isdebug) {
for(Pai p : totals) {
System.out.println(p.getIndex()+" "+p.getTitle());
}
}
}
//发牌并比较出最大的那一副
private void fapai(int person,int mode) {
RandomSort sort = new RandomSort(52);
int[] t = sort.changePosition(); //将顺序随机打乱
if(isdebug) {
for(int i=0;i<t.length;i++) {
System.out.print(gethua(totals.get(t[i]).getTag())+totals.get(t[i]).getTitle()+" ");
}
}
//发牌每人三张
int[][] nums = new int[person][mode];
int count = 0;
int index = 0;
for(int i=0;i<t.length;i++) {
if(i < person*mode) {
nums[count][index] = t[i];
count++;
if(count == person) {
count = 0;
index++;
}
}else {
break;
}
}
//测试三条
// nums[0] = new int[]{7,20,33};
// nums[1] = new int[]{1,14,27};
// nums[2] = new int[]{2,15,28};
// nums[3] = new int[]{3,16,29};
// nums[4] = new int[]{10,23,36};
// nums[5] = new int[]{5,18,31};
//测试同花顺
// nums[0] = new int[]{26,29,28};
// nums[1] = new int[]{2,3,4};
// nums[2] = new int[]{5,6,7};
// nums[3] = new int[]{13,14,15};
// nums[4] = new int[]{9,10,11};
// nums[5] = new int[]{31,32,33};
//测试对子
// nums[0] = new int[]{39,0,2};
// nums[1] = new int[]{13,26,15};
//按三条=60,同花顺=50,同花=40,顺子=30,对子=20,单张=10;为每一副牌的值
List<Person> vs = new ArrayList<Person>();
int vi = 0;
for(int[] ns : nums) {
int value = getCardValue(ns); //获取每个人的初步牌值
if(isdebug) System.out.println("数值为:"+value);
Person ps = new Person();
ps.setIndex(vi);
ps.setNum(ns);
ps.setValues(value);
vs.add(ps);
vi++;
printlnResult(ns);
}
//再比较出最大的那一副
compare(nums, vs); //排序比较牌,找出最大的一个
}
//人按单张排序
private List<Person> persorSort(List<Person> vs){
for(int i=0;i<vs.size()-1;i++){
for(int j=0;j<vs.size()-1-i;j++){
Person a = vs.get(j);
Person b = vs.get(j+1);
int[] as = a.getNum();
int[] bs = b.getNum();
List<Pai> ass = new ArrayList<Pai>();
ass.add(totals.get(as[0]));
ass.add(totals.get(as[1]));
ass.add(totals.get(as[2]));
List<Pai> bss = new ArrayList<Pai>();
bss.add(totals.get(bs[0]));
bss.add(totals.get(bs[1]));
bss.add(totals.get(bs[2]));
ass = paiSort(ass);
bss = paiSort(bss);
if(ass.get(0).getTitle() < bss.get(0).getTitle() && ass.get(0).getTitle() != 1) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
} else if(ass.get(0).getTitle() != 1 && bss.get(0).getTitle() == 1) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
} else if(ass.get(0).getTitle() == bss.get(0).getTitle()) {
if(ass.get(1).getTitle() < bss.get(1).getTitle()) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}
} else if((ass.get(0).getTitle() == bss.get(0).getTitle())
&& (ass.get(1).getTitle() == bss.get(1).getTitle())) {
if(ass.get(2).getTitle() < bss.get(2).getTitle()) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}
} else if((ass.get(0).getTitle() == bss.get(0).getTitle())
&& (ass.get(1).getTitle() == bss.get(1).getTitle())
&& (ass.get(2).getTitle() == bss.get(2).getTitle())) {
if(ass.get(0).getTag() > bss.get(0).getTag()) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}
}
}
}
if(isdebug) {
for(Person p : vs) {
int[] ns = p.getNum();
System.out.println("第"+p.getIndex()+"个人:"+totals.get(ns[0]).getTitle()+" "+totals.get(ns[1]).getTitle()+" "+totals.get(ns[2]).getTitle()+" ");
}
}
return vs;
}
//人按对子排序
private List<Person> duiziPersonSort(List<Person> vs){
for(int i=0;i<vs.size()-1;i++){
for(int j=0;j<vs.size()-1-i;j++){
Person a = vs.get(j);
Person b = vs.get(j+1);
int[] as = a.getNum();
int[] bs = b.getNum();
List<Pai> ass = new ArrayList<Pai>();
ass.add(totals.get(as[0]));
ass.add(totals.get(as[1]));
ass.add(totals.get(as[2]));
List<Pai> bss = new ArrayList<Pai>();
bss.add(totals.get(bs[0]));
bss.add(totals.get(bs[1]));
bss.add(totals.get(bs[2]));
ass = duiziPaiSort(ass);
bss = duiziPaiSort(bss);
if(ass.get(0).getTitle() != 1 && bss.get(0).getTitle() == 1) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}else if(ass.get(0).getTitle() != 1 && (ass.get(0).getTitle() < bss.get(0).getTitle())) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}else if(ass.get(0).getTitle() == bss.get(0).getTitle() && ass.get(2).getTitle() < bss.get(2).getTitle()) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}else if(ass.get(0).getTitle() == bss.get(0).getTitle() && ass.get(2).getTitle() == bss.get(2).getTitle()) {
if(isdebug) System.out.println("两个一样的对子:"+ass.get(0).getTag()+" "+ass.get(1).getTag());
if(ass.get(0).getTag() < ass.get(1).getTag()) {
if(ass.get(0).getTag() > bss.get(0).getTag() || ass.get(0).getTag() > bss.get(1).getTag()) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}
}else if(ass.get(0).getTag() > ass.get(1).getTag()) {
if(ass.get(1).getTag() > bss.get(0).getTag() || ass.get(1).getTag() > bss.get(1).getTag() ) {
vs.remove(a);
vs.remove(b);
vs.add(j, b);
vs.add(j+1,a);
}
}
}
}
}
if(isdebug) {
for(Person p : vs) {
int[] ns = p.getNum();
System.out.println("第"+p.getIndex()+"个人:"+totals.get(ns[0]).getTitle()+" "+totals.get(ns[1]).getTitle()+" "+totals.get(ns[2]).getTitle()+" ");
}
}
return vs;
}
//每个人对子的大小排序
private List<Pai> duiziPaiSort(List<Pai> ss) {
Pai a = ss.get(0);
Pai b = ss.get(1);
Pai c = ss.get(2);
if(a.getTitle() != b.getTitle() && a.getTitle() == c.getTitle()) {
ss.remove(b);
ss.remove(c);
ss.add(1, c);
ss.add(2,b);
}else if(a.getTitle() != b.getTitle() && a.getTitle() != c.getTitle()) {
ss.remove(a);
ss.add(a);
}
if(isdebug) {
System.out.println();
for(Pai p : ss) {
System.out.print(p.getTitle()+" ");
}
}
return ss;
}
//每个人的大小排序
private List<Pai> paiSort(List<Pai> ss) {
for(int i=0;i<ss.size()-1;i++){
for(int j=0;j<ss.size()-1-i;j++){
Pai a = ss.get(j);
Pai b = ss.get(j+1);
if(a.getTitle() < b.getTitle()){
ss.remove(a);
ss.remove(b);
ss.add(j, b);
ss.add(j+1,a);
}
}
}
if(ss.get(ss.size()-1).getTitle() == 1) {
Pai max = ss.get(ss.size()-1);
ss.remove(max);
ss.add(0, max);
}
if(isdebug) {
System.out.println();
for(Pai p : ss) {
System.out.print(p.getTitle()+" ");
}
}
return ss;
}
//比较大小
private void compare(int[][] nums,List<Person> vs) {
List<Person>[] pss = new List[6];
for(int i=0;i<6;i++) {
pss[i] = new ArrayList<Person>();
}
for(int i=0;i<vs.size();i++) {
if(isdebug) System.out.println("index:"+vs.get(i).getIndex()+" values:"+vs.get(i).getValues());
int values = vs.get(i).getValues();
switch(values) {
case 60:
pss[0].add(vs.get(i));
break;
case 50:
pss[1].add(vs.get(i));
break;
case 40:
pss[2].add(vs.get(i));
break;
case 30:
pss[3].add(vs.get(i));
break;
case 20:
pss[4].add(vs.get(i));
break;
case 10:
pss[5].add(vs.get(i));
break;
}
}
if(isdebug) {
for(int i=0;i<6;i++) {
System.out.println("级别:"+i+" 数量:"+pss[i].size());
}
}
if(pss[0].size() >= 1) {
if(pss[0].size() == 1) {
int[] ns = pss[0].get(0).getNum();
System.out.print("最大牌为三条,为第"+(pss[0].get(0).getIndex()+1)+"个人:");
printlnResult(ns);
}else {
//有好几个三条的
System.out.println("我去,有好几个三条的");
List<Person> psss = persorSort(pss[0]);
Person p = psss.get(0);
System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
printlnResult(p.getNum());
}
} else {
if(pss[1].size() >= 1) {
if(pss[1].size() == 1) {
int[] ns = pss[1].get(0).getNum();
System.out.print("最大牌为同花顺,为第"+(pss[1].get(0).getIndex()+1)+"个人:");
printlnResult(ns);
}else {
//有好几个同花顺
System.out.println("我去,有好几个同花顺");
List<Person> psss = persorSort(pss[1]);
Person p = psss.get(0);
System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
printlnResult(p.getNum());
}
}else {
if(pss[2].size() >= 1) {
if(pss[2].size() == 1) {
int[] ns = pss[2].get(0).getNum();
System.out.print("最大牌为同花,为第"+(pss[2].get(0).getIndex()+1)+"个人:");
printlnResult(ns);
}else {
//有好几个同花
System.out.println("我去,有好几个同花");
List<Person> psss = persorSort(pss[2]);
Person p = psss.get(0);
System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
printlnResult(p.getNum());
}
}else {
if(pss[3].size() >= 1) {
if(pss[3].size() == 1) {
int[] ns = pss[3].get(0).getNum();
System.out.print("最大牌为顺子,为第"+(pss[3].get(0).getIndex()+1)+"个人:");
printlnResult(ns);
}else {
//有好几个顺子
System.out.println("我去,有好几个顺子");
List<Person> psss = persorSort(pss[3]);
Person p = psss.get(0);
System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
printlnResult(p.getNum());
}
}else {
if(pss[4].size() >= 1) {
if(pss[4].size() == 1) {
int[] ns = pss[4].get(0).getNum();
System.out.print("最大牌为对子,为第"+(pss[4].get(0).getIndex()+1)+"个人:");
printlnResult(ns);
}else {
//有好几个对子
System.out.println("我去,有好几个对子");
List<Person> psss = duiziPersonSort(pss[4]);
Person p = psss.get(0);
System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
printlnResult(p.getNum());
}
}else {
System.out.println("我去,全是单张");
List<Person> psss = persorSort(pss[5]);
Person p = psss.get(0);
System.out.print("最大牌为第"+(p.getIndex()+1)+"个人:");
printlnResult(p.getNum());
}
}
}
}
}
}
private void printlnResult(int[] ns) {
for(int n :ns) {
System.out.print(gethua(totals.get(n).getTag())+getShow(totals.get(n).getTitle())+" ");
}
System.out.println();
}
//获取牌值
private int getCardValue(int[] ns) {
int value = 0;
int vs[] = new int[]{totals.get(ns[0]).getTitle(),totals.get(ns[1]).getTitle(),totals.get(ns[2]).getTitle()};
vs = getSort(vs);
if(totals.get(ns[0]).getTitle() == totals.get(ns[1]).getTitle() && totals.get(ns[0]).getTitle() == totals.get(ns[2]).getTitle()) {
return 60; //三条
}else if((totals.get(ns[0]).getTitle() == totals.get(ns[1]).getTitle() && totals.get(ns[0]).getTitle() != totals.get(ns[2]).getTitle())
|| (totals.get(ns[0]).getTitle() != totals.get(ns[1]).getTitle() && totals.get(ns[0]).getTitle() == totals.get(ns[2]).getTitle())
|| (totals.get(ns[0]).getTitle() != totals.get(ns[1]).getTitle() && totals.get(ns[1]).getTitle() == totals.get(ns[2]).getTitle())) {
return 20; //对子
}else if((totals.get(ns[0]).getTag() == totals.get(ns[1]).getTag() && totals.get(ns[2]).getTag() == totals.get(ns[1]).getTag())
&& ((vs[0] == 1 && vs[1] == 12 && vs[2] == 13)
|| (vs[2]-vs[1] == 1 && vs[1]-vs[0] == 1) )){
return 50; //同花顺
}else if(totals.get(ns[0]).getTag() == totals.get(ns[1]).getTag() && totals.get(ns[2]).getTag() == totals.get(ns[1]).getTag()){
return 40; //同花
}else if((vs[0] == 1 && vs[1] == 12 && vs[2] == 13)
|| (vs[2]-vs[1] == 1 && vs[1]-vs[0] == 1) ){
return 30; //顺子
}else if((totals.get(ns[0]).getTitle() != totals.get(ns[1]).getTitle()
&& totals.get(ns[0]).getTitle() != totals.get(ns[2]).getTitle()
&& totals.get(ns[1]).getTitle() != totals.get(ns[2]).getTitle())) {
return 10; //单张
}
return value;
}
//对数组进行排序
private int[] getSort(int[] a) {
int temp=0;
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
if(a[a.length-1] == 1) {
int t0 = a[0];
int t1 = a[1];
a[0] = 1;
a[1] = t0;
a[2] = t1;
}
if(isdebug) {
for(int i=0;i<a.length;i++)
System.out.print(a[i]+" ");
System.out.println();
}
return a;
}
private String gethua(int tag) {
if(tag == 1) {
return "♠";
}else if(tag == 2) {
return "♥";
}else if(tag == 3) {
return "♣";
}else {
return "♦";
}
}
private String getShow(int title) {
if(title == 1) {
return "A";
} else if(title == 11) {
return "J";
} else if(title == 12) {
return "Q";
} else if(title == 13) {
return "K";
} else {
return title+"";
}
}
}
2.其余还有三个类:
public class Pai {
private int index = 0;
private int title;
private int tag = 1; //1=黑,2=红,3=梅,4=方
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getTitle() {
return title;
}
public void setTitle(int title) {
this.title = title;
}
public int getTag() {
return tag;
}
public void setTag(int tag) {
this.tag = tag;
}
}
public class RandomSort {
private Random random = new Random();
//数组大小
private int SIZE = 80;
//要重排序的数组
private int[] positions;
public RandomSort(int size) {
SIZE = size;
positions = new int[SIZE];
for(int index=0; index<positions.length;index++) {
//初始化数组,以下标为元素值
positions[index] = index;
}
//顺序打印出数组的值
//dwn();
}
//重排序
public int[] changePosition() {
for (int index = SIZE - 1; index >= 0; index--) {
//从0到index处之间随机取一个值,跟index处的元素交换
exchange(random.nextInt(index + 1), index);
}
return positions;
}
//交换位置
private void exchange(int p1, int p2) {
int temp = positions[p1];
positions[p1] = positions[p2];
positions[p2] = temp;
}
//打印数组的值
private void dwn() {
for(int index=0; index<positions.length;index++) {
System.out.print(positions[index]+" ");
}
System.out.println();
}
}
public class Person {
private int index;
private int[] num;
private int values;
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int[] getNum() {
return num;
}
public void setNum(int[] num) {
this.num = num;
}
public int getValues() {
return values;
}
public void setValues(int values) {
this.values = values;
}
}