[英]Why doesn't my if statement work?
我在Android Studio中制作了一款應用。
快速摘要:它是一款適合兒童的應用,可在用戶啟動游戲時呈現隨機形狀。 用戶有4個選項可供選擇,其中一個形狀是正確的形狀。 然后,用戶需要將形狀拖放到輪廓中。 下面顯示了一個例子的圖片。
問題是,我需要下面4個形狀中的1個來匹配要猜到的形狀。 我有2套18個形狀,第一套是形狀輪廓與? 內。
int[] outlines = new int[] {R.drawable.outline_0, R.drawable.outline_1, R.drawable.outline_2,
R.drawable.outline_3, R.drawable.outline_4, R.drawable.outline_5, R.drawable.outline_6,
R.drawable.outline_7, R.drawable.outline_8, R.drawable.outline_9, R.drawable.outline_10,
R.drawable.outline_11, R.drawable.outline_12, R.drawable.outline_13, R.drawable.outline_14,
R.drawable.outline_15, R.drawable.outline_16,R.drawable.outline_17};
第二組是具有面部的實際彩色形狀。
int[] images = new int[] {R.drawable.img_0, R.drawable.img_1, R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
R.drawable.img_5, R.drawable.img_6, R.drawable.img_7, R.drawable.img_8, R.drawable.img_9, R.drawable.img_10,
R.drawable.img_11, R.drawable.img_12, R.drawable.img_13, R.drawable.img_14, R.drawable.img_15, R.drawable.img_16,
R.drawable.img_17};
我需要某種功能或陳述,其中底部的4個形狀不能與對應於需要猜測的形狀的1個形狀相同。
注意:outline_0形狀對應img_0,outline_1對應img_1等。
這是此活動的完整代碼。
public class SecondActivity extends AppCompatActivity {
int n;
ImageView shape1, shape2, shape3, shape4, guessShape;
ImageButton exit;
Random rand = new Random();
ImageView[] shapes = new ImageView[4];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
shape1 = (ImageView) findViewById(R.id.shape1);
shape2 = (ImageView) findViewById(R.id.shape2);
shape3 = (ImageView) findViewById(R.id.shape3);
shape4 = (ImageView) findViewById(R.id.shape4);
guessShape = (ImageView) findViewById(R.id.guessShape);
shapes[0] = shape1;
shapes[1] = shape2;
shapes[2] = shape3;
shapes[3] = shape4;
//store all the shapes in an array
int[] images = new int[] {R.drawable.img_0, R.drawable.img_1, R.drawable.img_2, R.drawable.img_3, R.drawable.img_4,
R.drawable.img_5, R.drawable.img_6, R.drawable.img_7, R.drawable.img_8, R.drawable.img_9, R.drawable.img_10,
R.drawable.img_11, R.drawable.img_12, R.drawable.img_13, R.drawable.img_14, R.drawable.img_15, R.drawable.img_16,
R.drawable.img_17};
int[] outlines = new int[] {R.drawable.outline_0, R.drawable.outline_1, R.drawable.outline_2,
R.drawable.outline_3, R.drawable.outline_4, R.drawable.outline_5, R.drawable.outline_6,
R.drawable.outline_7, R.drawable.outline_8, R.drawable.outline_9, R.drawable.outline_10,
R.drawable.outline_11, R.drawable.outline_12, R.drawable.outline_13, R.drawable.outline_14,
R.drawable.outline_15, R.drawable.outline_16,R.drawable.outline_17};
//generate random number between 0 and image.length
int img1 = (int) Math.round((Math.random() * images.length));
int img2 = (int) Math.round((Math.random() * images.length));
int img3 = (int) Math.round((Math.random() * images.length));
int img4 = (int) Math.round((Math.random() * images.length));
int outlineID = (int) Math.round((Math.random() * outlines.length));
//set the image
guessShape.setBackgroundResource(outlines[outlineID]);
shape1.setBackgroundResource(images[img1]);
shape2.setBackgroundResource(images[img2]);
shape3.setBackgroundResource(images[img3]);
shape4.setBackgroundResource(images[img4]);
//set tags for the imageViews
guessShape.setTag("RandomImage");
shape1.setTag("Shape1");
shape2.setTag("Shape2");
shape3.setTag("Shape3");
shape4.setTag("Shape4");
//1 of the 4 image views needs to match outline of the shape that needs to be guessed
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_0)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_0);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_1)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_1);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_2)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_2);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_3)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_3);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_4)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_4);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_5)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_5);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_6)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_6);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_7)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_7);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_8)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_8);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_9)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_9);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_10)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_10);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_11)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_11);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_12)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_12);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_13)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_13);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_14)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_14);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_15)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_15);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_16)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_16);
}
if(guessShape.getBackground().getConstantState().equals(R.drawable.outline_17)){
int random = new Random().nextInt(shapes.length);
shapes[random].setBackgroundResource(R.drawable.img_17);
}
}
}
解決我的問題的任何提示都會很棒。 謝謝! :)
沒有日志,堆棧跟蹤或輸出很難確切地知道你出錯的地方。 你可以做幾件事來修復這個錯誤,或者可能會阻止另一個錯誤。
設置變量
讓我們將guessShape.getBackground()。getConstantState()保存為變量。 現在我不知道這是什么類型,所以我將它稱為現在的對象。 請使用正確的類型進行更新。
Object currentBackground = guessShape.getBackground().getConstantState();
If-Else If
目前,您正在使用if語句,后跟更多if語句。 這具有每次測試第一個而不是第二個而不是第三個的效果。 相反,我們只想匹配其中的每一個。 這是一個教程 。
讓我們改變一下:
if(currentBackground.equals(R.drawable.outline_0){
...
}
if(currentBackgorund.equals(R.drawable.outline_1){
...
} ....
對此:
if(currentBackground.equals(R.drawable.outline_0){
...
} else if(currentBackgorund.equals(R.drawable.outline_1){
...
} ....
其他
現在我們知道它只會匹配一次,我們希望確保找到它。 我們希望在剛剛完成的if-else if
語句的末尾捕獲一個else
。
.... } else if (currentBackground.equals(R.drawable.outline_17){
...
} else {
// How do you want to handle if the background did not equal any of your images?
}
調試
現在我們有了一些重大改進。 你需要追蹤它出錯的地方。 一種有用的方法是將內容打印到控制台。 在NetBeans或Eclipse等IDE中有更強大的調試方法,但System.out.println
現在很棒!
訣竅是知道你可能出錯的地方。 我看到了幾個“失敗點”。 這些是您出錯的風險較高的區域。 這將有助於檢查該值是否是您認為的那個值。
隨便的數字。 找出數字是什么。 它們是否在正確的范圍內? 這也可以幫助您調試它應該具有的形狀。
//generate random number between 0 and image.length
int img1 = (int) Math.round((Math.random() * images.length));
int img2 = (int) Math.round((Math.random() * images.length));
int img3 = (int) Math.round((Math.random() * images.length));
int img4 = (int) Math.round((Math.random() * images.length));
int outlineID = (int) Math.round((Math.random() * outlines.length));
// Print these to know what they are, especially outlineID.
您可以在每個if語句中放置打印件,以查看哪個(包括其他)被捕獲以及原因。 你可以確保它是你想要的那個。
結論
試試這些。 它可能無法捕捉到你的錯誤,但至少你會對你的設置有一個具體的想法,如果它的捕獲。 這將幫助您徹底調試。 如果大綱每次進入正確的if語句,那么我們就知道if語句中存在問題! 調試可能不是第一次發現問題,但確實縮小了范圍。
我正在編輯我的答案以包含此內容。 我很確定我發現了你的問題。
在你的代碼中:
//generate random number between 0 and image.length
int img1 = (int) Math.round((Math.random() * images.length));
int img2 = (int) Math.round((Math.random() * images.length));
int img3 = (int) Math.round((Math.random() * images.length));
int img4 = (int) Math.round((Math.random() * images.length));
int outlineID = (int) Math.round((Math.random() * outlines.length));
您正在為圖像創建4個隨機圖像,但隨后您還要為輪廓創建隨機圖像。 這意味着您可以獲得圖像1,2,3,4,然后在輪廓上獲得圖像17的輪廓! 這將在你的if語句中匹配,但它會為你提供17而不是你想要的圖像。
在這種情況下,您希望獲得4個隨機數,然后從您的大綱中選擇。 這是一種方法(注意:有更好/更簡單的方法,但我想確保它在你當前的水平。你很快就會到達那里!)
//generate random number between 0 and image.length
int img1 = (int) Math.round((Math.random() * images.length));
int img2 = (int) Math.round((Math.random() * images.length));
int img3 = (int) Math.round((Math.random() * images.length));
int img4 = (int) Math.round((Math.random() * images.length));
int whichImg = (int) Math.round((Math.random() * 4));
if(whichImg == 1){
whichImg = img1;
} else if(whichImg == 2){
whichImg = img2;
} else if(whichImg == 3){
whichImg = img3;
} else {
whichImg = img4;
}
int outlineID = outlines[whichImg];
這給你一個隨機數1-4。 然后,您可以使用保存正確的圖像到Im。 然后使用它在輪廓數組中獲得相同的數字。
附注你可能還沒有學過它們,但for loop
將是一個很好的方法,可以將代碼從所有這些if語句中刪除到只有一個。 :)如果您不熟悉它們,請在嘗試之前先修復您的錯誤。 這是一個教程的鏈接,以防您想要查看它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.