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