Android: 如何检查两个点击按钮中的两个数字是否相等(记忆游戏)?

Android: How to check if two numbers in two clicked buttons are equal (memory game)?

有人可以告诉我如何检查两个数字是否相等吗? 我正在制作记忆游戏进行练习。用户单击一个显示一个数字的按钮,然后单击另一个显示第二个数字的按钮。 如何检查这两个数字是否相同,因为如果它们相同则需要保持可见,如果它们不相同则需要再次隐藏。

我的适配器:

package com.example.korisnik.assignment;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import java.util.ArrayList;
import java.util.Collections;

public class ButtonAdapter extends BaseAdapter {

Button[] buttons;
public Context c;

public ButtonAdapter(Context c) {
    final ArrayList<Integer> numbers = new ArrayList<Integer>();
    for (int i=1; i<=5; i++) {
        numbers.add(i);
    }
    for (int i=1; i<=4; i++) {
        numbers.add(i);
    }
    Collections.shuffle(numbers);
    this.c = c;
    buttons = new Button[9];
    for(int i=0;i<buttons.length;i++) {
        final int o = i;
        buttons[i] = new Button(c);
        buttons[i].setBackgroundResource(R.mipmap.block);
        buttons[i].setLayoutParams(new GridView.LayoutParams(300,300));
        buttons[i].setTag(0);
        buttons[i].setTextSize(20);
        buttons[i].setText("X");
        buttons[i].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button btn = (Button) v;
                btn.setText(String.valueOf(numbers.get(o)));
            }
        });
    }
}

@Override
public int getCount() {
    return buttons.length;
}

@Override
public Object getItem(int i) {
    return buttons[i];
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    return buttons[i];
}
}

试试这个代码。

public class ButtonAdapter extends BaseAdapter {

Button[] buttons;
public Context c;
//Store previous clicked number
private String mPreviousvValue;

public ButtonAdapter(final Context c) {
    final ArrayList<Integer> numbers = new ArrayList<Integer>();
    for (int i = 1; i <= 5; i++) {
        numbers.add(i);
    }
    for (int i = 1; i <= 4; i++) {
        numbers.add(i);
    }
    Collections.shuffle(numbers);
    this.c = c;
    buttons = new Button[9];
    for (int i = 0; i < buttons.length; i++) {
        final int o = i;
        buttons[i] = new Button(c);
        buttons[i].setBackgroundResource(R.mipmap.block);
        buttons[i].setLayoutParams(new GridView.LayoutParams(300, 300));
        buttons[i].setTag(0);
        buttons[i].setTextSize(20);
        buttons[i].setText("X");
        buttons[i].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String currentValue = String.valueOf(numbers.get(o));
                Button btn = (Button) v;
                if(mPreviousvValue!=null){
                 if (mPreviousvValue.equalsIgnoreCase(currentValue)) {
                    // Show Numbers equal
                  } else {
                    // Show Numbers not equal
                  }
                }
                btn.setText(currentValue);
                mPreviousvValue = currentValue;
            }
        });
    }
}

@Override
public int getCount() {
    return buttons.length;
}

@Override
public Object getItem(int i) {
    return buttons[i];
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    return buttons[i];
}
}

编辑 1: 说明

将其添加为全局变量以存储之前单击的值

private String mPreviousvValue; 

然后在onclick中检查点击按钮的当前值是否等于之前的值。

 @Override
  public void onClick(View v) {
      String currentValue = String.valueOf(numbers.get(o));
      Button btn = (Button) v;
      if(mPreviousvValue!=null){
       if (mPreviousvValue.equalsIgnoreCase(currentValue)) {
          // Show Numbers equal
        } else {
          // Show Numbers not equal
         }
       }
       btn.setText(currentValue);
       mPreviousvValue = currentValue;
  }

编辑 2: 正如您要求在按钮值不同时清除旧视图

添加一个 public 变量来存储之前的按钮位置

private int mPreviousPos=-1; 

然后在 onclick 中存储第一次单击的按钮位置,当用户第二次单击时,如果值不相等,则从数组中获取按钮引用并清除两者,如代码所示。

 @Override
                public void onClick(View v) {
                    String currentValue = String.valueOf(numbers.get(o));
                    Button btn = (Button) v;
                    if(mPreviousvValue!=null && mPreviousPos!=-1){
                        if (mPreviousvValue.equalsIgnoreCase(currentValue)) {

                            // Show Numbers equal
                        } else {
                            // Show Numbers not equal
                            //Clear previous button
                            Button button=buttons[mPreviousPos];
                            button.setText("X");

                        }
                    }
                    btn.setText(currentValue);
                    mPreviousvValue = currentValue;
                    mPreviousPos=o;
                }

试试这个: 首先创建一个新的 Class

游戏按钮:

   public class GameButton{
                final Button button;
                boolean isOpen;
                final String hiddenNumber //may int suit for you too
                public GameButton(Button b, String number,boolean isOpen){
                  this.button=b;
                  this.number=number;
                  this.isOpen=isOpen;

        }

       public void updateState(boolean isOpen){
         this.isOpen=isOpen
     }

        public boolean isSame(GameButton gameButton){
           return this.number.equals(gameButton.number)&&!gameButton.isOpen;
        }
    }

然后在您的适配器 class 中创建一个数组,并保留一个变量,如 GameButton lastSelectedBtn,您在没有按下任何按钮时设置该变量,并且您想记住上次用户的选择。然后在任何其他按钮的 onClick 事件中,您只需检查是否有任何按钮打开,如果没有,则

lastSelectedButton = pressedButton;
lastSelectedButton.updateState(true)

如果打开任何按钮(应该只有一个),请执行以下操作:

if(pressedButton.isSame(lastSelectedBtn)){

//bingo

}else{

// 

}

您可以试试这个(根据@Antonis_Lat 的建议):

适配器

public class ButtonAdapter extends BaseAdapter implements View.OnClickListener {

    private GameButton mPrevious;
    // Other necessary fields
    // ...

    public ButtonAdapter(Context c) {
       // Array initialisation
       // ...

        buttons = new GameButton[9];
        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new GameButton(c, "X", numbers.get(i));
            buttons[i].setBackgroundResource(R.mipmap.block);
            buttons[i].setLayoutParams(new GridView.LayoutParams(300, 300));
            buttons[i].setTag(0);
            buttons[i].setTextSize(20);
            buttons[i].setOnClickListener(ButtonAdapter.this);
        }
    }

    // The Adapter implements the interface to prevent to instantiate of a listener for each button.
    @Override
    public void onClick(View v) {
        GameButton btn = (GameButton) v;
        btn.showNumber(); // Show the number on the current button
        // You can implement it like that if you want both buttons to stay displayed when similar or
        // be hidden when different
        if (mPrevious == null) {
            mPrevious = btn;
        } else {
            // If not the same
            if (!btn.isSame(mPrevious)) {
                btn.hideNumber();
                mPrevious.hideNumber();
            }
            mPrevious = null; // Reset previous button as both are now hidden/shown
        }
    }

    // Rest of the Adapter
    //... 
}

按钮class

// Class to manage the button. It extends the AppCompatButton from the 
// Support Library but you can extend the Button class directly
public class GameButton extends AppCompatButton {
    private final String mDefaultText;
    private final int mNumber;

    public GameButton(Context context, String defaultText, int number) {
        super(context);
        mDefaultText = defaultText;
        mNumber = number;
        setText(mDefaultText); // Set the default text to the Button
    }

    public void showNumber() {
        setText(String.valueOf(mNumber));
    }

    public void hideNumber() {
        setText(mDefaultText);
    }

    public boolean isSame(@Nullable GameButton btn) {
        return btn != null && btn.getNumber() == mNumber;
    }

    public int getNumber() {
        return mNumber;
    }
}