actanble

导航

用java实践了下Bingo游戏的玩法

还是挺简单的,思路清晰很快就写好了,没用到1h,今天学习的Math.random()函数;关于拓展也不是很难,没必要再花些功夫了;有兴趣的可以深层挖掘下别的玩法。

/*
    随机数的使用0-1的随机数的产生:
         Math.random();
    建立起来
        首先我们了解 random是在0.0-0.99
                 100*random      0-99 
            所以对于产生1-N的随机数为 N*random()+1
       例题:实现5*5...Bingo
             题目:在5*5的网格中初始有0-6*6[或者7*7]个数值;我们要往其中输入一个位置;
             直到有5个行或者列存在Bingo为止;
             求实现Bingo的期望输入数目;
       改进:对于概率性输入;改进:将每次空输入的次数有效减少。
*/

class   Bingo{
    
    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);
             /*开始游戏
     对于落子20次后开始遍历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]+"\t");                     
                     }
                     System.out.println();
                     System.out.println();
                 }

    }
    public static int playGame(int[][] arr,int[][] arr0){
        int i=0;
        while(true){
            //给与机会参与游戏
            int t = (int) (49*Math.random()+1);
            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;
        }
    }

}
完成后的部分结果如图形所示。

posted on 2016-04-24 20:21  白于空  阅读(385)  评论(0编辑  收藏  举报