隨機生成九宮格圖形密碼-實現


實現:隨機生成九宮格圖形(手勢)密碼。。

 

讀題,有幾個點需要主要:
1、密碼長度可設置

2、手勢密碼的路徑必須可直達

用兩種方式實現:

1、canArr 判斷前后數值是否可直達

2、getNum 根據前一個數值獲取下一個數值

package com.maomao;

import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;

//隨機生成九工格圖形密碼,隨機數范圍1~9
public class RandomScret {

    //9工格中,1~9可直達的數值,發現規律
    //除了5
    //奇數,1,3,7,9,四個角無法直達
    //偶數,2,4,6,8,對角無法直達,並且對角和5的差值相同
    //    int[] num_1={2,4,5,6,8};
    //    int[] num_2={1,3,4,5,6,7,9};
    //    int[] num_3={2,4,5,6,8};
    //    int[] num_4={1,2,3,5,7,8,9};
    //    int[] num_5={1,2,3,4,6,7,8,9};
    //    int[] num_6={1,2,3,5,7,8,9};
    //    int[] num_7={2,4,5,6,8};
    //    int[] num_8={1,3,4,5,6,7,9};
    //    int[] num_9={2,4,5,6,8};

    //獲取1~9的隨機整數
    //( n~m隨機數公式:(int)(Math.random()*(m-n+1) +n)))
    public static int getRandomNum(){
        int num=(int)(Math.random()*9+1);
        return num;
    }

    //判斷是否可以抵達 -----這種方式需要不停試錯,花費時間較長
    public Boolean canArr(int preNum,int randomNum){
        //做標記,默認不可以抵達
        boolean flag = false;
        //前后值不能相等
        if (preNum!=randomNum){
            if (preNum==5 ) {
                flag = true;
            }else if (randomNum==5){
                flag = true;
            }else if (preNum%2==0){ //是偶數
                int n=Math.abs(preNum-5);
                int m=Math.abs(randomNum-5);
                if (n!=m){
                    flag=true;
                }
            }else if (preNum%2==1){ //preNum是除了5以外的奇數
                if (randomNum%2==0){
                    flag=true;
                }
            }
        }

        return flag;
    }

    //構造可直達路徑 ------這種方式占用內存,花費時間短
    public Map<Integer,int[]> All() {
        Map<Integer, int[]> map = new HashMap<>();
        map.put(1,new int[]{2,4,5,6,8});
        map.put(2,new int[]{1,3,4,5,6,7,9});
        map.put(3,new int[]{2,4,5,6,8});
        map.put(4,new int[]{1,2,3,5,7,8,9});
        map.put(5,new int[]{1,2,3,4,6,7,8,9});
        map.put(6,new int[]{1,2,3,5,7,8,9});
        map.put(7,new int[]{2,4,5,6,8});
        map.put(8,new int[]{1,3,4,5,6,7,9});
        map.put(9,new int[]{2,4,5,6,8});

        return map;
    }
    public int getNum(int preNum){
//        int tag=(int)(Math.random()*10);
        int[] nextArr=All().get(preNum);
        int tag=(int)(Math.random()*10+1);//1~10
        int next=nextArr[tag%nextArr.length];
        return next;
    }

    @Test
    public void test1(){
        RandomScret rs=new RandomScret();

        //設置密碼長度length
        int length=6;
        int[] scret=new int[length];

        //指定生成
        int preNum=getRandomNum();
        for (int i=0;i<length;i++){
            scret[i]=rs.getNum(preNum);
            preNum=scret[i];
        }

        for (int num:scret){
            System.out.println(num);
        }
    }

    @Test
    public void test2(){
        RandomScret rs=new RandomScret();

        //設置密碼長度length
        int length=6;
        int[] scret=new int[length];

        //隨機生成
        int preNum=getRandomNum();
        for (int i=0;i<length;){
            int randomNum=getRandomNum();
            if (rs.canArr(preNum,randomNum)){
                scret[i]=randomNum;
                preNum=scret[i];
                i++;
            }else {
                continue;
            }
        }

        for (int num:scret){
            System.out.println(num);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM