2011-09-20 72 views
0

我正在準備一個像拼圖一樣的小遊戲,因爲我在佈局中使用了9個不同圖像的9個圖像視圖。在開始的時候將圖像設置爲imageview,這些都是實際的圖像,洗牌後用戶將滑動圖像以完成拼圖,我想檢查修改後的圖像與實際圖像的天氣是否相等,如果相等彈出消息,就像遊戲一樣。如何檢查拼圖遊戲是否完成?

我試圖象使用圖像(可繪),但不幸的之間的這種

1.by AND運算符。

2.使用setLevel()爲圖像,比較這些setLevel值與滑動仍然不幸運的圖像的getLevel值後這裏的問題是,如果我點擊imageview一次getLevel()給出正確的值,如果我點擊它不止一次給出零值。爲什麼會發生這樣的..

請幫助我,如果你發現我的代碼中任何差錯,否則引導我,很好的技術..

Xml code like this 
<RelativeLayout 
    //9 imageview's 

在java的代碼是這樣 如果用戶點擊的ImageView它會交換圖像的

img_View11.setOnClickListener(new View.OnClickListener() {    
    public void onClick(View v) { 

     if(img_View21.getDrawable() == default_img || 
            img_View12.getDrawable() == default_img) { 

      System.out.println("yes"); 
      ++click; 
      Noof_moves.setText("Moves: " +click); 
      ImageView iv = (ImageView)v;     
      d11 = iv.getDrawable(); 
      prev_img = prev_imgView.getDrawable(); 

      la11 = d11.getLevel(); 
      System.out.println("d11 value is " +la11);     

      prev_imgView.setImageDrawable(d11);     

      img_View11.setImageDrawable(prev_img);     
      prev_imgView = img_View11; 

      check(); 
      } 
     else { System.out.println("no"); } 
     } 
    }); 

void check(){ 

    System.out.println("in checking condition"); 
    if((lb11==la11) && (lb12==la12) && (lb13==la13) && (lb21==la21) && (lb22==la22) 
     && (lb23==la23) && (lb31==la31) && (lb32==la32) && (lb33==la33)) { 
      Context c = getBaseContext(); 
      System.out.println("gameover"); 
      Toast.makeText(c, " GameOver ", Toast.LENGTH_SHORT).show(); 
    }else{ System.out.println(" codition not checked "); } 
} 
//here lb=level before sliding 
//  la=level after sliding.. 
+0

和一些代碼的東西,你是如何嘗試... –

+0

你的拼圖使用拼圖形狀或正方形嗎?如果拼圖,分享你如何做到這一點? – portfoliobuilder

回答

5

好吧,這裏是你的解決方案做什麼。

  1. 維護一組新的可繪製標記,將它們標記爲最初的原始可繪製對象。 可能像

drawable og11 = imageView11.getDrawable(); 在洗牌之前做這個部分。現在你有了可繪製的原始繪圖,以drawable的形式存儲。

  1. 每次點擊後,檢查og11 == imageView11。getDrawable(),...等等,如果匹配,匹配,否則,他們不匹配。

HTH。

+0

好的,謝謝.. –

0

當您使用==運算符時,它們檢查兩個對象是否引用相同的對象。但在你的情況下,他們是2個不同的對象。

您應該爲實際圖像和其他圖像設置標籤。並檢查它們是否都是相同的。這應該在你的條件下工作。

對於drawable類,我注意到了一個方法setLevel和getLevel。您可能可以將其用於您的要求。

+0

都是可繪製的,如何設置標籤圖像,我知道如何設置標籤imageview .. –

+0

嗯,好吧,似乎沒有建成的方法。您可以擴展可繪製並自己添加標記功能。或者你可以將drawable設置爲imageview。這實際上之前,我做了一個搜索後詢問http://stackoverflow.com/questions/4420727/drawable-drawable – blessenm

+0

我也更新我的答案與另一種可能的方法。 – blessenm

0

你爲什麼不使用gridView?並在每次更改後,只檢查項目,看看圖像是按照所需的順序

+0

我也試過gridview,我在檢查滑動時遇到問題。並從imageview中獲取圖像。 –

+0

使用適配器並在適配器中添加圖像並設置標籤,如「image_11」。並檢查標籤,看看圖像是在所需的順序 –

+0

,請幫助我如何使用gridview來實現這一目標... –

2

我有一個簡單的解決方案。在猜謎之前(在準備拼圖之前),使用View.setTag(索引)將序列號Integer標記設置爲ImageViews。然後,每次用戶進行移動時,循環遍歷所有圖像瀏覽並檢查它們是否有序。如果不按順序,那麼拼圖還沒有完成。

class PuzzleItem { 
    Drawable puzzlepartImage; 
    int correctPosition; 

    public PuzzleItem(Drawable d, int index) { 
     puzzlepartImage = d; 
     correctPosition = index; 
    } 
} 

ArrayList<PuzzleItem> list = new ArrayList<PuzzleItem>(); 
for (int i = 0; i < 9; i++) { 
    list.add(new PuzzleItem(drawables[i], i)); 
} 
Collections.shuffle(list); 

//Create the views from this list and add to the layout serially. 
// set the last view as emptyview. 

上的一舉一動:

void onClick(View v) { 
    /* swap drawables */ 
    Drawable clickedDrawable = v.getDrawable(); 
    v.setDrawable(null); 
    mEmptyView.setDrawable(clickedDrawable); 
    mEmptyView = v; 

    /* swap tag integers */ 
    Integer temp = (Integer)mEmptyView.getTag(); 
    mEmptyView.setTag(v.getTag()); 
    v.setTag(temp); 

} 

一舉一動檢查完成後:

for (int i = 0; i < 9; i++) { 
    if (imgView[i].getTag() != i) break; 
} 
if (i == 9)// puzzle completed. 
+0

在這裏,我們並沒有改變ImageView的唯一圖像,所以有變化的標籤.. –

+0

標籤的沒有變化 –

+0

創建一個包含每個位置2個項目的數組,drawable及其索引。爲所有項目設置索引,然後對數組進行洗牌。然後從這個混洗陣列創建視圖。不要忘記設置索引和drawables。 – Ronnie