2

Hi I'm new to programming, I know there is probably some easy answer to this but cant quite get there.

So basically I want to know if the background image for two buttons match and if they do disable them (or some other function). Heres my code, for the moment I am focusing on Button1 and Button2.

Look at the end method, I know if wont work but thats what im trying to do. Thanks.

package com.example.pairsgame;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);}


    public final static int Button_Count = 12;

    private Button[] Buttons = new Button[Button_Count];
    {

        Buttons[0] = (Button) findViewById(R.id.Button1);
        Buttons[1] = (Button) findViewById(R.id.Button2);
        Buttons[2] = (Button) findViewById(R.id.Button3);
        Buttons[3] = (Button) findViewById(R.id.Button4);
        Buttons[4] = (Button) findViewById(R.id.Button5);
        Buttons[5] = (Button) findViewById(R.id.Button6);
        Buttons[6] = (Button) findViewById(R.id.Button7);
        Buttons[7] = (Button) findViewById(R.id.Button8);
        Buttons[8] = (Button) findViewById(R.id.Button9);
        Buttons[9] = (Button) findViewById(R.id.Button10);
        Buttons[10] = (Button) findViewById(R.id.Button11);
        Buttons[11] = (Button) findViewById(R.id.Button12);

        Buttons[0].setOnClickListener(this);
        Buttons[1].setOnClickListener(this);
        Buttons[2].setOnClickListener(this);
        Buttons[3].setOnClickListener(this);
        Buttons[4].setOnClickListener(this);
        Buttons[5].setOnClickListener(this);
        Buttons[6].setOnClickListener(this);
        Buttons[7].setOnClickListener(this);
        Buttons[8].setOnClickListener(this);
        Buttons[9].setOnClickListener(this);
        Buttons[10].setOnClickListener(this);
        Buttons[11].setOnClickListener(this);

    }

    public static int Background_Total = 8;

    public final static int[] Backgrounds = { R.drawable.ic_launcher };

    public final static int[] Game_Board = {

    0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };

    @Override
    public void onClick(View v) {

        for (final int but = 0; but < Button_Count; but++) {
            if (v == Buttons[but]) {
                new CountDownTimer(1000, 500) {

                    public void onTick(long millisUntilFinished) {
                        Buttons[but].setBackgroundResource(Backgrounds[Game_Board[but]]);
                    }

                    public void onFinish() {
                        Buttons[but].setBackgroundResource(android.R.drawable.btn_default);
                    }
                }.start();
                if (Game_Board[0] == Game_Board[2])
                    Buttons[0].setEnabled(false);
                Buttons[2].setEnabled(false);
            }
        }

    }
}
4

2 回答 2

2

您通常希望将数据与其表示分离。这有许多明显的好处,其中之一就是可以轻松测试数据,而不必担心数据的可视化表示。

首先,您需要将按钮存储在数组中,如下所示:

public final static int BUTTON_COUNT = 12; 

private Button[] buttons = new Button[BUTTON_COUNT];

Button[0] = (Button)findViewById( R.id.Button1 );           // Button 1
Button[1] = (Button)findViewById( R.id.Button2 );           // Button 2
Button[2] = (Button)findViewById( R.id.Button3 );           // Button 3
Button[3] = (Button)findViewById( R.id.Button4 );           // Button 4
Button[4] = (Button)findViewById( R.id.Button5 );           // Button 5
Button[5] = (Button)findViewById( R.id.Button6 );           // Button 6
Button[6] = (Button)findViewById( R.id.Button7 );           // Button 7
Button[7] = (Button)findViewById( R.id.Button8 );           // Button 8
Button[8] = (Button)findViewById( R.id.Button9 );           // Button 9
Button[9] = (Button)findViewById( R.id.Button10 );          // Button 10
Button[10] = (Button)findViewById( R.id.Button11 );         // Button 11
Button[11] = (Button)findViewById( R.id.Button12 );         // Button 12

这将极大地增强您使用它们的方式,正如您将在 onClick() 中看到的那样。

接下来,您需要定义您想要多少个独特的背景,以及代表每个背景的图像:

public final static int BACKGROUND_TOTAL = 8;

public final static int[] BACKGROUNDS = {
   R.drawable.ic_launcher,                           // Image 0
   R.drawable.ic_launcher2,                          // Image 1
   R.drawable.ic_launcher3,                          // Image 2
   R.drawable.ic_launcher4,                          // Image 3
   R.drawable.ic_launcher5,                          // Image 4
   R.drawable.ic_launcher6,                          // Image 5
   R.drawable.ic_launcher7,                          // Image 6
   R.drawable.ic_launcher8                           // Image 7
};

您还需要定义“游戏板”的外观。这将做的是将图像与您的每个按钮“关联”。这可以通过一百万种不同的方式完成,但作为示例,让我们使用一个固定数组。请注意,这些条目中的每一个都将匹配您的一个按钮:

 public final static int[] GAME_BOARD = {
    0,                                         // Button 1
    0,                                         // Button 2
    1,                                         // Button 3
    1,                                         // Button 4        
    2,                                         // Button 5
    2,                                         // Button 6        
    3,                                         // Button 7
    3,                                         // Button 8        
    4,                                         // Button 9
    4,                                         // Button 10       
    5,                                         // Button 11
    5,                                         // Button 12       
 };

这里的每个值都是背景数组中的一个“索引”。所以所有值必须在 0 和 (BACKGROUND_TOTAL-1) 之间。请注意,我只是添加了顺序对,但显然对于真正的游戏,您需要在此处生成随机值。在上面的示例中,按钮 3 将使用图像 1,按钮 9 将使用图像 4,依此类推。

有了所有这些信息,这就是您的 onClick 的样子:

@Override
public void onClick(View v) {    

   if ( v == buttons[0] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[0].setBackgroundResource( BACKGROUNDS[GAME_BOARD[0]] );
         }

         public void onFinish() {
             buttons[0].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[1] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[1].setBackgroundResource( BACKGROUNDS[GAME_BOARD[1]] );
         }

         public void onFinish() {
             buttons[1].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[2] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[2].setBackgroundResource( BACKGROUNDS[GAME_BOARD[2]] );
         }

         public void onFinish() {
             buttons[2].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[3] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[3].setBackgroundResource( BACKGROUNDS[GAME_BOARD[0]] );
         }

         public void onFinish() {
             buttons[3].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[4] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[4].setBackgroundResource( BACKGROUNDS[GAME_BOARD[4]] );
         }

         public void onFinish() {
             buttons[4].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[5] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[5].setBackgroundResource( BACKGROUNDS[GAME_BOARD[5]] );
         }

         public void onFinish() {
             buttons[5].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[6] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[6].setBackgroundResource( BACKGROUNDS[GAME_BOARD[6]] );
         }

         public void onFinish() {
             buttons[6].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[7] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[7].setBackgroundResource( BACKGROUNDS[GAME_BOARD[7]] );
         }

         public void onFinish() {
             buttons[7].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[8] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[8].setBackgroundResource( BACKGROUNDS[GAME_BOARD[8]] );
         }

         public void onFinish() {
             buttons[8].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[9] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[9].setBackgroundResource( BACKGROUNDS[GAME_BOARD[9]] );
         }

         public void onFinish() {
             buttons[9].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[10] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[10].setBackgroundResource( BACKGROUNDS[GAME_BOARD[10]] );
         }

         public void onFinish() {
             buttons[10].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[11] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[11].setBackgroundResource( BACKGROUNDS[GAME_BOARD[11]] );
         }

         public void onFinish() {
             buttons[11].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
   if ( v == buttons[12] )  {
      new CountDownTimer(1000, 500) {
         public void onTick(long millisUntilFinished) {
             buttons[12].setBackgroundResource( BACKGROUNDS[GAME_BOARD[12]] );
         }

         public void onFinish() {
             buttons[12].setBackgroundResource( android.R.drawable.btn_default );
         }
      }.start();       
   }
}

最后,您可以简单地使用以下命令来测试两个按钮是否具有相同的背景,而不是匹配图像:

if ( GAME_BOARD[button1] == GAME_BOARD[button2] )
   // disable both buttons

在这种情况下 button1 和 button2 应该是其数组中按钮的索引值。

虽然这是一个粗略的例子,但它应该能让你走上以不同的、更合适的方式思考问题的道路上。祝你好运!

于 2013-05-30T09:49:07.087 回答
0

您的逻辑可能不应该依赖于按钮的背景图像,它们是 UI 元素,它们应该与您的游戏逻辑分离(关注点分离)。

我要做的是在内存中的某个地方(Application也许?)保留一个结构,该结构“知道”哪个图像被设置为每个按钮的背景,并使用它来比较和驱动链接按钮的禁用:而不是尝试比较两个 UI 元素,您可以有一个普通类,其中包含您编写的方法来比较两个图像对象(可能来自某种 ID?),然后相应地设置按钮。

除了其他好处(关注点分离、更清晰的设计等)之外,这将使您的逻辑可测试。

于 2013-05-29T15:19:34.463 回答