2014-04-08 2 views
0

플레이어가 첫 번째 시도에서 플래그를 추측 할 때마다 카운터를 증가 시키도록 mod를 추가하려고합니다. 이 값은 10 개의 플래그가 완료 될 때 끝에 표시됩니다. 지금까지 나는 단지 추측의 수와 정답 비율을 표시하도록했습니다.Android- 첫 번째 시도에서 카운터를 증가시킬 수 없습니다.

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Random; 
import java.util.Set; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.res.AssetManager; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TableLayout; 
import android.widget.TableRow; 
import android.widget.TextView; 

public class FlagQuizGame extends Activity 
{ 
// String used when logging error messages 
private static final String TAG = "FlagQuizGame Activity"; 

private List<String> fileNameList; // flag file names 
private List<String> quizCountriesList; // names of countries in quiz 
private Map<String, Boolean> regionsMap; // which regions are enabled 
private String correctAnswer; // correct country for the current flag 
private int totalGuesses; // number of guesses made 
private int correctAnswers; // number of correct guesses 
private int guessRows; // number of rows displaying choices 
private Random random; // random number generator 
private Handler handler; // used to delay loading next flag 
private Animation shakeAnimation; // animation for incorrect guess 

private TextView answerTextView; // displays Correct! or Incorrect! 
private TextView questionNumberTextView; // shows current question # 
private ImageView flagImageView; // displays a flag 
private TableLayout buttonTableLayout; // table of answer Buttons 
private int counter; 

// called when the activity is first created 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); // call the superclass's method 
    setContentView(R.layout.main); // inflate the GUI 

    fileNameList = new ArrayList<String>(); // list of image file names 
    quizCountriesList = new ArrayList<String>(); // flags in this quiz 
    regionsMap = new HashMap<String, Boolean>(); // HashMap of regions 
    guessRows = 1; // default to one row of choices 
    random = new Random(); // initialize the random number generator 
    handler = new Handler(); // used to perform delayed operations 
    counter = 0; 
    // load the shake animation that's used for incorrect answers 
    shakeAnimation = 
    AnimationUtils.loadAnimation(this, R.anim.incorrect_shake); 
    shakeAnimation.setRepeatCount(3); // animation repeats 3 times 

    // get array of world regions from strings.xml 
    String[] regionNames = 
    getResources().getStringArray(R.array.regionsList); 

    // by default, countries are chosen from all regions 
    for (String region : regionNames) 
    regionsMap.put(region, true); 

    // get references to GUI components 
    questionNumberTextView = 
    (TextView) findViewById(R.id.questionNumberTextView); 
    flagImageView = (ImageView) findViewById(R.id.flagImageView); 
    buttonTableLayout = 
    (TableLayout) findViewById(R.id.buttonTableLayout); 
    answerTextView = (TextView) findViewById(R.id.answerTextView); 

    // set questionNumberTextView's text 
    questionNumberTextView.setText(
    getResources().getString(R.string.question) + " 1 " + 
    getResources().getString(R.string.of) + " 10"); 

    resetQuiz(); // start a new quiz 
} // end method onCreate 

// set up and start the next quiz 
private void resetQuiz() 
{  
    // use the AssetManager to get the image flag 
    // file names for only the enabled regions 
    AssetManager assets = getAssets(); // get the app's AssetManager 
    fileNameList.clear(); // empty the list 

    try 
    { 
    Set<String> regions = regionsMap.keySet(); // get Set of regions 

    // loop through each region 
    for (String region : regions) 
    { 
     if (regionsMap.get(region)) // if region is enabled 
     { 
      // get a list of all flag image files in this region 
      String[] paths = assets.list(region); 

      for (String path : paths) 
       fileNameList.add(path.replace(".png", "")); 
     } // end if 
    } // end for 
    } // end try 
    catch (IOException e) 
    { 
    Log.e(TAG, "Error loading image file names", e); 
    } // end catch 

    correctAnswers = 0; // reset the number of correct answers made 
    totalGuesses = 0; // reset the total number of guesses the user made 
    quizCountriesList.clear(); // clear prior list of quiz countries 

    // add 10 random file names to the quizCountriesList 
    int flagCounter = 1; 
    int numberOfFlags = fileNameList.size(); // get number of flags 

    while (flagCounter <= 10) 
    { 
    int randomIndex = random.nextInt(numberOfFlags); // random index 

    // get the random file name 
    String fileName = fileNameList.get(randomIndex); 

    // if the region is enabled and it hasn't already been chosen 
    if (!quizCountriesList.contains(fileName)) 
    { 
     quizCountriesList.add(fileName); // add the file to the list 
     ++flagCounter; 
    } // end if 
    } // end while 

    loadNextFlag(); // start the quiz by loading the first flag 
} // end method resetQuiz 

// after the user guesses a correct flag, load the next flag 
private void loadNextFlag() 
{ 
    // get file name of the next flag and remove it from the list 
    String nextImageName = quizCountriesList.remove(0); 
    correctAnswer = nextImageName; // update the correct answer 

    answerTextView.setText(""); // clear answerTextView 

    // display the number of the current question in the quiz 
    questionNumberTextView.setText(
    getResources().getString(R.string.question) + " " + 
    (correctAnswers + 1) + " " + 
    getResources().getString(R.string.of) + " 10"); 

    // extract the region from the next image's name 
    String region = 
    nextImageName.substring(0, nextImageName.indexOf('-')); 

    // use AssetManager to load next image from assets folder 
    AssetManager assets = getAssets(); // get app's AssetManager 
    InputStream stream; // used to read in flag images 

    try 
    { 
    // get an InputStream to the asset representing the next flag 
    stream = assets.open(region + "/" + nextImageName + ".png"); 

    // load the asset as a Drawable and display on the flagImageView 
    Drawable flag = Drawable.createFromStream(stream, nextImageName); 
    flagImageView.setImageDrawable(flag);      
    } // end try 
    catch (IOException e) 
    { 
    Log.e(TAG, "Error loading " + nextImageName, e); 
    } // end catch 

    // clear prior answer Buttons from TableRows 
    for (int row = 0; row < buttonTableLayout.getChildCount(); ++row) 
    ((TableRow) buttonTableLayout.getChildAt(row)).removeAllViews(); 

    Collections.shuffle(fileNameList); // shuffle file names 

    // put the correct answer at the end of fileNameList 
    int correct = fileNameList.indexOf(correctAnswer); 
    fileNameList.add(fileNameList.remove(correct)); 

    // get a reference to the LayoutInflater service 
    LayoutInflater inflater = (LayoutInflater) getSystemService(
    Context.LAYOUT_INFLATER_SERVICE); 

    // add 3, 6, or 9 answer Buttons based on the value of guessRows 
    for (int row = 0; row < guessRows; row++) 
    { 
    TableRow currentTableRow = getTableRow(row); 

    // place Buttons in currentTableRow 
    for (int column = 0; column < 3; column++) 
    { 
     // inflate guess_button.xml to create new Button 
     Button newGuessButton = 
      (Button) inflater.inflate(R.layout.guess_button, null); 

     // get country name and set it as newGuessButton's text 
     String fileName = fileNameList.get((row * 3) + column); 
     newGuessButton.setText(getCountryName(fileName)); 

     // register answerButtonListener to respond to button clicks 
     newGuessButton.setOnClickListener(guessButtonListener); 
     currentTableRow.addView(newGuessButton); 
    } // end for 
    } // end for 

    // randomly replace one Button with the correct answer 
    int row = random.nextInt(guessRows); // pick random row 
    int column = random.nextInt(3); // pick random column 
    TableRow randomTableRow = getTableRow(row); // get the TableRow 
    String countryName = getCountryName(correctAnswer); 
    ((Button)randomTableRow.getChildAt(column)).setText(countryName);  
} // end method loadNextFlag 

// returns the specified TableRow 
private TableRow getTableRow(int row) 
{ 
    return (TableRow) buttonTableLayout.getChildAt(row); 
} // end method getTableRow 

// parses the country flag file name and returns the country name 
private String getCountryName(String name) 
{ 
    return name.substring(name.indexOf('-') + 1).replace('_', ' '); 
} // end method getCountryName 

// called when the user selects an answer 
private void submitGuess(Button guessButton) 
{ 
    String guess = guessButton.getText().toString(); 
    String answer = getCountryName(correctAnswer); 
    ++totalGuesses; // increment the number of guesses the user has made 

    // if the guess is correct 
    if (guess.equals(answer)) 
    { 
    ++correctAnswers; // increment the number of correct answers 

    // display "Correct!" in green text 
    answerTextView.setText(answer + "!"); 
    answerTextView.setTextColor(
     getResources().getColor(R.color.correct_answer)); 

    disableButtons(); // disable all answer Buttons 

    // if the user has correctly identified 10 flags 
    if (correctAnswers == 10) 
    { 
     // create a new AlertDialog Builder 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     builder.setTitle(R.string.reset_quiz); // title bar string 

     // set the AlertDialog's message to display game results 
     builder.setMessage(String.format("%d %s, %.02f%% %s", 
      totalGuesses, getResources().getString(R.string.guesses), 
      (1000/(double) totalGuesses), 
      getResources().getString(R.string.correct))); 

     builder.setCancelable(false); 

     // add "Reset Quiz" Button        
     builder.setPositiveButton(R.string.reset_quiz, 
      new DialogInterface.OnClickListener()     
      {              
       public void onClick(DialogInterface dialog, int id) 
       { 
       resetQuiz();          
       } // end method onClick        
      } // end anonymous inner class 
     ); // end call to setPositiveButton 

     // create AlertDialog from the Builder 
     AlertDialog resetDialog = builder.create(); 
     resetDialog.show(); // display the Dialog 
    } // end if 
    else // answer is correct but quiz is not over 
    { 
     // load the next flag after a 1-second delay 
     handler.postDelayed(
      new Runnable() 
      { 
       @Override 
       public void run() 
       { 
       loadNextFlag(); 
       } 
      }, 1000); // 1000 milliseconds for 1-second delay 
    } // end else 
    } // end if 
    else // guess was incorrect 
    { 
    // play the animation 
    flagImageView.startAnimation(shakeAnimation); 

    // display "Incorrect!" in red 
    answerTextView.setText(R.string.incorrect_answer); 
    answerTextView.setTextColor(
     getResources().getColor(R.color.incorrect_answer)); 
    guessButton.setEnabled(false); // disable the incorrect answer 
    } // end else 
} // end method submitGuess 

// utility method that disables all answer Buttons 
private void disableButtons() 
{ 
    for (int row = 0; row < buttonTableLayout.getChildCount(); ++row) 
    { 
    TableRow tableRow = (TableRow) buttonTableLayout.getChildAt(row); 
    for (int i = 0; i < tableRow.getChildCount(); ++i) 
     tableRow.getChildAt(i).setEnabled(false); 
    } // end outer for 
} // end method disableButtons 

// create constants for each menu id 
private final int CHOICES_MENU_ID = Menu.FIRST; 
private final int REGIONS_MENU_ID = Menu.FIRST + 1; 

// called when the user accesses the options menu 
@Override 
public boolean onCreateOptionsMenu(Menu menu)    
{    
    super.onCreateOptionsMenu(menu);       

    // add two options to the menu - "Choices" and "Regions" 
    menu.add(Menu.NONE, CHOICES_MENU_ID, Menu.NONE, R.string.choices);    
    menu.add(Menu.NONE, REGIONS_MENU_ID, Menu.NONE, R.string.regions);    

    return true; // display the menu       
} // end method onCreateOptionsMenu      

// called when the user selects an option from the menu 
@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    // switch the menu id of the user-selected option 
    switch (item.getItemId()) 
    { 
    case CHOICES_MENU_ID: 
     // create a list of the possible numbers of answer choices 
     final String[] possibleChoices = 
      getResources().getStringArray(R.array.guessesList); 

     // create a new AlertDialog Builder and set its title 
     AlertDialog.Builder choicesBuilder = 
      new AlertDialog.Builder(this);   
     choicesBuilder.setTitle(R.string.choices); 

     // add possibleChoices's items to the Dialog and set the 
     // behavior when one of the items is clicked 
     choicesBuilder.setItems(R.array.guessesList,      
      new DialogInterface.OnClickListener()      
      {               
       public void onClick(DialogInterface dialog, int item) 
       {              
       // update guessRows to match the user's choice  
       guessRows = Integer.parseInt(      
        possibleChoices[item].toString())/3;   
       resetQuiz(); // reset the quiz      
       } // end method onClick        
      } // end anonymous inner class 
     ); // end call to setItems        

     // create an AlertDialog from the Builder 
     AlertDialog choicesDialog = choicesBuilder.create(); 
     choicesDialog.show(); // show the Dialog    
     return true; 

    case REGIONS_MENU_ID: 
     // get array of world regions 
     final String[] regionNames = 
      regionsMap.keySet().toArray(new String[regionsMap.size()]); 

     // boolean array representing whether each region is enabled 
     boolean[] regionsEnabled = new boolean[regionsMap.size()]; 
     for (int i = 0; i < regionsEnabled.length; ++i) 
      regionsEnabled[i] = regionsMap.get(regionNames[i]); 

     // create an AlertDialog Builder and set the dialog's title 
     AlertDialog.Builder regionsBuilder = 
      new AlertDialog.Builder(this); 
     regionsBuilder.setTitle(R.string.regions); 

     // replace _ with space in region names for display purposes 
     String[] displayNames = new String[regionNames.length]; 
     for (int i = 0; i < regionNames.length; ++i) 
      displayNames[i] = regionNames[i].replace('_', ' '); 

     // add displayNames to the Dialog and set the behavior 
     // when one of the items is clicked 
     regionsBuilder.setMultiChoiceItems( 
      displayNames, regionsEnabled, 
      new DialogInterface.OnMultiChoiceClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which, 
       boolean isChecked) 
       { 
       // include or exclude the clicked region 
       // depending on whether or not it's checked 
       regionsMap.put(
        regionNames[which].toString(), isChecked); 
       } // end method onClick 
      } // end anonymous inner class 
     ); // end call to setMultiChoiceItems 

     // resets quiz when user presses the "Reset Quiz" Button 
     regionsBuilder.setPositiveButton(R.string.reset_quiz, 
      new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int button) 
       { 
       resetQuiz(); // reset the quiz 
       } // end method onClick 
      } // end anonymous inner class 
     ); // end call to method setPositiveButton 

     // create a dialog from the Builder 
     AlertDialog regionsDialog = regionsBuilder.create(); 
     regionsDialog.show(); // display the Dialog 
     return true; 
    } // end switch 

    return super.onOptionsItemSelected(item); 
} // end method onOptionsItemSelected 

// called when a guess Button is touched 
private OnClickListener guessButtonListener = new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
    submitGuess((Button) v); // pass selected Button to submitGuess 
    } // end method onClick 
}; // end answerButtonListener 
} // end FlagQuizGame  
+0

특정 질문을하지 않았으므로 텍스트의 벽을 게시했습니다. 코드 범위를 좁히면 유용한 응답을 얻을 수 있으며 달성하려는 대상에 대해 명확합니다. – Jonesopolis

+0

죄송합니다. 내 질문은 각 질문에 대한 첫 번째 시도에서 정답 버튼이 눌려 졌을 때,이를 추가하고 마지막에 결과를 표시하는 카운터를 설정하는 방법입니다. 예를 들어, 플래그가 올라오고 잘못된 답을 누르면 카운터에 추가되지 않습니다. 첫 번째 시도에서이를 얻지 못했기 때문입니다. – user3509111

답변

0

현재 질문에 대한 시도를 추적하는 또 다른 변수를 만듭니다. 추측의 수 = 1이라면 정답을 추측 할 때마다 한 번의 시도에서 얼마나 많은 답변이 정확하게 추측되었는지 또 다른 카운터를 증가시킵니다. 또한 각 정답 후 0으로 다시 추측 카운터를 재설정하십시오.

관련 문제