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

Android:如何检查两个点击按钮中的两个数字是否相等(记忆游戏)?,android,onclick,numbers,equals,buttonclick,Android,Onclick,Numbers,Equals,Buttonclick,有人能告诉我如何检查两个数字是否相等吗? 我在做记忆游戏练习。用户单击一个显示一个数字的按钮,而不是单击另一个显示第二个数字的按钮。 如何检查这两个数字是否相同,因为如果它们相同,则需要保持可见,如果它们不相同,则需要再次隐藏 我的适配器: package com.example.korisnik.assignment; import android.content.Context; import android.view.View; import android.view.ViewGroup

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

我的适配器:

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];
}
}
package com.example.korisnik.assignment;
导入android.content.Context;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.Button;
导入android.widget.GridView;
导入java.util.ArrayList;
导入java.util.Collections;
公共类ButtonAdapter扩展BaseAdapter{
按钮[]按钮;
公共环境c;
公共按钮适配器(上下文c){
最终ArrayList编号=新ArrayList();
对于(inti=1;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];
}
}
然后在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: 当您要求在按钮值不相同时清除旧视图时

添加公共变量以存储上一个按钮位置

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;
                }
试试这个: 首先,创建一个新类

游戏按钮:

   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;
        }
    }
然后在适配器类中创建一个数组,并保留一个变量,如
GameButton lastSelectedBtn
,当没有按钮按下时设置该变量,并希望记住用户的最后选择。然后在任何其他按钮的onClick事件中,只需检查是否有任何按钮打开,如果没有,则

lastSelectedButton = pressedButton;
lastSelectedButton.updateState(true)
如果打开任何按钮(应仅为一个),请执行以下操作:

你可以试试这个(根据@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
    //... 
}

在适配器中添加一个侦听器类,并在单击按钮时传递按钮的值。这样,当单击第二个按钮时,您可以比较这些数字。@Anonymous在哪里为“MPPreviousVValue”分配上一个值?设置按钮文本后..在结尾..因为第一次单击它将为空。
mppreviousvvalue
为什么是一个字符串,而你可以直接存储整数?是的,一切都很好..因为我看到了从整数到字符串的类型转换,所以我想不要再把他弄糊涂了..所以用字符串初始化itself@Anonymous是的,我后来想不是第一次它将为空。好吧,让我先试试你的代码,然后我会回来。这是可行的。但是我怎么能让它在第二个按钮上显示被点击的数字,如果它们不相同则隐藏它们呢?因为,现在我点击一个按钮,而不是另一个按钮,但当它们不相同时,它不会在第二个按钮上显示数字。是吗有什么办法可以“拖延”吗当按钮不相同时隐藏按钮?此外,我应该禁用对已打开按钮的单击。您可以使用处理程序来管理延迟。请记住,用户将能够同时单击其他按钮,因此可能会产生问题。要禁用按钮,您可以将
clickable
设置为false或将监听器为null(
btn.setOnClickListener(null);
).但将来我会建议你在提问之前做一些研究,因为已经有很多关于这方面的答案。如果你被阻止,我们可以帮助你,但我们无法为你编写应用程序。我理解。谢谢大家。我同意,但我只是想尽快完成这项任务,因为我时间不够。
if(pressedButton.isSame(lastSelectedBtn)){

//bingo

}else{

// 

}
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 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;
    }
}