簡單的福彩雙色球生成器
最近總有想買彩票的衝動,所以寫了一個簡單的彩票生成器。內容比較簡單,求大牛不虐。真機上執行效果是這樣的,比較醜
主要功能如下:
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);
}
這樣整個簡單的小應用就完成了,內容比較簡單,希望大家積極的給我指正和交流。