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