• 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;
            }
    }
    


  • 相关阅读:
    什么是 MyBatis?
    @RequestMapping 注解用在类上面有什么作用?
    如果你也用过 struts2.简单介绍下 springMVC 和 struts2 的区别有哪些?
    SpringMVC 流程?
    SpringMVC 工作原理?
    什么是 SpringMvc?
    依赖注入的三种实现方式?
    什么是IOC
    spring的作用
    什么是spring框架?
  • 原文地址:https://www.cnblogs.com/actanble/p/6713468.html
Copyright © 2020-2023  润新知