2013-06-15 2 views
-1

Мы должны использовать методы в нашей программе, но у меня возникают проблемы с их включением в нее. Моя программа похожа на математическую игру, задавая простые вопросы сложения и добавления/вычитания. Я хочу, чтобы все вычисления были в методах, но у меня возникли проблемы с возвратом целого уравнения.Использование методов в java

Мне нужна помощь, когда дело доходит до того, как мне нужно идти, чтобы эффективно использовать методы в моей программе, и где я должен делать свои вычисления! Как и то, что должно быть в его собственных методах и что должно быть в основном методе.

import javax.swing.*; 
import java.io.*; 


public class SummativeTwo { 

    public static void main (String[] args) throws IOException { 

    BufferedReader myInput = new BufferedReader (new InputStreamReader (System.in)); { 

     Object[] options = {"Yes! I'm Excited!","Im kind of nervous..","Now Way! Ewww!"}; 
     int n = JOptionPane.showOptionDialog(null, "Welcome Million Dollar Madness! "+ "Are you ready to play?","Welcome",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,options,options[2]); 
     if (n == JOptionPane.YES_OPTION) { 
     JOptionPane.showMessageDialog(null,"Okie Dokie! Lets get started!", "Okie Dokie", JOptionPane.INFORMATION_MESSAGE); 
     } 
     if (n == JOptionPane.NO_OPTION) { 
     JOptionPane.showMessageDialog(null,"Aw thats okay! Im sure you'll have fun!", "It's okay", JOptionPane.INFORMATION_MESSAGE); 
     } 
     if (n == JOptionPane.CANCEL_OPTION) { 
     JOptionPane.showMessageDialog(null,"Well too bad so sad! You're going to have to play anyways!", "Too bad so sad", JOptionPane.INFORMATION_MESSAGE); 
     } 

     Object[] optionsA = {"Yes Please", "Nope! I'm good!"}; 
     int x = JOptionPane.showOptionDialog(null,"Would you like to know the instructions for this game?","INSTRUCTIONS?", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,optionsA,optionsA[0]); 
     if (x == JOptionPane.YES_OPTION) { 
     JOptionPane.showMessageDialog(null,"There will be 3 levels in this game. As you go farther, the questions get harder and harder and each question \n. Each time you get a question right you will recieve a certain amount of money, which increases each time you pass each question. \n But be careful, because if you get 3 questions wrong in one level \n it's GAME OVER for you! Meaning you lose all your money. \n You may Cash Out at any point if you're not willing to risk losing the amount of money you have. Reach the end of \n the 3 levels and you take home all your money! \n GOOD LUCK!", "Instructions", JOptionPane.INFORMATION_MESSAGE); 
     } 
     if (x == JOptionPane.NO_OPTION) { 
     JOptionPane.showMessageDialog(null,"Suit Yourself! Lets Start!", "Your Choice", JOptionPane.INFORMATION_MESSAGE); 
     } 
     JOptionPane.showMessageDialog(null,"Welcome to Level: 1 " ," level 1", JOptionPane.INFORMATION_MESSAGE); 

     //LEVEL ONE 
     int wrong = 0; 
     int run = 1; 
     int questionnum = 0; 
     int amount = 0; 

     while (run <= 6 && wrong != 3) 
     { 
     run ++; 
     questionnum++; 
     int increment = 150; 
     amount += 150; 

     int numOne = additionOne(); 
     int numTwo = additionTwo(); 
     int answer = numOne + numTwo; 


     String useranswerA = JOptionPane.showInputDialog(null,"Question #" + questionnum + " is for: $" + increment + "\n" + numOne + " + " + numTwo + " = ?", "Question", JOptionPane.INFORMATION_MESSAGE); 
     int useranswer = Integer.parseInt(useranswerA); 

     if (useranswer != answer) 
     { 
      wrong ++; 
      JOptionPane.showMessageDialog(null,"You got the wrong answer! \n The correct answer is: " + answer + " \n Questions Wrong: " + wrong, "Wrong Answer", JOptionPane.INFORMATION_MESSAGE); 
      int y = JOptionPane.showOptionDialog(null,"CASH OUT with a total of $" + amount + "?","Cash Out?", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,optionsA,optionsA[0]); 
      if (y == JOptionPane.YES_OPTION) { 
      JOptionPane.showMessageDialog(null,"Thanks for Playing!", "Thank You!", JOptionPane.INFORMATION_MESSAGE); 
      System.exit(0); 
      } 
      if (y == JOptionPane.NO_OPTION) {} 
     } 
     else if (useranswer == answer) 
     { 
      JOptionPane.showMessageDialog(null,"Correct!", "Right Answer", JOptionPane.INFORMATION_MESSAGE); 
      int y = JOptionPane.showOptionDialog(null,"CASH OUT with a total of $" + amount + "?","Cash Out?", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,optionsA,optionsA[0]); 
      if (y == JOptionPane.YES_OPTION) { 
      JOptionPane.showMessageDialog(null,"Thanks for Playing!", "Thank You!", JOptionPane.INFORMATION_MESSAGE); 
      System.exit(0); 
      } 
      if (y == JOptionPane.NO_OPTION) {} 
     } 
     } 
     JOptionPane.showMessageDialog(null,"LEVEL ONE COMPLETE!", "LEVEL 1", JOptionPane.INFORMATION_MESSAGE); 
     JOptionPane.showMessageDialog(null,"Cash on Hand: $ " + amount, "Cash", JOptionPane.INFORMATION_MESSAGE); 


     //LEVEL TWO 
     JOptionPane.showMessageDialog(null,"Welcome to Level: 2 " ," level 2", JOptionPane.INFORMATION_MESSAGE); 
     int wrongB = 0; 
     int runB = 1; 
     int questionnumB = 0; 


     while (runB <= 8 && wrongB != 3) 
     { 
     runB ++; 
     questionnumB++; 
     amount += 250; 

     int increment = 250; 

     int numOne = additionOne(); 
     int numTwo = additionTwo(); 
     int numThree = numThree(); 
     int answer = numOne + numTwo - numThree; 


     String useranswerA = JOptionPane.showInputDialog(null,"Question #" + questionnum + " is for: $" + increment + "\n" + numOne + " + " + numTwo + " - " + numThree + " = ?", "Question", JOptionPane.INFORMATION_MESSAGE); 
     int useranswer = Integer.parseInt(useranswerA); 

     if (useranswer != answer) 
     { 
      wrong ++; 
      JOptionPane.showMessageDialog(null,"You got the wrong answer! \n The correct answer is: " + answer + " \n Questions Wrong: " + wrongB, "Wrong Answer", JOptionPane.INFORMATION_MESSAGE); 
      int z = JOptionPane.showOptionDialog(null,"CASH OUT with a total of $" + amount + "?","Cash Out?", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,optionsA,optionsA[0]); 
      if (z == JOptionPane.YES_OPTION) { 
      JOptionPane.showMessageDialog(null,"Thanks for Playing!", "Thank You!", JOptionPane.INFORMATION_MESSAGE); 
      System.exit(0); 
      } 
      if (z == JOptionPane.NO_OPTION) {} 
     } 
     else if (useranswer == answer) 
     { 
      JOptionPane.showMessageDialog(null,"Correct!", "Right Answer", JOptionPane.INFORMATION_MESSAGE); 
      int z = JOptionPane.showOptionDialog(null,"CASH OUT with a total of $" + amount + "?","Cash Out?", JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE,null,optionsA,optionsA[0]); 
      if (z == JOptionPane.YES_OPTION) { 
      JOptionPane.showMessageDialog(null,"Thanks for Playing!", "Thank You!", JOptionPane.INFORMATION_MESSAGE); 
      System.exit(0); 
      } 
      if (z == JOptionPane.NO_OPTION) {} 
     } 
     } 
     JOptionPane.showMessageDialog(null,"LEVEL TWO COMPLETE!", "LEVEL 2", JOptionPane.INFORMATION_MESSAGE); 
     JOptionPane.showMessageDialog(null,"Cash on Hand: $ " + amount, "Cash",JOptionPane.QUESTION_MESSAGE); 

    } 
    } 

    public static int additionOne() 
    { 
    int x = (int)(Math.random() * 30); 
    return x; 
    } 
    public static int additionTwo() 
    { 
    int x = (int)(Math.random() * 30); 
    return x; 
    } 
    public static int numThree() 
    { 
    int x = (int) (Math.random() * 15); 
    return x; 
    } 
} 
+0

вы можете быть более конкретным и точка в вашем коде, что это проблема? – fmodos

+0

@fmodos у него проблемы с разделом кода на методы – pinkpanther

+0

@fmodos Мой код работает, но моя проблема эффективно использует методы. Потому что я мог легко сделать этот код без использования методов. Я смущен тем, что должно быть по-своему, и что должно быть в основном методе. – user101

ответ

0

Ваш вопрос слишком расплывчатый, но я думаю, это поможет вам немного.

У вас есть три функции: additionOne, additionTwo и numThree которые очень похожи. Вы можете уменьшить их функции, как это:

public static int myFunction(int multiplier) 
{ 
    int x = (int)(Math.random() * multiplier); 
    return x; 
} 

и использовать его как:

int numOne = myFunction(30); 
int numTwo = myFunction(30); 
int numThree = myFunction(15); 
int answer = numOne + numTwo - numThree; 
1

Общие правила большого пальца, когда речь идет о программе дизайн:

  • Если вы оказываетесь многократно повторяя один и тот же код, рекомендуется добавить этот код в свой собственный метод. Таким образом, легче понять, что происходит, и если вам нужно изменить код, вам просто нужно изменить его в одном месте. Это также облегчает модульное тестирование вашего кода, когда вы можете разделить все на легко проверяемые методы. Методы также позволяют использовать инкапсуляцию , например. Некоторые из кода могут быть помечены как частные, так и защищенные.
  • Мне нравится поддерживать мой основной метод максимально простым. В идеале, это должно быть просто отправной точкой для программы и запускать настоящий код. У меня не так много, чтобы поддержать меня, но это помогает продвигать повторное использование кода. Основной метод по сути связан с командной строкой, которая запускает его; например, если вы хотите перенести настольное приложение в веб-приложение, вам придется отделить его.

В вашем коде у вас есть 2 уровня, каждый из которых делает что-то очень похожее. Это может быть хорошим местом, чтобы начать смотреть на то, чтобы этот код был в его собственном методе. Тогда, если вы хотите добавить, скажем, уровень 3, это не потребует большого количества дополнительного кода.

0

Одна из целей написания метода заключается в сокращении дублирующего кода. В вашем коде кажется, что вам нужно многократно вводить JOptionPange.showMessageDialog. Таким образом, вы можете написать метод, введя в него весь свой код отображения сообщения и передать сообщение, которое вы хотите отображать в качестве параметров.

public void someMethod(String message, String anotherMessage){ 
      JOptionPane.showMessageDialog(null,message , anotherMessage, JOptionPane.INFORMATION_MESSAGE); 
// some more code to run 
} 

После написания вам необходимо просто вызвать этот метод в ваших условиях if.

В настоящий момент это будет не очень полезно, но если вы хотите, чтобы какой-то код выполнялся после отображения идентификатора сообщения, вы можете просто добавить этот метод.

Всегда старайтесь писать свой основной метод как можно проще. Просто попробуйте вызвать из него другие методы.

+1

JOptionPane.showMessageDialog уже является вызовом метода одной строки. Это хорошо для читаемости, но определенно не предложение, которое должно быть дано стартеру. –

+0

@IsmetAlkan Да, я понимаю, поэтому я отредактировал сообщение, чтобы передать сообщение, что он не будет полезен прямо сейчас, но будет полезно, если после показа диалогового окна будет сделана еще одна операция, и вы можете записать его в только метод. Спасибо за ваше предложение :) –

+0

Этот пользовательский метод должен быть ['private'] (http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html), а не' public'. Это связано с тем, что показ диалоговых окон сообщений слабо связан с основной целью класса SummativeTwo. Таким образом, другие классы не должны зависеть от 'SummativeTwo', имеющих этот метод. –

0

Для начала вытащите все, что дублируется. Таким образом, для 2-х комплектов блоков:

if (useranswer != answer) 

и

else if (useranswer == answer) 

Я бы содержимое этих блоков будет методом, где какие-либо различия являются параметры методы - или просто один булева правый/неправильный параметр и отрегулируйте, какой набор строк внутри метода вызывается. У любого способа меньше кода. Если те же строки используются в наборах 1 и 3, а также в 2 и 4, то вместо того, чтобы отправлять их как параметры 4 раза (объявляя их 4 раза), просто объявите их дважды - так что это будет означать внутри метода.

После удаления повторяющегося кода следующий шаг будет начинаться с небольших блоков кода (возможно, 10-20 строк), часто внутри фигурных скобок и предпочтительно, где используются новые переменные, которые не нужны в другом месте.

После удаления небольших блоков вы можете обнаружить, что у вас есть новые «маленькие» блоки, которые вы можете удалить. Уровни 1 и 2 могут быть разными способами.

Идеально просто старайтесь держать методы меньше, чтобы читателю не приходилось прокручивать их, и они могут легко просматривать весь код метода, запускать все это в своей голове и знать, что он делает.

0

Уровень 1. и уровень были почти одинаковыми. Таким образом, извлечение первого уровня для отдельного метода приведет к слому кода для следующего уровня. Разбитый синтаксис определяет, какая информация требуется от первого уровня до уровня 2. Казалось, что требуется только необходимое количество.

Следуя этому способу рефакторинга, также было предложено, чтобы исходный адрес wrongB и questionnumB не использовался должным образом. Я взял на себя смелость предположить, что оба раунда имеют отдельные неправильные и контрольные переменные.

Проблема в этом подходе заключается в том, что если код не хорошо понимается и хрупкий без тестов, он, вероятно, сломается. Однако я нашел, что он эффективен в случаях, когда небольшие шаги рефакторинга не очевидны.

В целом все методы должны быть понятными для чтения. Поскольку основной метод является самым лучшим методом, он должен четко указать, что происходит в программе. Методы должны быть на одном уровне абстракции и очень коротки.

Информация передается с использованием объекта State, но в этом случае простая сумма может быть возвращена из runLevel и передана как параметр в следующий.

Я не знаю, было ли диалоговое устройство предназначено для очистки, но я сделал несколько шагов, чтобы уменьшить повторяющийся код. Целую вещь можно полировать намного больше. Надеюсь, это может дать некоторые рекомендации ...

Очистить код (http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882) - очень хорошая книга о рефакторинге и методах и кодексе в читаемом роде.

Вот мои два цента:

public class SummativeTwo { 

public static void main(String[] args) throws IOException { 
    BufferedReader myInput = new BufferedReader(new InputStreamReader(System.in)); 
    { 
     showYesNoCancelDialogWithFollowUp(
       "Welcome", 
       "Welcome Million Dollar Madness! " + "Are you ready to play?", 
       new DialogOption("Yes! I'm Excited!", new InformationDialog("Okie Dokie! Lets get started!", "Okie Dokie")), 
       new DialogOption("Im kind of nervous..", new InformationDialog("Aw thats okay! Im sure you'll have fun!", "It's okay")), 
       new DialogOption("Now Way! Ewww!", new InformationDialog("Well too bad so sad! You're going to have to play anyways!", "Too bad so sad"))); 

     showYesNoDialogWithFollowUp("INSTRUCTIONS?", 
       "Would you like to know the instructions for this game?", 
       new InformationDialog("There will be 3 levels in this game. As you go farther, the questions get harder and harder and each question \n. Each time you get a question right you will recieve a certain amount of money, which increases each time you pass each question. \n But be careful, because if you get 3 questions wrong in one level \n it's GAME OVER for you! Meaning you lose all your money. \n You may Cash Out at any point if you're not willing to risk losing the amount of money you have. Reach the end of \n the 3 levels and you take home all your money! \n GOOD LUCK!", "Instructions"), 
       new InformationDialog("Your Choice", "Suit Yourself! Lets Start!")); 


     showInformationMessage("Welcome to Level: 1 ", " level 1"); 

     State state = new State(); 
     runLevel1(state); 
     showInformationMessage("LEVEL ONE COMPLETE!", "LEVEL 1"); 
     showInformationMessage("Cash on Hand: $ " + state.amount, "Cash"); 
     showInformationMessage("Welcome to Level: 2 ", " level 2"); 
     runLevel2(state); 
     showInformationMessage("LEVEL TWO COMPLETE!", "LEVEL 2"); 
     JOptionPane.showMessageDialog(null, "Cash on Hand: $ " + state.amount, "Cash", JOptionPane.QUESTION_MESSAGE); 

    } 
} 

static class State { 

    int amount; 
} 

private static void runLevel1(State state) { 
    int maxRuns = 6; 
    int maxWrongs = 3; 
    int increment = 150; 
    runLevel(increment, maxRuns, maxWrongs, state); 
} 

private static void runLevel2(State state) { 
    int maxRuns = 8; 
    int maxWrongs = 3; 
    int increment = 150; 
    runLevel(increment, maxRuns, maxWrongs, state); 
} 

private static void runLevel(int increment, int maxRuns, int maxWrongs, State state) throws NumberFormatException, HeadlessException { 
    int run = 1; 
    int questionnum = 0; 
    int wrong = 0; 
    while (run <= maxRuns && wrong != maxWrongs) { 
     run++; 
     questionnum++; 
     state.amount += increment; 

     int numOne = additionOne(); 
     int numTwo = additionTwo(); 
     int answer = numOne + numTwo; 

     String useranswerA = JOptionPane.showInputDialog(null, "Question #" + questionnum + " is for: $" + increment + "\n" + numOne + " + " + numTwo + " = ?", "Question", JOptionPane.INFORMATION_MESSAGE); 
     int useranswer = Integer.parseInt(useranswerA); 

     if (useranswer != answer) { 
      wrong++; 
      showInformationMessage("You got the wrong answer! \n The correct answer is: " + answer + " \n Questions Wrong: " + wrong, "Wrong Answer"); 
      askForCashOut(state.amount); 
     } else if (useranswer == answer) { 
      showInformationMessage("Correct!", "Right Answer"); 
      askForCashOut(state.amount); 
     } 
    } 
} 

public static int additionOne() { 
    int x = (int) (Math.random() * 30); 
    return x; 
} 

public static int additionTwo() { 
    int x = (int) (Math.random() * 30); 
    return x; 
} 

public static int numThree() { 
    int x = (int) (Math.random() * 15); 
    return x; 
} 

private static void askForCashOut(int amount) throws HeadlessException { 
    if (askYesNo("Cash Out?", "CASH OUT with a total of $" + amount + "?")) { 
     showInformationMessage("Thanks for Playing!", "Thank You!"); 
     System.exit(0); 
    } 
} 

private static void showYesNoCancelDialogWithFollowUp(String title, String text, DialogOption yes, DialogOption no, DialogOption cancel) { 
    DialogOption[] options = new DialogOption[]{yes, no, cancel}; 
    int n = JOptionPane.showOptionDialog(null, text, title, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]); 
    options[n].dialog.show(); 
} 

private static void showYesNoDialogWithFollowUp(String title, String text, InformationDialog afterYes, InformationDialog afterNo) { 
    if (askYesNo(text, title)) { 
     afterYes.show(); 
    } else { 
     afterNo.show(); 
    } 
} 
private static final String[] YES_NO_OPTIONS = new String[]{"Yes Please", "Nope! I'm good!"}; 

private static boolean askYesNo(String text, String title) throws HeadlessException { 
    int n = JOptionPane.showOptionDialog(null, text, title, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, YES_NO_OPTIONS, YES_NO_OPTIONS[0]); 
    return n == JOptionPane.YES_OPTION; 
} 

private static void showInformationMessage(String text, String title) throws HeadlessException { 
    JOptionPane.showMessageDialog(null, text, title, JOptionPane.INFORMATION_MESSAGE); 
} 

static class InformationDialog { 

    private String text; 
    private String title; 

    public InformationDialog(String text, String title) { 
     this.text = text; 
     this.title = title; 
    } 

    public void show() { 
     showInformationMessage(text, title); 
    } 
} 

static class DialogOption { 

    String text; 
    InformationDialog dialog; 

    public DialogOption(String text, InformationDialog dialog) { 
     this.text = text; 
     this.dialog = dialog; 
    } 

    @Override 
    public String toString() { 
     return text; 
    } 
} 

}

Смежные вопросы