123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444 |
- package com.jyc.threegames.activity;
- import android.app.Activity;
- import android.app.Dialog;
- import android.app.ProgressDialog;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.text.Html;
- import android.view.Gravity;
- import android.view.View;
- import android.widget.TextView;
- import androidx.annotation.NonNull;
- import androidx.constraintlayout.widget.ConstraintLayout;
- import com.jyc.threegames.App;
- import com.jyc.threegames.R;
- import com.jyc.threegames.activity.base.BaseActivity;
- import com.jyc.threegames.bean.GameInfo;
- import com.jyc.threegames.bean.result.ResGameInfo;
- import com.jyc.threegames.controller.GameController;
- import com.jyc.threegames.controller.LoginController;
- import com.jyc.threegames.net.SimpleRequest;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.Locale;
- import butterknife.BindView;
- import butterknife.OnClick;
- import it.sephiroth.android.library.numberpicker.NumberPicker;
- public class GameActivity extends BaseActivity {
- private static final String PARAM_GAME_INFO = "gameInfo";
- private static final String PARAM_RES_GAME_INFO = "resGameInfo";
- private int mCurrentPreGameCountDown = 0;
- private Handler mPreGameHandler;
- private Integer[] mPractiseNumbers;
- private Handler mPractiseHandler;
- private int mCurrentPractiseIndex;
- private GameInfo mGameInfo;
- private ResGameInfo mResGameInfo;
- private int mSpecialNumberOne;
- private int mSpecialNumberTwo;
- @BindView(R.id.pre_game_hint)
- TextView mTVPreGameHint;
- @BindView(R.id.game_hint)
- TextView mTVGameHint;
- @BindView(R.id.number)
- TextView mTVNumber;
- @BindView(R.id.click_area)
- View mVClickArea;
- @BindView(R.id.form)
- ConstraintLayout mCLForm;
- @BindView(R.id.right)
- NumberPicker mNPRight;
- @BindView(R.id.grasp)
- NumberPicker mNPGrasp;
- private boolean mClickable = false;
- private long mClickTime = 0;
- private long mCurrentTime = 0;
- private List<Integer> mRecordList;
- private List<Long> mResponseList;
- private List<Integer> mPressRecordList;
- private long mStartTime = System.currentTimeMillis();
- private long mEndTime = 0;
- @Override
- protected void init(Bundle instance) {
- super.init(instance);
- if (instance == null) {
- mGameInfo = getIntent().getParcelableExtra(PARAM_GAME_INFO);
- mResGameInfo = getIntent().getParcelableExtra(PARAM_RES_GAME_INFO);
- }
- else {
- mGameInfo = instance.getParcelable(PARAM_GAME_INFO);
- mResGameInfo = getIntent().getParcelableExtra(PARAM_RES_GAME_INFO);
- }
- if (!LoginController.getInstance().isCurrentUserAdmin()){
- new SimpleRequest<>().request(this, GameController.getInstance().enterGame(mResGameInfo.playGameId));
- }
- startPrePractise();
- App.CAN_PLAY_GAME = false;
- }
- @Override
- protected void onSaveInstanceState(@NonNull Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putParcelable(PARAM_GAME_INFO, mGameInfo);
- outState.putParcelable(PARAM_RES_GAME_INFO, mResGameInfo);
- }
- @Override
- protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- mGameInfo = savedInstanceState.getParcelable(PARAM_GAME_INFO);
- mResGameInfo = savedInstanceState.getParcelable(PARAM_RES_GAME_INFO);
- }
- @Override
- protected int getRootLayout() {
- return R.layout.activity_game_one;
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- App.CAN_PLAY_GAME = true;
- }
- @Override
- public void onBackPressed() {}
- @Override
- protected String getAlertText() {
- return "您好,\n閒置超時,\n請繼續操作!";
- }
- @OnClick(R.id.click_area)
- public void clickNumber(){
- if (mClickable && mClickTime == 0){
- mClickTime = System.currentTimeMillis();
- }
- }
- @OnClick(R.id.sure)
- public void clickSure(){
- if (LoginController.getInstance().isCurrentUserAdmin()){
- goFinish();
- }else{
- Dialog loading = new ProgressDialog(this);
- loading.setTitle("正在提交數據");
- loading.show();
- new SimpleRequest<>()
- .request(this, GameController.getInstance().addAnswer(mResGameInfo.playGameId, mPractiseNumbers, mRecordList, mResponseList, mPressRecordList, mSpecialNumberOne, mSpecialNumberTwo, mGameInfo.gameVersion, mStartTime, mEndTime, mNPRight.getProgress(), mNPGrasp.getProgress()), "提交數據失敗!請檢查網絡狀態", loading, new SimpleRequest.Executor<Object>() {
- @Override
- public void execute(Object obj) {
- goFinish();
- }
- });
- }
- }
- private void goFinish(){
- hideAllView();
- mTVPreGameHint.setGravity(Gravity.CENTER);
- mTVPreGameHint.setText("數據提交成功\n\n謝謝參與");
- mTVPreGameHint.setVisibility(View.VISIBLE);
- new Handler(Looper.getMainLooper(), new Handler.Callback() {
- @Override
- public boolean handleMessage(@NonNull Message message) {
- finish();
- return true;
- }
- }).sendEmptyMessageDelayed(0, 3000);
- }
- private void startPrePractise(){
- hideAllView();
- mSpecialNumberOne = getRandomNumber();
- mSpecialNumberTwo = getRandomNumber(mSpecialNumberOne);
- mCurrentPreGameCountDown = mGameInfo.getPractiseDurationSecond();
- mPreGameHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
- @Override
- public boolean handleMessage(@NonNull Message message) {
- if (mCurrentPreGameCountDown > 0){
- mTVPreGameHint.setVisibility(View.VISIBLE);
- mTVPreGameHint.setGravity(Gravity.START);
- mTVPreGameHint.setText(Html.fromHtml(getPrePractiseText(mSpecialNumberOne, mSpecialNumberTwo, mCurrentPreGameCountDown), Html.FROM_HTML_MODE_LEGACY));
- mCurrentPreGameCountDown --;
- mPreGameHandler.sendEmptyMessageDelayed(0, 1000);
- }else{
- mTVPreGameHint.setVisibility(View.GONE);
- startGame(true);
- }
- return true;
- }
- });
- mPreGameHandler.sendEmptyMessage(0);
- }
- private String getPreGameText(int countDown){
- return String.format(Locale.TRADITIONAL_CHINESE,"練習結束,<br/><br/><font color='#cc0000'>%1$d</font>秒后進入正式測試",
- countDown);
- }
- private String getPrePractiseText(int numberOne, int numberTwo, int countDown){
- switch (mGameInfo.gameVersion){
- case GameInfo.VERSION_GAME_ONE:
- return String.format(Locale.TRADITIONAL_CHINESE,"當屏幕出現數字<font color='#cc0000'>%1$d</font>的時候,<br/>請您以最快的速度按下<br/><br/>正式開始前,會有小段練習<br/><br/><font color='#cc0000'>%2$d</font>秒后進入練習", mSpecialNumberOne, countDown);
- case GameInfo.VERSION_GAME_TWO:
- return String.format(Locale.TRADITIONAL_CHINESE,"當數字<font color='#cc0000'>%1$d</font>,<font color='#cc0000'>%2$d</font>連續出現時,<br/><font color='#cc0000'>%1$d</font>出現時不要按下,<br/><font color='#cc0000'>%2$d</font>出現時,<br/>請您以最快的速度按下<br/><br/>正式開始前,會有小段練習<br/><br/><font color='#cc0000'>%3$d</font>秒后進入練習",
- numberOne, numberTwo, countDown);
- case GameInfo.VERSION_GAME_THREE:
- return String.format(Locale.TRADITIONAL_CHINESE,"除數字<font color='#cc0000'>%1$d</font>以外的數字出現時,<br/>請您以最快的速度按下<br/><br/>正式開始前,會有小段練習<br/><br/><font color='#cc0000'>%2$d</font>秒后進入練習",
- numberOne, countDown);
- default:
- return "";
- }
- }
- private void startGame(boolean isPractise){
- hideAllView();
- mPractiseNumbers = getPractiseNumbers(isPractise ? mGameInfo.practiseRightNumber : mGameInfo.correctNumberOccurrenceNumber, isPractise ? mGameInfo.practiseOccurrenceNumber : mGameInfo.errorNumberOccurrenceNumber);
- mRecordList = new ArrayList<>();
- mResponseList = new ArrayList<>();
- mPressRecordList = new ArrayList<>();
- mCurrentPractiseIndex = 0;
- restoreClickInfo(false);
- mPractiseHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
- @Override
- public boolean handleMessage(@NonNull Message message) {
- switch (message.what){
- case 0:
- if (mCurrentPractiseIndex == mPractiseNumbers.length){
- restoreClickInfo(false);
- if (isPractise)
- startPregame();
- else
- startFeedBack();
- }else{
- restoreClickInfo(true);
- mCurrentTime = System.currentTimeMillis();
- mTVNumber.setVisibility(View.VISIBLE);
- mTVGameHint.setVisibility(View.GONE);
- mTVNumber.setText(String.valueOf(mPractiseNumbers[mCurrentPractiseIndex]));
- mPractiseHandler.sendEmptyMessageDelayed(1, mGameInfo.displayDuration);
- }
- break;
- case 1:
- mTVNumber.setVisibility(View.GONE);
- if (isPractise) {
- mTVGameHint.setText(Html.fromHtml(getGameHint(), Html.FROM_HTML_MODE_LEGACY));
- mTVGameHint.setVisibility(View.VISIBLE);
- }else {
- int result = getClickResult();
- mRecordList.add(result);
- mPressRecordList.add(mClickTime == 0 ? 0 : 1);
- if (mClickTime != 0 && result == GameInfo.CLICK_RIGHT)
- mResponseList.add(mClickTime - mCurrentTime);
- else
- mResponseList.add(-1L);
- }
- restoreClickInfo(false);
- mCurrentPractiseIndex ++;
- mPractiseHandler.sendEmptyMessageDelayed(0, mGameInfo.intervalDuration);
- break;
- }
- return true;
- }
- });
- mPractiseHandler.sendEmptyMessage(0);
- }
- private void startPregame(){
- hideAllView();
- mCurrentPreGameCountDown = mGameInfo.getPractiseDurationSecond();
- mPreGameHandler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
- @Override
- public boolean handleMessage(@NonNull Message message) {
- if (mCurrentPreGameCountDown > 0){
- mTVPreGameHint.setVisibility(View.VISIBLE);
- mTVPreGameHint.setGravity(Gravity.CENTER);
- mTVPreGameHint.setText(Html.fromHtml(getPreGameText(mCurrentPreGameCountDown), Html.FROM_HTML_MODE_LEGACY));
- mCurrentPreGameCountDown --;
- mPreGameHandler.sendEmptyMessageDelayed(0, 1000);
- }else{
- mTVPreGameHint.setVisibility(View.GONE);
- startGame(false);
- }
- return true;
- }
- });
- mPreGameHandler.sendEmptyMessage(0);
- }
- private void startFeedBack(){
- hideAllView();
- mCLForm.setVisibility(View.VISIBLE);
- mEndTime = System.currentTimeMillis();
- startWatch();
- }
- private String getGameHint(){
- String result;
- int clickResult = getClickResult();
- result = clickResult == GameInfo.CLICK_RIGHT ? "正確" : (clickResult == GameInfo.CLICK_WRONG ? "錯誤" : "錯失");
- if (mClickTime != 0 && clickResult == GameInfo.CLICK_RIGHT)
- result += String.format(Locale.TRADITIONAL_CHINESE, "<br/>反應時間: <font color='#cc0000'>%1$d</font> 毫秒", mClickTime - mCurrentTime);
- return result;
- }
- private int getClickResult(){
- int preNumber = mCurrentPractiseIndex == 0 ? -1 : mPractiseNumbers[mCurrentPractiseIndex - 1];
- int currentNumber = mPractiseNumbers[mCurrentPractiseIndex];
- if (mGameInfo.gameVersion == GameInfo.VERSION_GAME_ONE){
- if (mClickTime == 0){
- if (mSpecialNumberOne == currentNumber)
- return GameInfo.CLICK_MISS;
- else
- return GameInfo.CLICK_RIGHT;
- }else{
- if (mSpecialNumberOne == currentNumber)
- return GameInfo.CLICK_RIGHT;
- else
- return GameInfo.CLICK_WRONG;
- }
- }else if(mGameInfo.gameVersion == GameInfo.VERSION_GAME_TWO){
- if (preNumber < 0 && mClickTime != 0)
- return GameInfo.CLICK_WRONG;
- if (mClickTime == 0){
- if (preNumber == mSpecialNumberOne && currentNumber == mSpecialNumberTwo)
- return GameInfo.CLICK_MISS;
- else
- return GameInfo.CLICK_RIGHT;
- }else{
- if (preNumber == mSpecialNumberOne && currentNumber == mSpecialNumberTwo)
- return GameInfo.CLICK_RIGHT;
- else
- return GameInfo.CLICK_WRONG;
- }
- }else if(mGameInfo.gameVersion == GameInfo.VERSION_GAME_THREE){
- if (mClickTime == 0){
- if (mSpecialNumberOne == currentNumber)
- return GameInfo.CLICK_RIGHT;
- else
- return GameInfo.CLICK_MISS;
- }else{
- if (mSpecialNumberOne == currentNumber)
- return GameInfo.CLICK_WRONG;
- else
- return GameInfo.CLICK_RIGHT;
- }
- }
- return GameInfo.CLICK_MISS;
- }
- private Integer[] getPractiseNumbers(int rightNumber, int otherNumberOccurrence){
- List<Integer> result = new ArrayList<>();
- for (int i = 0; i < otherNumberOccurrence; i ++)
- result.add(mGameInfo.gameVersion != GameInfo.VERSION_GAME_TWO ? getRandomNumber(mSpecialNumberOne) : getRandomNumber());
- int less = 0;
- if (mGameInfo.gameVersion == GameInfo.VERSION_GAME_TWO && result.size() > 1)
- for(int i = 0; i < result.size(); i ++){
- if (i != result.size() - 1){
- if (result.get(i) == mSpecialNumberOne && result.get(i + 1) == mSpecialNumberTwo)
- less ++;
- }
- }
- if (less > rightNumber)
- return getPractiseNumbers(rightNumber, otherNumberOccurrence);
- for (int i = 0; i < rightNumber - less; i ++) {
- int index = (int) (Math.random() * result.size());
- if (mGameInfo.gameVersion != GameInfo.VERSION_GAME_TWO)
- result.add(index, mSpecialNumberOne);
- else{
- if (index != result.size() - 1 && (result.get(index) == mSpecialNumberOne && result.get(index + 1) == mSpecialNumberTwo)){
- i--;
- continue;
- }
- result.add(index, mSpecialNumberOne);
- result.add(index + 1, mSpecialNumberTwo);
- }
- }
- return result.toArray(new Integer[0]);
- }
- private void restoreClickInfo(boolean clickable){
- mClickable = clickable;
- mClickTime = 0;
- mCurrentTime = 0;
- }
- private int getRandomNumber(){
- return (int)(Math.random() * 10);
- }
- private int getRandomNumber(int number){
- int value = getRandomNumber();
- return value == number ? getRandomNumber(number) : value;
- }
- private void hideAllView(){
- ConstraintLayout rootView = getWindow().getDecorView().findViewById(R.id.root);
- for (int i = 0; i < rootView.getChildCount(); i ++){
- if (rootView.getChildAt(i).getId() != R.id.click_area)
- rootView.getChildAt(i).setVisibility(View.GONE);
- }
- }
- public static void LAUNCH_GAME_ONE(Activity context, GameInfo gameInfo){
- Intent intent = new Intent(context, GameActivity.class);
- intent.putExtra(PARAM_GAME_INFO, gameInfo);
- context.startActivity(intent);
- }
- public static void LAUNCH_GAME(Activity context, ResGameInfo resGameInfo){
- Intent intent = new Intent(context, GameActivity.class);
- intent.putExtra(PARAM_GAME_INFO, resGameInfo.getGameInfo());
- intent.putExtra(PARAM_RES_GAME_INFO, resGameInfo);
- context.startActivity(intent);
- }
- }
|