本来我是在学习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次比较结果,比赛结束!