• java实现Bingo游戏优化,可以控制次数期望


    如本例实践中;阈值设置为0.3;

    思路都在程序中。实现还是不难。

    /*
           例题:实现5*5...Bingo
                 题目:在5*5的网格中初始有0-6*6[或者7*7]个数值;我们要往其中输入一个位置;
                 直到有5个行或者列存在Bingo为止;
                 求实现Bingo的期望输入数目;
           改进:对于概率性输入;改进:将每次空输入的次数有效减少。
    */
    
    class   Bingo2{
        
        public static void main(String[] args){
            int[][] arr = new int[5][];
            initializeArray(arr);//初始化5*5的数组1-7*7
            int[][] arr0 =new int[5][];//点亮数组
            for(int i=0;i<5;i++){
                arr0[i] = new int[5];                  
            }//点亮数组全部默认为0
            System.out.println("开始打印Bingo值");
            print2Array(arr);
            System.out.println("开始打印点亮数组");
            print2Array(arr0);
                 /*开始游戏
                    对于每次落子后开始遍历1的出现情况                           
                      1,每一行每一列或者每个斜行列攥足5个就结束            
                      2,点亮数组
                 */
            int c = playGame(arr,arr0);
            System.out.println("你本期完成Bingo使用的次数合计 "+c+"次");
            System.out.println("打印完成游戏后的情况----");
            System.out.println("开始打印Bingo值");
            print2Array(arr);
            System.out.println("开始打印结束Bingo后的点亮数组");
            print2Array(arr0);       
        }
         //初始化二维数组5*5;输入7*7范围内的数值
        public static void initializeArray(int[][] arr2){
                for(int i=0;i<5;i++){
                        arr2[i] = new int[5]; 
                    for(int j=0;j<5;j++){
                         arr2[i][j] = (int) (49*Math.random()+1);
                    }
                }
        }
        //打印二维数组
        public static void print2Array(int[][] arr){
                   for(int i=0;i<arr.length;i++){
                         for(int j=0;j<arr.length;j++){
                           System.out.print(arr[i][j]+"	");                     
                         }
                         System.out.println();
                         System.out.println();
                     }
    
        }
        //参与游戏程序;
        public static int playGame(int[][] arr,int[][] arr0){
            int i=0;
            double oc = 0.3;//设置阈值
            int [] arrc = new int[50];
            while(true){
                //给与机会参与游戏
                double occ = Math.random();
                if(occ>oc){
                    int t = (int) (49*Math.random()+1);
                    boolean ol = AAE.xFind(arrc,t);
                    if(ol){
                        continue; 
                        }else{
                        AAE.arrayAddElement(arrc,t);//数组末增加元素
                        increaseValue(arr,arr0,t);//两数组的对应处理
                        i++;
                        boolean flag = judge(arr0); //满足条件否
                            if(flag){
                                break;
                            }   
                         }
                    }else{
                        int t = (int) (49*Math.random()+1);
                        AAE.arrayAddElement(arrc,t);
                        increaseValue(arr,arr0,t);
                        i++;
                        boolean flag = judge(arr0); 
                            if(flag){
                                break;
                            }   
                     }
                }
            return i;
        }
     
        public static boolean judge(int[][] arr3){
                //判断点亮数组中是否有满足目标的对象;即遍历12条路
                //遍历行
                boolean judge = false;
                int count=0;
                for(int i=0;i<arr3.length;i++){
                    int obj1=0;int obj2=0;int obj3=0;int obj4=0;
                    obj3 += arr3[i][arr3.length-i-1];
                    obj4 += arr3[i][i];//obj3和obj4为对角两条线
                    for(int j=0;j<arr3.length;j++){
                        obj1 += arr3[i][j];//行
                        obj2 += arr3[j][i];  //列
                    }
                    if(obj1==5){
                    count++;
                    }
                    if(obj2==5){
                    count++;
                    }
                    if(obj3==5){
                    count++;
                    }
                    if(obj4==5){
                    count++;}
                }
                if(count>=5){//点亮数组求和;12条线若存在有至少5个sum=5则结束;
                    judge = true;
                }
                return judge;
        }
        //遍历整个二维数组;返回该元素在二维数组中的所有位置;并在点亮数组中标记++
        public static void increaseValue(int[][] arr,int[][] arr0,int x){
            int index = 0;
            for(int i=0;i<arr.length;i++){
                for(int j=0;j<arr.length;j++){
                    if(arr[i][j]==x){
                        arr0[i][j]=1; 
                    }               
                }//int hang = (index/10)%hang;//int lie = index%lie;
            }
        }
     }
    
    
    
    class AAE{
    
            public static void arrayAddElement(int[] arr,int x){
                        //对于一个长度固定且足够大的数组增加新元素;这里主要使用集合的功能
                                //补集运用,这里会用到
                   int index = returnIndex(arr);//先访问到非0索引
                       boolean flag = xFind(arr,x);
                        if(flag==false){
                        arr[index+1] = x;//将x元素植入数组末尾
                        }
            }
            public static int returnIndex(int[] arr1){
                    int index = 0;             
                    for(int i =0;i<arr1.length;i++){
                        if(i==0 && arr1[i]==0){
                            index = -1;
                            break;}else if(arr1[i]==0){
                                            index = i-1;
                                        break;
                        }                
                    }        
            return index;
            }
    
            public static void printArray(int[] arr){
                for(int i=0;i<arr.length;i++){
                    System.out.print(arr[i]+"	");
                }
                    System.out.println();
            }
            //判断元素是否在数组中;是返回true
            public static boolean xFind(int[] arr,int x){
                    boolean flag  = false;
                    for(int i=0;i<arr.length;i++){
                        if(arr[i]==x){
                            flag = true;                        
                        }                
                    }
                    return flag;
            }
    }
    


  • 相关阅读:
    Nginx 部署多个 web 项目(虚拟主机)
    Nginx 配置文件
    Linux 安装 nginx
    Linux 安装 tomcat
    Linux 安装 Mysql 5.7.23
    Linux 安装 jdk8
    Linux 安装 lrzsz,使用 rz、sz 上传下载文件
    springMVC 拦截器
    spring 事务
    基于Aspectj 注解实现 spring AOP
  • 原文地址:https://www.cnblogs.com/actanble/p/6713468.html
Copyright © 2020-2023  润新知