本來我是在學習HandlerThread和Handler的post方法的,然後正好今天NBA雷霆晉級,西部決賽將對陣勇士隊!肯定很激烈啊!於是我就突然想用代碼模擬一下西部決賽,既學習了安卓又預測了比賽,不多說,先上圖
比賽過程
於是我開始了西決模擬,
第一場 第二場 第三場
第四場 第五場 第六場
第七場
哈哈,還真是激烈,打到了搶七,雖然模擬結果勇士贏了,但我還是挺雷霆啊!(模擬僅參考雙方常規賽三分兩分罰球出手數及命中率)
上代碼
界面寫的不太好,太亂,怕誤導別人,就不給了= =
進球的方法
private int play(double ftTime, double twoShootTime, double threeShootTime,
double ftpercent, double twoPercent, double threePercent,
String team,int result) {
int type = new Random().nextInt(100);
if (type < ftTime) {
report = team + "獲得了罰球";
// 獲得了一次罰球
int percent = new Random().nextInt(1000);
if (percent <= ftpercent * 10) {
result++;
report += ",並且命中";
} else {
report += ",沒有命中";
}
} else if (type >= ftTime && type < (ftTime + twoShootTime)) {
// 獲得了兩分球出手
report = team + "出手兩分球";
int percent = new Random().nextInt(1000);
if (percent <= twoPercent * 10) {
result += 2;
report += ",並且命中";
} else {
report += ",沒有命中";
}
} else {
// 獲得了三分球出手
report = team + "出手三分球";
int percent = new Random().nextInt(1000);
if (percent <= threePercent * 10) {
result += 3;
report += ",並且命中";
} else {
report += ",沒有命中";
}
}
return result;
}
private void initBackThread() {
mMsgThread = new HandlerThread("msg");
mMsgThread.start();
mMsgHandler = new Handler(mMsgThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
update();
if (isUpdateInfo) {
mMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 100);
}
}
};
}
重寫的activity生命週期
@Override
protected void onResume() {
isUpdateInfo = true;
//開始比賽
mMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 2000);
super.onResume();
}
@Override
protected void onPause() {
isUpdateInfo = false;
//暫停比賽
mMsgHandler.removeMessages(MSG_UPDATE_INFO);
super.onPause();
}
@Override
protected void onDestroy() {
mMsgThread.quit();
super.onDestroy();
}
private void update() {
mHandler.post(new Runnable() {
@Override
public void run() {
time++;
if(time==100){
mShowWarriorsTextView.setText("");
if(warriorsResult>thunderResult){
mShowThunderTextView.setText("勇士勝利!");
}else{
mShowThunderTextView.setText("雷霆勝利!");
}
mMsgThread.quit();
}else{
warriorsResult= play(20, 51, 29, 76.3, 52.8, 41.5, "勇士隊",warriorsResult);
mShowWarriorsTextView.setText(report);
mWarriorsTextView.setText(warriorsResult + "");
report = "";
thunderResult=play(23, 56, 21, 78.2, 52.3, 34.8, "雷霆隊",thunderResult);
mShowThunderTextView.setText(report);
mThunderTextView.setText(thunderResult + "");
report = "";
}
}
});
}
onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler();
mShowThunderTextView = (TextView) findViewById(R.id.main_tv_thunder_report);
mShowWarriorsTextView = (TextView) findViewById(R.id.main_tv_warriors_report);
mWarriorsTextView = (TextView) findViewById(R.id.main_tv_warriors);
mThunderTextView = (TextView) findViewById(R.id.main_tv_thunder);
initBackThread();
}
首先onPause方法會給比賽線程發送消息開始比賽,即調用update方法,然後開始模擬比賽play方法,需要傳遞的參數是雙方常規賽三分兩分罰球出手數及命中率,然後post方法更新UI,然後再延遲1秒向比賽線程發送Message再進行模擬,最後模擬100次比較結果,比賽結束!