1. 程式人生 > >簡單的福彩雙色球生成器

簡單的福彩雙色球生成器

最近總有想買彩票的衝動,所以寫了一個簡單的彩票生成器。內容比較簡單,求大牛不虐。真機上執行效果是這樣的,比較醜得意

                             

主要功能如下:

1、從1-33,1-16中選號;

2、重置;

3、一鍵選號;

下面一一進行說明:

首先是選號的部分,都是有生成按鈕+顯示號碼部分組成的。其中顯示紅色球部分,單獨寫了一個佈局,在主佈局中使用<include>標籤引用,這樣避免了主佈局內容過於繁雜。

在Activity中可以直接使用findViewById來獲得include佈局中的內容。每一個紅球的背景都是一個shape,形狀為oval,設定了solid和size。紅球初始時顯示的問號(?)在Strings.xml中這樣定義 \?,不然顯示會不正確。

給按鈕新增單擊事件採用的是新增android:onClick屬性的方法。對應onClick的方法必須滿足三個條件:public(共有),void(返回值為空),有且只有一個View型別的引數,代表所點選的元件。

以建立藍球為例:

<Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="createBlueValue"
            android:text="@string/btn_blue_value" />

public void createBlueValue(View view){
Random random = new Random();
int temp = random.nextInt(16) + 1; // 1-16

blue.setText(temp + "");

textHint.setText(getResources().getString(R.string.blue_hint_value) + temp);
}

Random的nextInt(index)方法會生成0到index之間的隨機數,包含0但不包含index,所以我們對其加1,以便生成1到16之間的隨機數。

生成紅球的程式碼如下:

public void createRedValue(View view){
if(currentRedIndex == 6){
Toast.makeText(this, "red complete!", Toast.LENGTH_SHORT).show();
return;
}

Random random = new Random();
int temp = random.nextInt(33) + 1; // 1-33
setRedText(currentRedIndex, temp);
currentRedIndex++;
}

定義一個變數currentRedIndex來聲明當前正在生成第幾個紅球。

這裡我們有個問題,在生成紅球時,有一種情況需要我們注意,生成紅球時有可能會生成重複的號碼,比如2,15,2。我們應該怎麼來避免這個問題呢?

有人說把生成紅球的號碼放入一個List中,生成一個新號碼,就去List中判斷,如果存在了就重新生成一個,這樣也有不妥,如果程式重複的生成,每次都生成同樣的號碼,那就會導致死迴圈了,雖然這樣的概率比較低,但也存在這樣的可能性。

所以,我們想了下面這種方法來解決衝突,這就類似資料結構中查詢部分解決衝突似的,我們採用類似線性探測的方法。

如果新生成的號碼包含在List中則新號碼加1,一直迴圈的加下去,如果新號碼大於33了,則置為1,這樣我們在33個數中生成6個數,不會出現資料重疊的情況。

private void setRedText(int index, int value){

int finalValue = judgeValueValid(value);

selectedList.add(finalValue);
switch(index){
case 0:
red01.setText(finalValue + "");
break;
case 1:
red02.setText(finalValue + "");
break;
case 2:
red03.setText(finalValue + "");
break;
case 3:
red04.setText(finalValue + "");
break;
case 4:
red05.setText(finalValue + "");
break;
case 5:
red06.setText(finalValue + "");
break;
}
String str = String.format(getResources().getString(R.string.red_hint_value), (currentRedIndex + 1));
textHint.setText(str + finalValue);
}

private int judgeValueValid(int value){
while(selectedList.contains(value)){
value++;
if(value > 33){
value = 1;
}
}

return value;
}

接下來看重置部分和一鍵選號部分,

public void resetValues(View view){
currentRedIndex = 0;
selectedList.clear();

red01.setText(R.string.default_value);
red02.setText(R.string.default_value);
red03.setText(R.string.default_value);
red04.setText(R.string.default_value);
red05.setText(R.string.default_value);
red06.setText(R.string.default_value);

blue.setText(R.string.default_value);
textHint.setText("");
}

public void performShortCut(View view){
resetValues(view);

for(int i=0;i<6;i++){
createRedValue(view);
}

createBlueValue(view);
}

這樣整個簡單的小應用就完成了,內容比較簡單,希望大家積極的給我指正和交流。