炸金花:三条、同花顺、金花、顺子、对子等出现的几率

来源:互联网 发布:python 接口开发 编辑:程序博客网 时间:2024/06/12 01:32
/*
 * 一年又一年,年年过年都是打牌。不是蛮喜欢打牌,赢了固然高兴,燃鹅,总是输啊!
 * 我们这边过年的风俗习惯就是那样得。过年,大人小孩都是打牌。家家户户的杀“家麻雀”
 * 确实,也没什么好做的。只好打麻将,斗地主,炸金花混时间喽。
 * 无奈,过年前后电脑罢工的了八九天,无故的坏了,昨天才好
 * 近日,闲来无事。编了个计算炸金花里面各种牌概率的程序
 * 初步功能实现:
 * 在模拟十万次后得到结果,差不多接近实际情况了
 * ★★★三条的概率为:0.00229
 * ★★★顺金的概率为:0.002096
 * ★★★金花的概率为:0.051402
 * ★★★顺子的概率为:0.03483
 * ★★★对子的概率为:0.16887000000000002
 *
 * 事实也证明同花顺的概率要比三条的概率还要低,和以前想的差不多。
 * 
 * 网上用古典概率计算的结果为:
 * http://wenku.baidu.com/link?url=sAumyFo8EBxFxrMFy-fcFyItlhhzdiiBxvkGrGMCO6kZgv5OV0K_1VPv9gOKMI9Z0JGXESvthatpDAQbw_6PQ29XoFvbMhVp7LqeQGZIanW&qq-pf-to=pcqq.group
 *和他的基本一致,他没有包含关系。如金花里面是不包含顺子的
 *
 *☆★☆★☆★有时间再改下,由用户输入三张牌,然后计算他赢的概率为多少。
 *☆★☆★☆★用C#写个窗体界面的,以后发财就可很靠它了。哈哈哈

 * */

代码部分:

import java.util.Scanner;public class zjh {static String[] DZ=new String[]{"A","2","3","4","5","6","7","8","9","10","J","Q","K"};static String[] HS=new String[]{"红心","黑桃","梅花","方块"};static  String[] data=new String[52];public static void main(String[] args) {//初始化,一副新牌int k=0;for (int i = 0; i < DZ.length; i++) {for (int j = 0; j < HS.length; j++) {data[k]=DZ[i]+" "+HS[j];k++;}}//洗牌getXP();////检验//for (int i = 0; i < data.length; i++) {//System.out.println(data[i]);//}//游戏开始System.out.println();System.out.println("=======炸金花-概率计算=======");System.out.print("★★游戏人数:");//模拟概率Scanner sc=new Scanner(System.in);int n=sc.nextInt();//几人玩System.out.println();double countJH=0;double countDZ=0;double countST=0;double countSZ=0;double countSJ=0;//模拟1000次,金花概率long t1=System.currentTimeMillis();for (int t = 0; t < 100000; t++) {//发牌String arr[][]=new String[n][3];int index=0;for (int i = 0; i < 3; i++) {for (int j = 0; j < n; j++) {arr[j][i]=data[index];index++;}}////查看牌if(t==1){System.out.println("发牌:");for (int i = 0; i < n; i++) {System.out.println("第"+(i+1)+"人牌为:"+arr[i][0]+","+arr[i][1]+","+arr[i][2]);}}for (int i = 0; i < n; i++) {String str1[]=arr[i][0].split(" ");String str2[]=arr[i][1].split(" ");String str3[]=arr[i][2].split(" ");String s1=str1[1];String s2=str2[1];String s3=str3[1];String[] suanzi=new String[]{str1[0],str2[0],str3[0]};//金花,花色全部一样的if(s1.equals(s2)&&s2.equals(s3)){countJH++;if(BoolShunzi(suanzi)){//同花顺,花色相同,且是顺子的countSJ++;}}//对子a==b或者a==c或者b==cif(str1[0].equals(str2[0])||str1[0].equals(str3[0])||str2[0].equals(str3[0])){countDZ++;//三条,只有先是对子,才可能是三条的if(str1[0].equals(str2[0])&&str1[0].equals(str3[0])){countST++;}}//顺子,对子和顺子是互斥的else if (BoolShunzi(suanzi)){countSZ++;}}//下一局重新洗牌一下getXP();}System.out.println();double st=countST/(100000*n);System.out.println("★★★三条的概率为:"+st);double sj=countSJ/(100000*n);System.out.println("★★★顺金的概率为:"+sj);double jh=countJH/(100000*n);System.out.println("★★★金花的概率为:"+jh);double sz=countSZ/(100000*n);System.out.println("★★★顺子的概率为:"+sz);double dz=countDZ/(100000*n);System.out.println("★★★对子的概率为:"+(dz-st));//由用户输入,三张牌。判断输赢,//判断概率:金花,顺子,同花顺,对子,A大等各种情况的概率//(可采用类似积分,三条10分,同花顺9分,金花8分),分值相同的,再进行细节比较//。。。。。//待完成System.out.println();//时间计算long t2=System.currentTimeMillis();System.out.println("☆☆☆模拟十万次用时为:"+(t2-t1)+"毫秒");}//计算顺子的概率private static boolean BoolShunzi(String[] shunzi) {int[] arr=new int[3];//将AJQK转换成数子for (int i = 0; i < shunzi.length; i++) {try{arr[i]=Integer.parseInt(shunzi[i]);}catch(Exception e){if(shunzi[i].equals("A"))arr[i]=1;else if(shunzi[i].equals("J"))arr[i]=11;else if(shunzi[i].equals("Q"))arr[i]=12;elsearr[i]=13;}}//排序for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {if(arr[i]>arr[j]){int t=arr[i];arr[i]=arr[j];arr[j]=t;}}}//判断if(arr[0]-arr[1]==1&&arr[1]-arr[2]==1){//System.out.println(arr[0]+","+arr[1]+","+arr[2]);return true;}else if(arr[0]==13&&arr[1]==12&&arr[2]==1)//QKA{return true;elsereturn false;}//洗牌,一百次的随机交换private static void getXP() {for (int i = 0; i < 100; i++) {//两个随机数,然后交换牌的顺序int r1=(int)(Math.random()*52);int r2=(int)(Math.random()*52);String temp=data[r1];data[r1]=data[r2];data[r2]=temp;}}}

上个图片,(图片来源QQ空间,eruyouqingquanchunshuyiwai)

zheijiashi,yidaixingdusheng.小伙子,有前途!


1 0
原创粉丝点击