【问题标题】:Android: How to check if two numbers in two clicked buttons are equal (memory game)?Android:如何检查两个点击按钮中的两个数字是否相等(记忆游戏)?
【发布时间】:2017-09-19 11:26:28
【问题描述】:

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

我的适配器:

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

【问题讨论】:

  • 在您的适配器中添加一个侦听器类,并在单击按钮时传递按钮的值。这样您就可以在单击第二个按钮时比较数字。

标签: android onclick numbers equals buttonclick


【解决方案1】:

试试这个代码。

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: 正如您要求在按钮值不同时清除旧视图

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

private int mPreviousPos=-1; 

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

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

【讨论】:

  • @Anonymous 你在哪里给“mPreviousvValue”赋值?
  • 在设置按钮文本后..最后..因为第一次点击它将为空。
  • 当您可以直接存储整数时,为什么mPreviousvValue 是字符串?
  • 是的,一切都很好..自从我看到从 Integer 到 String 的类型转换,我想不要让他更加困惑..所以用 String 本身初始化
  • @Anonymous 是的,我后来认为第一次它将为空。好吧,让我先试试你的代码,然后我会回来。
【解决方案2】:

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

【讨论】:

  • 这行得通。但是我怎样才能让它在第二个被点击的按钮上显示数字,如果它们不一样就隐藏它们呢?因为,现在我单击一个按钮,而不是其他按钮,但是当它们不相同时,它不会显示第二个按钮上的数字。当按钮不一样时,有什么办法可以在隐藏按钮上做一些“延迟”?
  • 另外,我应该禁止点击已经打开的按钮
  • 您可以使用 Handler 来管理延迟。请记住,用户将能够同时单击其他内容,因此可能会产生问题。要禁用您的按钮,您可以将 clickable 设置为 false 或将侦听器设置为 null (btn.setOnClickListener(null);)。但在未来我会建议你在提问之前做一些研究,因为已经有很多答案了。如果您被阻止,我们可以为您提供帮助,但我们无法为您编写应用程序。
  • 我明白了。谢谢大家。我同意,但我只是想尽快完成这项任务,因为我的时间不多。
【解决方案3】:

试试这个: 首先新建一个类

游戏按钮:

   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)

如果打开了任何按钮(应该只有一个):

if(pressedButton.isSame(lastSelectedBtn)){

//bingo

}else{

// 

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 2020-02-12
    • 2015-08-21
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多