/***************************************** 題目:魔術方塊 說明:請在視窗上配置一文字方塊及一按鈕,在文字方塊 上輸入階數n(n<=15,且為奇數),按上述按鈕後,輸出之 魔術方塊,該方塊之各列和各行和與對角線之和均相等。 程式中必須有須有判斷範圍的程式,若是超出題目所訂定 的數值範圍則要求重新輸入。 *************************************************/ import java.awt.*; import javax.swing.*; import java.awt.event.*; //想想還有沒有其他的東西要import public class f4 extends JFrame implements ActionListener//名稱改一改 { Container c; //設定UI元件 JLabel ta,tans; JTextField ia; JTextArea ans; JButton bot; //設定共用的變數與類別 public f4() //建構元,名稱改一改 { super("魔術方塊"); c=getContentPane();//取得ContentPane //設定版面設定 c.setLayout(new FlowLayout(FlowLayout.CENTER));//設定為用flowlayout //初始化UI元件 ta=new JLabel("請輸入階數"); tans=new JLabel("結果"); ia=new JTextField("5",5); bot=new JButton("計算"); ans=new JTextArea(11,50); ans.setEditable(false); //將UI元件加入版面中 c.add(ta); c.add(ia); c.add(bot); c.add(tans); c.add(ans); //設定UI元件與滑鼠的事件觸發傾聽者 bot.addActionListener(this); setSize(640,480);//設定size,顯示出去 setVisible(true); } public void paint(Graphics g) { super.paint(g);//畫出元件 } //UI元件事件處理類別寫在這裡 //滑鼠事件處理類別寫在這裡 public void actionPerformed(ActionEvent e) { int i,j,scale,cnt; int x_pt,y_pt,nx_pt,ny_pt; int matrix[][]=new int [15][15]; //初始化陣列 for (i=0;i<15;i++) for (j=0;j<15;j++) matrix[i][j]=0; scale=Integer.parseInt(ia.getText()); if ((scale%2)==0 ) //長度超過或不足 { ans.setText("請輸入奇數!"); repaint(); return; } else if ( scale<0 || scale>15) { ans.setText("輸入數字太大或太小請重新輸入"); repaint(); return; } //正式開始算 y_pt=0; x_pt=scale/2; cnt=scale*scale; for (i=1;i<=cnt;i=i+1) { matrix[y_pt][x_pt]=i; ny_pt=y_pt-1; if (ny_pt<0) ny_pt=scale-1; nx_pt=x_pt+1; if (nx_pt>=scale) nx_pt=0; if (matrix[ny_pt][nx_pt]!=0) //已填過且不是最後一個 { ny_pt=y_pt+1;//跳到下一列 if (ny_pt>=scale) ny_pt=0; nx_pt=x_pt; //X保持原狀 } x_pt=nx_pt; y_pt=ny_pt; } /*****印出方陣*********/ ans.setText(""); for (i=0;i