1

如果方法为真,有什么方法可以暂停计时器。我创建了一个简单的拼图游戏并添加了一个计时器来显示时间流逝,我试图在解决难题时停止计时器。运行时,应用程序运行平稳,计时器在滴答作响,但在游戏结束时不会停止解决了。任何形式的帮助将不胜感激。这是代码;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_menu);
    chronometer  = findViewById(R.id.chronometer);

    stopChronometer();
    startChronometer();
    isSolved();
}

public static boolean isSolved() {
    boolean solved = false;
    for (int i = 0; i < tileList.length; i++) {
        if (tileList[i].equals(String.valueOf(i))) {
            solved = true;
        } else {
            solved = false;
            break;
        }
    }
    return solved;
}
//to start the chronometer
public void startChronometer(){
    if(!running){
        chronometer.setBase(SystemClock.elapsedRealtime());
        chronometer.start();
        running = true;
    }
}
//to stop the chronometer
public void stopChronometer(){
    if(running && isSolved()){
        chronometer.stop();
        running =false;
    }
}

如果对整个代码感兴趣;

import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Button;
import java.lang.*;
import java.util.ArrayList;
import java.util.Random;
import android.widget.Chronometer;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    //GestureDetectView* is the class where the puzzle grid is setup
    private static GestureDetectGridView mGridView;
    private static final int COLUMNS =3;
    private static final int DIMENSIONS = COLUMNS * COLUMNS;
    private static int mColumnWidth, mColumnHeight;
    //up, down, left, right are tile movements
    public static final String up = "up";
    public static final String down = "down";
    public static final String left = "left";
    public static final String right = "right";
    private static String[] tileList;

    private Chronometer chronometer;
    private boolean running;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer  = findViewById(R.id.chronometer);
        init();
        scramble();
        setDimensions();
        stopChronometer();
        startChronometer();
    }

    //to start the chronometer
    public void startChronometer(){
        if(!running){
            chronometer.setBase(SystemClock.elapsedRealtime());
            chronometer.start();
            running = true;
        }
    }
    //to stop the chronometer * PROBLEM AREA
    public void stopChronometer(){

    if(running && isSolved()){
        chronometer.stop();
        running =false;
        }
    }
    //Grid view from GestureDetectView class
    private void init() {
        mGridView = (GestureDetectGridView) findViewById(R.id.grid);
            mGridView.setNumColumns(COLUMNS);
        tileList = new String[DIMENSIONS];
        for (int i = 0; i < DIMENSIONS; i++) {
            tileList[i] = String.valueOf(i);
        }
    }
    //To shuffle the grid pieces
    private void scramble() {
        int index;
        String temp;
        Random random = new Random();

        for (int i = tileList.length -1; i > 0; i--) {
                index = random.nextInt(i + 1);
                temp = tileList[index];
                tileList[index] = tileList[i];
                tileList[i] = temp;
            }

        }
private void setDimensions() {
    ViewTreeObserver vto = mGridView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            int displayWidth = mGridView.getMeasuredWidth();
            int displayHeight = mGridView.getMeasuredHeight();

            int statusbarHeight = getStatusBarHeight(getApplicationContext());
            int requiredHeight = displayHeight - statusbarHeight;

            mColumnWidth = displayWidth / COLUMNS;
            mColumnHeight = requiredHeight / COLUMNS;

            display(getApplicationContext());
                }
        });
    }

    private int getStatusBarHeight(Context context) {
        int result = 0;
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen",
            "android");

        if (resourceId > 0) {
         result = context.getResources().getDimensionPixelSize(resourceId);
        }

        return result;
 }
    //To determine if puzzle is solved
    public static boolean isSolved() {
        boolean solved = false;
        for (int i = 0; i < tileList.length; i++)
        {
                if (tileList[i].equals(String.valueOf(i))) {
                solved = true;
            }   else {
                solved = false;
                break;
                }
        }
        return solved;
    }
    private static void swap(Context context, int Position, int swap) {
        String newPosition = tileList[Position + swap];
        tileList[Position + swap] = tileList[Position];
        tileList[Position] = newPosition;
        display(context);
        if (isSolved()) {
            Toast.makeText(context, "CONGRATULATIONS, YOU WIN!", Toast.LENGTH_SHORT).show();
        }
    }
//To source the image pieces and add them to the puzzle grid
    private static void display(Context context) {
        ArrayList<Button> buttons = new ArrayList<>();
        Button button;

        for (int i = 0; i < tileList.length; i++) {
            button = new Button(context);

            if (tileList[i].equals("0"))
                button.setBackgroundResource(R.drawable.piece1);
            else if (tileList[i].equals("1"))
                button.setBackgroundResource(R.drawable.piece2);
            else if (tileList[i].equals("2"))
                button.setBackgroundResource(R.drawable.piece3);
            else if (tileList[i].equals("3"))
                button.setBackgroundResource(R.drawable.piece4);
            else if (tileList[i].equals("4"))
                button.setBackgroundResource(R.drawable.piece5);
            else if (tileList[i].equals("5"))
                button.setBackgroundResource(R.drawable.piece6);
            else if (tileList[i].equals("6"))
                button.setBackgroundResource(R.drawable.piece7);
            else if (tileList[i].equals("7"))
                button.setBackgroundResource(R.drawable.piece8);
            else if (tileList[i].equals("8"))
                button.setBackgroundResource(R.drawable.piece9);

            buttons.add(button);

        }

        mGridView.setAdapter(new CustomAdapter(buttons, mColumnWidth, mColumnHeight));
    }

    public static void moveTiles(Context context, String direction, int position) {

        // Upper-left-corner tile
        if (position == 0) {

            if (direction.equals(right)) swap(context, position, 1);
            else if (direction.equals(down)) swap(context, position, COLUMNS);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Upper-center tiles
        }   else if (position > 0 && position < COLUMNS - 1) {
            if (direction.equals(left)) swap(context, position, -1);
            else if (direction.equals(down)) swap(context, position, COLUMNS);
            else if (direction.equals(right)) swap(context, position, 1);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Upper-right-corner tile
        }   else if (position == COLUMNS - 1) {
            if (direction.equals(left)) swap(context, position, -1);
            else if (direction.equals(down)) swap(context, position, COLUMNS);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Left-side tiles
        } else if (position > COLUMNS - 1 && position < DIMENSIONS - COLUMNS &&
            position % COLUMNS == 0) {
            if (direction.equals(up)) swap(context, position, -COLUMNS);
            else if (direction.equals(right)) swap(context, position, 1);
            else if (direction.equals(down)) swap(context, position, COLUMNS);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Right-side AND bottom-right-corner tiles
        } else if (position == COLUMNS * 2 - 1 || position == COLUMNS * 3 -1) 
          {
            if (direction.equals(up)) swap(context, position, -COLUMNS);
            else if (direction.equals(left)) swap(context, position, -1);
            else if (direction.equals(down)) {

            // Tolerates only the right-side tiles to swap downwards as opposed to the bottom-
            // right-corner tile.
            if (position <= DIMENSIONS - COLUMNS - 1) swap(context, position,
                    COLUMNS);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();
            } else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Bottom-left corner tile
        } else if (position == DIMENSIONS - COLUMNS) {
            if (direction.equals(up)) swap(context, position, -COLUMNS);
            else if (direction.equals(right)) swap(context, position, 1);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Bottom-center tiles
        } else if (position < DIMENSIONS - 1 && position > DIMENSIONS - COLUMNS) {
            if (direction.equals(up)) swap(context, position, -COLUMNS);
            else if (direction.equals(left)) swap(context, position, -1);
            else if (direction.equals(right)) swap(context, position, 1);
            else Toast.makeText(context, "Invalid move", Toast.LENGTH_SHORT).show();

            // Center tiles
        } else {
            if (direction.equals(up)) swap(context, position, -COLUMNS);
            else if (direction.equals(left)) swap(context, position, -1);
            else if (direction.equals(right)) swap(context, position, 1);
            else swap(context, position, COLUMNS);
        }
    }


    @Override
protected void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);


    }

}
4

2 回答 2

0
public void stopChronometer() {
    if(running && isSolved()){
        chronometer.stop();
        running =false;
    }
}

改成

public void stopChronometer(){
    if(running || isSolved()){
        chronometer.stop();
        running =false;
    }
}

或者你可以从 isSolved() 方法调用 stopChronometer() (你必须从 stopChronometer 中删除 isSolved() )。没有看到完整的代码,很难回答。

于 2018-07-17T22:58:40.127 回答
-1

我找到了解决方案问题是我没有声明方法 start Chronometer()、chronomer 并以静态方式运行。感谢您的帮助

于 2018-07-18T02:07:14.750 回答