文章出處

編寫環境: Eclipse

作業代碼:

import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
class Expression//表達式類,存放表達式
{
    int a;//第一個數
    int b;//第二個數
    int c;//正確答案
    int d;//輸入答案
    char operator;//運算符
    boolean is_right;
    public Expression()
    {
        a=b=c=0;
        d = -1;
        is_right = false;
        operator = '+';
    } 
}
 
class NumberTooBigException extends Exception
{
    String message;
    public NumberTooBigException(String ErrorMessage)
    {
        message = ErrorMessage;
    }
    public String getMessage()
    {
        return message;
    }
}
 
public class fdgfg
{
    Vector<Expression> v;
    public fdgfg()
    {
        v = new Vector<Expression>();
    }
    public void produceExpression(int bit,char operator)
    {
        Expression temp = new Expression();
        temp.operator = operator;
        temp.a = (int)(Math.random() * Math.pow(10,bit));
        temp.b = (int)(Math.random() * Math.pow(10,bit));
        switch (operator) 
        {
            case '+': temp.c = temp.a + temp.b;break;
            case '-': temp.c = temp.a - temp.b;break;
            case '*': temp.c = temp.a * temp.b;break;
            case '/': temp.b = (temp.b == 0 ? //排除除法被除數為0的情況
                      temp.b = 1 +(int)(Math.random() * Math.pow(10,bit)-1): temp.b);
                      temp.c = temp.a / temp.b;break;
            default : mixExpression(temp,bit);//混合運算
        }
 
        v.add(temp);
    }
    //混合運算,產生隨機數
    public void mixExpression(Expression temp,int bit)
    {
        int rand  = (int)(Math.random()*4);
        switch(rand)
        {
            case 1: temp.c = temp.a + temp.b;temp.operator = '+';break;
            case 2: temp.c = temp.a - temp.b;temp.operator = '-';break;
            case 3: temp.c = temp.a * temp.b;temp.operator = '*';break;
            case 0: temp.b = (temp.b == 0 ? //排除除法被除數為0的情況
                    temp.b = 1 +(int)(Math.random() * Math.pow(10,bit)-1): temp.b);
                    temp.c = temp.a / temp.b;temp.operator = '/';break;
            default :
        }
    }
 
    public  void writeInfo(int num,String userName)
    {
        File myFile = new File(userName + ".his");
        FileOutputStream fos;
        File saveUserNameAndScore = new File("UserNameAndScore.data");
        try 
        {
            fos = new FileOutputStream(myFile,true);
            PrintStream ps  = new PrintStream(fos);
            double score = 0;
            ps.println(String.format("%5s%5s%5s%5s%5s%10s%5s","","","","","正確答案","你的答案","判斷"));
            ps.println();
            for(int i = 0 ;i < num ;i++)
            {
 
                ps.println(String.format("%5d%5s%5d%5s%10d%10d%10s",v.get(i).a,"+",
                v.get(i).b,"=",v.get(i).c,v.get(i).d,(v.get(i).is_right ? "正確":"錯誤")));
                ps.println();
                if(v.get(i).is_right)
                {
                    score += 100.0/num;
                }
            }
            ps.println("你的總分:" + score);
            ps.close();
            fos.close();
            //下面保存用戶名和得分到UserNameAndScore.data文件;
            fos = new FileOutputStream(saveUserNameAndScore,true);
            ps = new PrintStream(fos);
            ps.println(userName);
            ps.println(score);
            ps.close();
            fos.close();
        }
        catch (Exception ex) 
        {
            System.out.println (ex.getMessage());
        }
 
    }
    public static void main(String[] s)
    {
        OverAllFrame oaf = new OverAllFrame("小學生四則運算軟件V1.0羅凱旋&馬志磊 ");
    }
}
//主體框架
class OverAllFrame extends JFrame
{
    TimeThread timer;  //計時器線程
    fdgfg ar ;//內部算法
    JPanel headPanel;//頭面板
    JLabel welcomeLabel;//歡迎信息
    JLabel timeUse; //用時信息
    StartPanel st;
    String userName;
    RunningPanel rp;
    EndPanel ep;
    Vector<Expression> v;//存放算式
    public OverAllFrame(String s)
    {
        super(s);
        userName = JOptionPane.showInputDialog("請輸入用戶名","");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.initialize();
        setHeadPanel();
        this.setLocation(400, 100);
        this.setLayout(new BorderLayout());
        this.add(headPanel,BorderLayout.NORTH);
        this.add(st,BorderLayout.CENTER);
        this.setSize(500,400);
        this.setVisible(true);
    }
    public void initialize()//初始化控件
    {
        ar = new fdgfg();
        headPanel= new JPanel();
        welcomeLabel = new JLabel("歡迎!  用戶:" + userName);
        st = new StartPanel();
        rp = new RunningPanel();
        ep = new EndPanel();
        timeUse = new JLabel();
    }
    public void setHeadPanel()
    {
        headPanel.setLayout(new FlowLayout());
        headPanel.add(welcomeLabel);
        headPanel.add(timeUse);
    }
    //開始面板
    class TimeThread extends Thread //計時器線程
    {
        int min;
        int sec;
        int millis;
        long oldTime;
        long timeUsed;
        long timeSeted;
        JLabel display;
        boolean stop = false;
        public TimeThread(long timeSeted,JLabel display) 
        {
            oldTime = System.currentTimeMillis();
            this.display = display;
            this.timeSeted = timeSeted;
            // TODO Auto-generated constructor stub
        }
        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();
 
            do
            {
                timeUsed = System.currentTimeMillis() - oldTime;
                min = (int)(timeUsed/60000L);
                sec = (int)((timeUsed%60000L)/1000L);
                millis = (int)((timeUsed%60000L)%1000L);
                try {
                    sleep(11);
                } catch (InterruptedException e) {
                    // TODO: handle exception
                }
                display.setText("已用時:" + min+ ":" + sec +":" + millis );
                display.setVisible(true);
 
            }while(timeUsed <= timeSeted && !stop);
            if(!stop)//如果不是手動停止的就運行complete
                rp.complete();
        }
        public void setStop()
        {
            stop = true;
        }
    }
    class StartPanel extends JPanel
    {
        JPanel inputOptionPanel;         //輸入選項面板①
        JPanel selectOperatorOptionPanel;//選擇運算符面板②
        JPanel bottomPanel;              //底部面板③
 
        JLabel inputBitLabel;             //輸入位數提示①-1
        JTextField inputBitField;        //輸入位數區域①-2
        JLabel inputNumLabel;            //輸入題目個數提示①-3
        JTextField inputNumField;        //輸入題目個數區域①-4
        JLabel inputTimeLabel;           //輸入做題時間提示①-5
        JPanel inputTimePanel;           //輸入做題時間區域①-6
 
        ButtonGroup operatorGroup;
        JRadioButton addButton ;         //加法按鈕②-1
        JRadioButton minusButton ;         //減法按鈕②-2
        JRadioButton multiplyButton ;     //乘法按鈕②-3
        JRadioButton divideButton ;         //除法按鈕②-4
        JRadioButton mixButton     ;         //混合運算按鈕②-5
 
        JLabel  errorInfo;               //錯誤信息③-1
        JButton startButton;             //開始按鈕③-2
 
        JTextField inputByminutes;       //輸入分鐘區域①-6-1
        JLabel printMinute;                 //打印提示“分”①-6-2
        JTextField inputByseconds;       //輸入秒鐘區域①-6-3
        JLabel printSecond;              //打印提示“秒”①-6-4
        public StartPanel()
        {
            //this.setLayout(new GridLayout(0,1));
            this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
            this.initialize();
            this.setInputOptionPanel();
            this.setSelectOperatorOptionPanel();
            this.setBottomPanel();
            this.addStartEvent();
            this.add(inputOptionPanel);
            this.add(selectOperatorOptionPanel);
            this.add(bottomPanel);
        }
        public void initialize()              //初始化所有控件
        {
            inputOptionPanel = new JPanel();
            selectOperatorOptionPanel = new JPanel();
            bottomPanel = new JPanel();
            inputBitLabel = new JLabel("輸入題目位數:");
            inputBitField = new JTextField("1");//默認一位
            inputNumLabel = new JLabel("輸入題目個數:");
            inputNumField = new JTextField("10");//默認產生10題
            operatorGroup = new ButtonGroup();
            addButton = new JRadioButton("加法");
            minusButton = new JRadioButton("減法");
            multiplyButton = new JRadioButton("乘法");
            divideButton = new JRadioButton("除法");
            mixButton = new JRadioButton("混合");
            errorInfo = new JLabel();
            startButton = new JButton("開始做題!");    
            inputTimeLabel = new JLabel("輸入做題時間:");
            inputTimePanel = new JPanel();
            inputByminutes = new JTextField();
            printMinute = new JLabel("分");
            inputByseconds = new JTextField();
            printSecond = new JLabel("秒");
        }
        //設置做題時間面板
        public void setInputTimePanel()
        {
            inputTimePanel.setLayout(new GridLayout(1,0));
            printMinute.setHorizontalAlignment(SwingConstants.CENTER);
            printSecond.setHorizontalAlignment(SwingConstants.CENTER);
            inputTimePanel.add(inputByminutes);
            inputTimePanel.add(printMinute);
            inputTimePanel.add(inputByseconds);
            inputTimePanel.add(printSecond);
        }
        //設置輸入選項面板
        public  void setInputOptionPanel()
        {
            inputOptionPanel.setLayout(new GridLayout(3,2));
            inputBitLabel.setHorizontalAlignment(SwingConstants.CENTER);
            inputNumLabel.setHorizontalAlignment(SwingConstants.CENTER);
            inputTimeLabel.setHorizontalAlignment(SwingConstants.CENTER);
            inputOptionPanel.add(inputBitLabel);
            inputOptionPanel.add(inputBitField);
            inputOptionPanel.add(inputNumLabel);
            inputOptionPanel.add(inputNumField);
            inputOptionPanel.add(inputTimeLabel);
            setInputTimePanel();
            inputOptionPanel.add(inputTimePanel);
        }
        //設置選擇運算符面板
        public void setSelectOperatorOptionPanel()
        {
            //selectOperatorOptionPanel.setLayout(new GridLayout(1,0));
            selectOperatorOptionPanel.setLayout(new BoxLayout(selectOperatorOptionPanel,BoxLayout.X_AXIS));
 
            operatorGroup.add(addButton);
            operatorGroup.add(minusButton);
            operatorGroup.add(multiplyButton);
            operatorGroup.add(divideButton);
            operatorGroup.add(mixButton);
            selectOperatorOptionPanel.add(addButton);
            selectOperatorOptionPanel.add(minusButton);
            selectOperatorOptionPanel.add(multiplyButton);
            selectOperatorOptionPanel.add(divideButton);
            selectOperatorOptionPanel.add(mixButton);
        }
        public void setBottomPanel()
        {
            bottomPanel.setLayout(new GridLayout(0,1));
            bottomPanel.add(errorInfo);
            bottomPanel.add(startButton);
        }
        //添加開始按鈕處理事件
        public void addStartEvent()
        {
            startButton.addActionListener(new StartButtonListener());
        }
        //內部類,實現開始事件
        class StartButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
            {
                ar.v.clear();//清空向量
                char operator = '+';//默認加法
                if(minusButton.isSelected())
                {
                    operator = '-';
                }
                else if(multiplyButton.isSelected())
                {
                    operator = '*';
                }
                else if (divideButton.isSelected())
                {
                    operator = '/';
                }
                else if (mixButton.isSelected())//混合運算
                {
                    operator = '.';
                }
                try 
                {
                    int numOfEquation = Integer.parseInt(inputNumField.getText());
                    int bigOfEquation = Integer.parseInt(inputBitField.getText());
                    int minSeted = Integer.parseInt(inputByminutes.getText());
                    int secSeted = Integer.parseInt(inputByseconds.getText());
                    long millisSeted = (minSeted *60 + secSeted) * 1000;
                    timer = new TimeThread(millisSeted,timeUse);
                    timer.start();
                    if(numOfEquation > 100)
                        throw new NumberTooBigException("這么多題,你做的完嗎?");
                    rp.getTotalPage(numOfEquation);//獲得總頁數
                    rp.setPageLabel();
                    if(bigOfEquation > 9)
                        throw new NumberTooBigException("輸入的位數太高了");
                    else if (bigOfEquation == 0)
                        throw new NumberTooBigException("位數不能為0");
                    while(ar.v.size() < numOfEquation)
                    {
                        ar.produceExpression(bigOfEquation,operator);
                    }
                    OverAllFrame.this.v = ar.v;
                    rp.writeEquationToLabel();
 
                    OverAllFrame.this.st.setVisible(false);//開始面板調為不可見
                    OverAllFrame.this.add(rp,BorderLayout.CENTER);
                    OverAllFrame.this.setVisible(true);//更新窗口
                    OverAllFrame.this.rp.setVisible(true);//顯示做題面板
                } 
                catch(NumberFormatException  ex)
                {
                    errorInfo.setText("輸入數據類型錯誤!你必須輸入數值數據!,請重新輸入:");
                }
                catch(NumberTooBigException ex)
                {
                    errorInfo.setText(ex.getMessage());
                }
                catch(Exception ex)
                {
 
                }
 
            }
        }
    }
 
    //做題中的面板
    class RunningPanel extends JPanel
    {
        JPanel contentPanel;//存放題目和答案①
        JPanel buttonsPanel;//存放按鈕②
        JLabel pageLabel;   //顯示當前頁/所有頁
        Vector<JLabel> expressionGroup;//顯示題目①-1
        Vector<JTextField> answerGroup;//存放答案①-2
 
        JButton backButton;//上一頁②-1
        JButton nextButton;//下一頁②-2
        JButton completeButton;  //完成②-3
 
        int totalPage = 1;  //總頁數
        int currentPage = 1;//當前頁
        public RunningPanel()
        {
            this.setLayout(new BorderLayout());
            this.initialize();
            this.addItem();
            this.setContentPanel();
            this.setButtonsPanel();
        }
        public void initialize()//初始化
        {
            contentPanel = new JPanel();
            buttonsPanel = new JPanel();
            pageLabel    = new JLabel();
            expressionGroup = new Vector<JLabel>();
            answerGroup     = new Vector<JTextField>();
            for(int i = 0; i < 10 ;i++)
            {
                expressionGroup.add(new JLabel());
                answerGroup.add(new JTextField());
            }
            backButton = new JButton("上一頁");
            nextButton = new JButton("下一頁");
            completeButton = new JButton("完成!");
            backButton.addActionListener(new BackButtonListener());
            nextButton.addActionListener(new NextButtonListener());
            completeButton.addActionListener(new CompleteButtonListener());
 
        }
        public void setContentPanel()
        {
            contentPanel.setLayout(new GridLayout(6,2));
            for(int i = 0; i < 10; i++)
            {
                contentPanel.add(expressionGroup.get(i));
                contentPanel.add(answerGroup.get(i));
            }
        }
        public void setPageLabel()
        {
            pageLabel.setText("頁碼"+currentPage+'/'+totalPage);
        }
        public void setButtonsPanel()
        {
            buttonsPanel.add(backButton);
            buttonsPanel.add(nextButton);
            buttonsPanel.add(completeButton);
        }
        public void writeEquationToLabel()//寫入算式
        {
            //因為只有十個標簽,n道題目,不能一一對應,下面是標簽要加上的數和題目號對應
            int numNeededToAdd = (currentPage-1)*10;
            for(int i = 0; i < 10 ; i++)
            {
                if( i+numNeededToAdd >= v.size())//沒有更多題目了
                {
                    expressionGroup.get(i).setText(String.format("%17s","N/A"));
                }
                else
                {
                    String temp = String.format("%5d%5s%5d%5s",v.get(i+numNeededToAdd).a,
                                                v.get(i + numNeededToAdd).operator,
                                                v.get(i + numNeededToAdd).b,"=");
                    expressionGroup.get(i).setText(temp);
                }
            }
        }
        public void addItem()//添加控件
        {
            this.add(pageLabel,BorderLayout.NORTH);
            this.add(contentPanel,BorderLayout.CENTER);
            this.add(buttonsPanel,BorderLayout.SOUTH);
        }
        public  void getTotalPage(int num)//獲得總頁數
        {
            totalPage = num/10 + (num % 10 == 0 ? 0:1);
        }
        //設置當前頁為1,重做和繼續的時候用到
        public void setCurrentPageToOne()
        {
            currentPage = 1;
        }
        public void writeInputToVector() throws NumberFormatException//寫入答案進向量
        {
            //因為只有十個標簽,n道題目,不能一一對應,下面是標簽要加上的數和題目號對應
            int numNeededToAdd = (currentPage-1)*10;
            for (int i = 0; i < 10 && i+numNeededToAdd <v.size();i++)
            {
                try 
                {
                    if(!answerGroup.get(i).getText().equals(""))//如果不是啥也沒寫的話
                    {
                        v.get(i+numNeededToAdd).d = Integer.parseInt(answerGroup.get(i).getText());
                        if(v.get(i+numNeededToAdd).d == v.get(i + numNeededToAdd).c)
                            v.get(i+numNeededToAdd).is_right = true;
                    }
                    //否則就是默認的-1
 
                } 
                catch(NumberFormatException  e)
                {
                    answerGroup.get(i).setText("輸入數據類型錯誤!請重新輸入:");
                    throw e;//必須這么寫才能終止。。
                }
                catch(Exception e)
                {
                    answerGroup.get(i).setText("未知錯誤!請重新輸入:");
                    try {
      throw e;
     } catch (Exception e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
     }//必須這么寫才能終止。。
                }
            }
        }
        public void clearAnswer()//清空答案
        {
            for (int i = 0; i < answerGroup.size();i++)
            {
                answerGroup.get(i).setText("");
            }
        }
        //寫入答案進輸入區,還原上下頁做過的答案用
        public void writeAnswerTofield()
        {
            //因為只有十個標簽,n道題目,不能一一對應,下面是標簽要加上的數和題目號對應
            int numNeededToAdd = (currentPage-1)*10;
            for(int  i = 0; i < 10 && i+numNeededToAdd <v.size(); i ++)
            {
                if(v.get(i+numNeededToAdd).d != -1)//說明有輸入過值
                {
                    answerGroup.get(i).setText(Integer.toString(v.get(i+numNeededToAdd).d));
                }
            }
        }
        public void complete()//完成做題,用戶點擊完成或者 是時間到了
        {
            try
            {
                //因為第一句可能會產生異常,不過在句中已經處理,這里加上
                //try是讓它停止進入下一頁
                timer.setStop();//計時器線程停止
                OverAllFrame.this.rp.writeInputToVector();//寫入答案進向量
                OverAllFrame.this.ar.writeInfo(v.size(), userName);
                OverAllFrame.this.rp.setVisible(false);//設置做題界面不可見
                OverAllFrame.this.ep.setDisplayAnswer(); //設置要顯示的結果
                OverAllFrame.this.add(ep,BorderLayout.CENTER);
                OverAllFrame.this.setVisible(true);
                OverAllFrame.this.ep.setVisible(true);//顯示答案面板
 
            }
            catch(Exception e)
            {
                //do nothing
            }
 
        }
        class CompleteButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                complete();
            }
        }
        class BackButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
 
                if(currentPage > 1)
                {
                    writeInputToVector();//保存上頁數據
                    clearAnswer();//刪除上頁答案
                    currentPage --;
                    setPageLabel();//更新頁碼
                    writeEquationToLabel();//讀入下頁算式
                    writeAnswerTofield();//讀入下頁已填寫答案
                    RunningPanel.this.setVisible(true);//更新窗口
                }
            }
        }
        class NextButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                if(currentPage < totalPage)
                {
                    writeInputToVector();
                    clearAnswer();//刪除上頁答案
                    currentPage ++;
                    setPageLabel();
                    writeEquationToLabel();
                    writeAnswerTofield();
                    RunningPanel.this.setVisible(true);
                }
            }
        }
 
    }
    //顯示結果面板
    class EndPanel extends JPanel
    {
        JScrollPane displayArea;//顯示區域
        JPanel bottomArea;      //底部區域,存放按鈕
        JTextArea displayAnswer;//顯示答案和評分
        JTextArea displayRank;  //顯示排名和得分
 
        JButton reDoButton;//重做
        JButton continueButton;//繼續練習
        JButton viewRankButton;//查看排名
 
        Font answerFont ; //字體屬性
        boolean isRankViewed = false;//是否查看過排名
        boolean alreadyWrite = false;//已經寫入排名信息
        public EndPanel()
        {
            this.setLayout(new BorderLayout());//邊界布局
            this.initialize();
            this.setBottomArea();
            this.addItem();
 
        }
 
        public void initialize()//初始化
        {
            answerFont = new Font("宋體",Font.PLAIN,15);
            displayAnswer = new JTextArea();
            displayAnswer.setFont(answerFont);//設置字體
            displayArea = new JScrollPane(displayAnswer);
            displayRank = new JTextArea();
            displayRank.setFont(answerFont);
            bottomArea  = new JPanel();
            reDoButton = new JButton("重做一遍");
            continueButton = new JButton("繼續練習");
            viewRankButton = new JButton("查看排名");
            reDoButton.addActionListener(new ReDoButtonListener());
            continueButton.addActionListener( new ContinueButtonListener());
            viewRankButton.addActionListener(new viewRankButtonListener());
 
        }
        public void setDisplayAnswer()//添加答案
        {
            displayAnswer.setEditable(false);//只顯示答案,不可編輯
            String temp ;
            int score = 0;
            temp = (String.format("%5s%5s%5s%5s%5s%10s%5s","","",
                    "","","正確答案","你的答案","判斷")) + "\r\n";
            displayAnswer.append(temp);
            for(int i = 0 ;i < v.size() ;i++)
            {
                temp = (String.format("%5d%5s%5d%5s%10d%10d%10s",v.get(i).a,v.get(i).operator,
                                    v.get(i).b,"=",v.get(i).c,v.get(i).d,(v.get
                                        (i).is_right ? "正確":"錯誤")))+ "\r\n";
                displayAnswer.append(temp);
                if(v.get(i).is_right)
                {
                    score += 100.0/v.size();
                }
            }
            temp = ("你的總分:" + score +"\r\n");
            displayAnswer.append(temp);
 
        }
        public void setDisplayRank()
        {
            if(alreadyWrite)//如果已經執行過了
                return;
            alreadyWrite = true;
            viewRankButton.setText("查看答案");
            displayRank.setEditable(false);
            FileReader file ;
            BufferedReader bf ;
            String tempString;//臨時用戶名
            String tempIntedString;//臨時分數的String形式
            double tempInt;//臨時分數
            //用戶名和用戶最高分的映射關系
            HashMap<String,Double> map = new HashMap<String,Double>();
            try 
            {
                file = new FileReader("UserNameAndScore.data");
                if(!file.ready())
                {
                    displayRank.setText("無有效數據");
                }
                bf = new BufferedReader(file);
 
                tempString=bf.readLine();
                tempIntedString=bf.readLine();
                while( tempString!= null && tempIntedString != null)
                {
                    tempInt = Double.parseDouble(tempIntedString);
                    //確保顯示的為每個人歷史所得最高分
                    if(!(map.containsKey(tempString) && tempInt <= map.get(tempString)))
                    {    
                        map.put(tempString, tempInt);
                    }
                    tempString=bf.readLine();
                    tempIntedString=bf.readLine();
                }
            } catch (Exception e) 
            {
                System.out.println(e.getMessage());
                viewRankButton.setText("文件異常");
            }
            Vector<UserRankInfo> v = new Vector<UserRankInfo>();
            Iterator<String> it = map.keySet().iterator();
            UserRankInfo temp;
 
            while(it.hasNext())
            {
                tempString = it.next();
                temp = new UserRankInfo(tempString,map.get(tempString));
                v.add(temp);
            }
            Collections.sort(v,new UserRankInfo());
            int rank = 1;
            displayRank.append(String.format("%10s%10s%10s", "排名","用戶名","得分")+ "\r\n");
            for(UserRankInfo u:v)
            {
                displayRank.append(String.format("%10d%15s%15f", rank++,u.userName,u.score)+ "\r\n");
            }
 
        }
        public void setBottomArea()//添加底部按鈕
        {
            bottomArea.setLayout(new FlowLayout());
            bottomArea.add(reDoButton);
            bottomArea.add(continueButton);
            bottomArea.add(viewRankButton);
        }
        public void addItem()//添加組件
        {
 
            this.add(displayArea,BorderLayout.CENTER);
            this.add(bottomArea,BorderLayout.SOUTH);
        }
        public void recoverAnswerArea()//恢復答案區域
        {
            viewRankButton.setText("查看排名");
            displayArea.setViewportView(displayAnswer);
            displayAnswer.setVisible(true);
            isRankViewed = false;
        }
        class ReDoButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                OverAllFrame.this.rp.setCurrentPageToOne();//設置當前頁碼 為1
                OverAllFrame.this.ep.setVisible(false);//隱藏結果面板
                OverAllFrame.this.rp.clearAnswer();//先清除做題面板的內容
                OverAllFrame.this.rp.setVisible(true);//顯示做題面板
                if(isRankViewed)
                    recoverAnswerArea();
            }
        }
        class ContinueButtonListener implements ActionListener
        {
            public void actionPerformed(ActionEvent ae)
            {
                OverAllFrame.this.rp.setCurrentPageToOne();//設置當前頁碼 為1
                OverAllFrame.this.rp.clearAnswer();//先清除做題面板的內容
                OverAllFrame.this.ep.setVisible(false);//隱藏結果面板
                OverAllFrame.this.st.setVisible(true);//顯示開始面板
                if(isRankViewed)
                    recoverAnswerArea();
 
            }
        }
        class viewRankButtonListener implements ActionListener
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                if(!isRankViewed )
                {
 
                    setDisplayRank();//寫入排名信息
                    displayAnswer.setVisible(false);
                    displayArea.setViewportView(displayRank);
                    displayRank.setVisible(true);
                    isRankViewed = true;
                }
                else
                {
                    recoverAnswerArea();
                }
 
            }
        }
        //實現比較接口的用戶排名類
        class UserRankInfo implements Comparator<UserRankInfo>
        {
            public String userName;
            public double score;
 
            public UserRankInfo(String userName,double score)
            {
                this.userName = userName;
                this.score = score;
            }
            public UserRankInfo()
            {
                //none
            }
            @Override
            public int compare(UserRankInfo arg0, UserRankInfo arg1) 
            {
                if(arg0.score < arg1.score)
                    return 1;
                else if(arg0.score > arg1.score)
                    return -1;
                return 0;
            }
 
        }
    }
}

 

 

 

總結:

合作同伴32馬志磊:http://www.cnblogs.com/mac54321/

因為之前的四則運算是用C語言寫的,這次的結對要做界面,所以為了做界面方便,就推到了之前的代碼重新做java版本的四則運算,在本次的java版本上 構思吸取了 之前C語言版本的想法,仍然是讓用戶選擇加法還是減法還是其他。因為這樣模塊性比較好,邏輯比較清晰。在做這個版本的時候框架和界面花了比較長的時間,但是還是一部分占比比較大的就是考慮容錯性的問題,起碼30%的時間都在考慮用戶會怎么輸錯,雖然實際應用中可能用不到,但是這也是很必須的,最后添加的排名功能,雖然只是一點小小的改進,但是結合了用戶帳號輸入的功能,使得其發揮應有的作用,不然用戶帳號輸入就沒有什么意義了。進過此次學習之后,發覺了,兩個人編程的精巧之處,畢竟如果是單獨寫代碼,自己錯了自己是很難看出來的,兩個人寫的話,有問題能及時提出來,使得不會陷入泥潭,等麻煩大了才反映過來,那就晚了,而且這次本來是預計一個星期的時間完成的,但是考慮到時間的緊迫性,我們還是提前完成了,對于其他組,我也去看了看,很多是因為做的順序導致了時間的延緩甚至回爐重做,比如說先寫了很多功能,然后再寫界面才發現很多適配性的問題,又要根據界面去改功能,對于此,我們組的策略還是按照現代軟件工程里介紹的,先做可行性分析,再敲代碼,而不是一上來就寫代碼,所以我們的彎路少走了一些,時間自然提前了一點。經過這次之后,發覺了很多時候不是技術性的問題,畢竟技術性的問題請教一下,或者上網看看,都能解決,很多時候是經驗不足,還有缺少規范化而導致了種種小問題,然而很多小問題不能及時處理,最后導致了出現瓶頸,所以以后我還是要注意一下這方面。

這個四則運算程序擴展的方向主要有:

1.計時,還有自由限定做題提示,還有完成時候提醒用時多少。

2.答題完成的時候顯示做對哪道題,做錯哪道題,正確答案多少,當初自己寫的答案多少。

3.設置了用戶登陸名,這有個好處,可以記錄其他用戶的做題記錄,并且構成一個排行,內部用hashmap實現,提升趣味。

4.整個界面清晰易懂

缺點:1.沒有做到多個運算符,使得題目難度無法提升

2.沒有做到計算到小數,主要是當初定義為整型,這個在后面沒有修改。

3.沒有做界面換膚功能。

時間分析:http://www.cnblogs.com/kasion/p/4398918.html


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()