SourcePost____


このページのコンテンツ一覧(5個位までにしてください。上が最新で下が最古です)

宿題スレPart55 >>336 への回答 五目並べ

昔作ったhttp://www.wikiroom.com/java/index.php?SourcePost#s4a44366の改良。
無駄に動作イメージ載せておきました(ページ左下tictactoe.jpg)。
バグある可能性高し。

  // TicTacToe.java
  public class TicTacToe {
      public static void main(String[] args) {
          TicTacToeFrame frame = TicTacToeFrame.getInstance();
          frame.setTitle( "五目並べ" );
          frame.setSize( 500, 500 );
          frame.setResizable( false );
          frame.setVisible( true );
          frame.player1.play();
      }
  }
  // TicTacToeFrame.java
  import java.awt.BorderLayout;
   import java.awt.Button;
   import java.awt.Color;
   import java.awt.Dialog;
   import java.awt.Frame;
   import java.awt.GridLayout;
   import java.awt.Label;
   import java.awt.Panel;
   import java.awt.TextField;
   import java.awt.event.ActionEvent;
   import java.awt.event.ActionListener;
   import java.awt.event.WindowEvent;
   import java.awt.event.WindowListener;
  public class TicTacToeFrame extends Frame implements ActionListener, WindowListener {
      Button[] buttons = new Button[100];
      TextField tf = new TextField();
      Player player1, player2;
      private TicTacToeFrame() {
          Panel panel = new Panel( new GridLayout( 10, 10 ) );
          setLayout( new BorderLayout() );
          for( int i=0; i<buttons.length; i++ ) {
              buttons[i] = new Button();
              buttons[i].setBackground( Color.WHITE );
              buttons[i].addActionListener( this );
              buttons[i].setName( "" + i );
              panel.add( buttons[i] );
          }
          add( BorderLayout.CENTER, panel );
          add( BorderLayout.SOUTH,  tf );
          addWindowListener(this);
          createPlayers();
          tf.setEditable( false );
          tf.setText( "next: ● " + player1.getName() + "さん" );
      }
      private static TicTacToeFrame self = new TicTacToeFrame();
      public static TicTacToeFrame getInstance() {
          return self;
      }
      /**
       * プレイヤの生成
       *
       */
      private void createPlayers() {
          final Dialog dialog = new Dialog( this, "プレイヤの生成", true );
          Panel panel = new Panel( new GridLayout( 2, 1 ) );
          Panel panel1 = new Panel( new BorderLayout() );
          Panel panel2 = new Panel( new BorderLayout() );
          final TextField tf1, tf2;
          panel1.add( new Label( "先手" ), BorderLayout.WEST );
          panel1.add( tf1 = new TextField( "( ´д)" ), BorderLayout.CENTER );
          panel2.add( new Label( "後手" ), BorderLayout.WEST );
          panel2.add( tf2 = new TextField( "(д` )" ), BorderLayout.CENTER );
          panel.add( panel1 );
          panel.add( panel2 );
          Button playButton = new Button( "play" );
          playButton.addActionListener( new ActionListener() {
              public void actionPerformed( ActionEvent ae ) {
                  player1 = new Human( tf1.getText(), "●" );
                  player2 = new Human( tf2.getText(), "○" );
                  dialog.dispose();
              }
          } );
          dialog.add( panel, BorderLayout.CENTER );
          dialog.add( playButton, BorderLayout.SOUTH );
          dialog.setSize( 200, 100 );
          dialog.setLocation( this.getX() + 0, this.getY() + 50 );
          dialog.setResizable( false );
          dialog.setVisible( true );
      }
      /**
       * Humanがボタンを押した。
       * 次にバトンタッチする(HumanかCPUのplay()を呼ぶ)。
       */
      public void actionPerformed(ActionEvent e) {
          int num = Integer.parseInt( ((Button)e.getSource()).getName() );
          Player nowPlayer = getTurn( player1.getMyList().size() + player2.getMyList().size() );
          nowPlayer.addMyList( num );
          buttons[num].setLabel( nowPlayer.getLabel() );
          buttons[num].setEnabled(false);
          // 勝ち負け判定
          if( nowPlayer.getMyList().size() >= 5 ) {
              // 最後まで行った
              if( player1.getMyList().size() + player2.getMyList().size() == 100 ) { // TODO
                  // 決着が付かない
                  if( !nowPlayer.judge() ) {
                      showEndMessage( "引き分け" );
                      return;
                  }
              }
              if( nowPlayer.judge() ) {
                  String str;
                  if( nowPlayer.getLabel().equals( "●" ) ) str = "先手";
                  else str = "後手";
                  showEndMessage( str + "の" + nowPlayer.getName()+"さんの勝ち" );
                  return;
              }
          }
          // 対戦相手にバトンタッチ
          Player opponent = getTurn( player1.getMyList().size() + player2.getMyList().size() );
          opponent.play();
          tf.setText( "next: " + opponent.getLabel() + " " + opponent.getName() + "さん" );

      }
      /**
       * 終了時のダイアログを表示
       * @param message 表示するメッセージ
       */
      public void showEndMessage( String message ) {
          Dialog dialog = new Dialog( this, message, true );
          Button okButton = new Button( "ok" );
          okButton.addActionListener( new ActionListener() {
              public void actionPerformed( ActionEvent ae ) {
                  dispose();
              }
          } );
          dialog.add( new Label( message + "です。"), BorderLayout.CENTER );
          dialog.add( okButton, BorderLayout.SOUTH );
          dialog.setSize( 200, 100 );
          dialog.setLocation( this.getX() + 0, this.getY() + 50 );
          dialog.setResizable( false );
          dialog.setVisible( true );
      }
      /**
       * 誰の順番なのかを判断
       * @param already すでに○か×が描かれている数
       * @return 先手または後手
       */
      public Player getTurn( int already ) {
          return (already % 2 == 0) ? player1 : player2;
      }
      public void windowOpened(WindowEvent e) {}
      public void windowClosing(WindowEvent e) {
          dispose();
      }
      public void windowClosed(WindowEvent e) {}
      public void windowIconified(WindowEvent e) {}
      public void windowDeiconified(WindowEvent e) {}
      public void windowActivated(WindowEvent e) {}
      public void windowDeactivated(WindowEvent e) {}
  }
  // Player.java
  import java.util.TreeSet;
  public abstract class Player {
      private String name;
      private String label;
      private TreeSet<Integer> myList;
      public Player( String name, String label ) {
          this.name = name;
          this.label = label;
          myList = new TreeSet<Integer>();
      }
      // TODO デバッグ用
      public Player( Integer[] list ) {
          myList = new TreeSet<Integer>();
          for( int i=0; i<list.length; i++ ) {
              myList.add( list[i] );
          }
      }
      public TreeSet<Integer> getMyList() {
          return myList;
      }
      public void addMyList( int position ) {
          myList.add( position );
      }
      public String getName() {
          return name;
      }
      public String getLabel() {
          return label;
      }
      public abstract void play();
      /**
       * 列をそろえているかどうか判定
       * 
       * @return そろえていればtrue
       */
      public boolean judge() {
          Integer[] positionsObject = (Integer[])(getMyList().toArray( new Integer[0] ));
for( int i=0; i<positionsObject.length; i++ )System.out.print( positionsObject[i] + ", " );
System.out.println();
           int count = 0;
           // 上から下への判定
           for( int i=0; i<positionsObject.length-1; i++ ) {
               for( int j=0; j<5; j++ ) {
                   if( getMyList().contains( positionsObject[i] + (10*j) ) ) count++;
               }
               if( count >= 5 ) return true;
               else count = 0;
           }
           count = 0;
           // 左から右への判定
           for( int i=0; i<positionsObject.length-1; i++ ) {
               for( int j=0; j<5; j++ ) {
                   if( getMyList().contains( positionsObject[i] + (1*j) ) && (positionsObject[i]/10==(positionsObject[i]+(1*j))/10) ) count++;
               }
               if( count >= 5 ) return true;
               else count = 0;
           }
           count = 0;
           // 左上から右下への判定
           for( int i=0; i<positionsObject.length-1; i++ ) {
               for( int j=0; j<5; j++ ) {
                   if( getMyList().contains( positionsObject[i] + (11*j) ) && (positionsObject[i]%10<=(positionsObject[i]+(11*j))%10) ) count++;
               }
               if( count >= 5 ) return true;
               else count = 0;
           }
           count = 0;
           // 右上から左下への判定
           for( int i=0; i<positionsObject.length-1; i++ ) {
               for( int j=0; j<5; j++ ) {
                   if( getMyList().contains( positionsObject[i] + (9*j) ) && (positionsObject[i]%10>=(positionsObject[i]+(9*j))%10) ) count++;
               }
               if( count >= 5 ) return true;
               else count = 0;
           }
           return false;
      }
  }
  // Human.java
  public class Human extends Player {
      public Human(String name, String label) {
          super(name, label);
      }
      // TODO デバッグ用
      public Human( Integer[] list ) {
          super(list);
      }
      public void play() {
          // 人まかせ
      }
  }

宿題スレPart55 >>301 への回答 素数表示

 //Q55_301.java
 import java.io.*;
 public class Q55_301 {
   public static void main(String[] args) throws IOException {
     BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
     System.out.println("いくつまでの素数を表示するか入力してください");
     try{
       Prime prm = new Prime(Integer.parseInt(buf.readLine()));
       prm.calc();
     }catch(NumberFormatException e){
       System.out.println("数字を入力してください");
     }
   }
 }
 class Prime {
   int endNum;
   public Prime(int endNum){
     this.endNum = endNum;
   }
   public void calc(){
     if(endNum <= 2){
       System.out.println("2以上の数値を入力してください");
       return;
     }
     for(int i = 2; i <= endNum; i++){
       for(int k = 2; k <= i; k++){
         if(k == i)
           System.out.println(Integer.toString(i));
         else if((i % k) == 0)
           break;
       }
     }
   }
 }

宿題スレPart55 >>294 への回答 足し算

   // PlusDemo.java
   import java.io.BufferedReader;
   import java.io.IOException;
   import java.io.InputStreamReader;
   /**
    * @see ttp://java.sun.com/j2se/1.4/ja/docs/ja/guide/misc/threadPrimitiveDeprecation.html
    */
   public class PlusDemo implements Runnable {
       private volatile Thread blinker = null;
       
       public static void main(String[] args) {
           PlusDemo self = new PlusDemo();
           self.process();
       }
       
       public PlusDemo() {
           this.blinker = new Thread(this);
           this.blinker.start();
       }
       
       public void process() {
           try {
               BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );
               System.out.print( "> " );
               int a = Integer.parseInt( br.readLine() );
               System.out.print( "> " );
               int b = Integer.parseInt( br.readLine() );
               System.out.println( a+b );
               stop();
           } catch( IOException ioe ) {
               ioe.printStackTrace();
           }
       }
       
       public void stop() {
           Thread moribund = blinker;
           blinker = null;
           moribund.interrupt();
       }
       
       public void run() {
           Thread thisThread = Thread.currentThread();
           while( blinker == thisThread ) {
               try {
                   Thread.sleep( 10000 );
                   System.out.print( "*" );
               } catch( InterruptedException ie ) {}
           }
       }
   }

宿題スレPart55 >>275 への回答 金庫開錠

   // CashboxDemo.java
   import java.io.BufferedReader;
   import java.io.IOException;
   import java.io.InputStreamReader;
   
   public class CashboxDemo {
       public static void main(String[] args) throws IOException {
           int money = 100000;
   
           // 左から8に合わせる
           // 左から2に合わせる
           // 右から5に合わせる
           // 左から1に合わせる
           // 右から3に合わせる
           int[] key = new int[] { -8, -2, 5, -1, 3, };
           
           Cashbox cashbox = new Cashbox( money, key );
           loop: while( true ) {
               System.out.println( "今" + cashbox.getNowPosition() + "番になってます。" );
               System.out.print( "1:右にまわす? 2:左にまわす?(exitであきらめ)\n> " );
               BufferedReader br = new BufferedReader( new InputStreamReader(System.in) );            
               String line1 = br.readLine();
               try {
                   if( line1.equalsIgnoreCase("exit") ) {
                       System.out.println( "あきらめます..." ); 
                       System.exit(0);
                   }
                   if( !line1.equals("1") && !line1.equals("2") ) throw new IllegalArgumentException( "1か2で。" );
                   System.out.print( "何番に合わせる?\n> " );
                   String line2 = br.readLine();
                   int turn = Integer.parseInt(line1);
                   int num  = Integer.parseInt(line2);
                   switch( turn ) {
                       // 右に回す
                       case 1: {
                           if( cashbox.turnRight( num ) ) break loop;
                           break;
                       // 左に回す
                       } case 2: {
                           if( cashbox.turnLeft( num ) ) break loop;
                           break;
                       } default: {
                           throw new IllegalArgumentException();
                       }
                   }
               } catch( IllegalArgumentException iae ) {
                   System.out.println( "エラー!! " + iae.getMessage() );
                   continue;
               }            
           }
           System.out.println( "開錠成功!! " + cashbox.getMoney() + "円あります。" );
       }
   }
   // Cashbox.java
   public class Cashbox {
       private int money;
       private int[] key;
       
       /**
        * 第一引数:現在の位置
        * 第二引数:どのステップまで進んだか
        */
       private int[] status = new int[] { 0, -1, };
       
       /**
        * コンストラクタ
        * @param money 金額
        * @param key 開錠キー
        */
       public Cashbox( int money, int[] key ) {
           this.money = money;
           this.key = key;
       }
       
       public int getMoney() {
           return this.money;
       }
       
       /**
        * つまみを右にひねる。
        * @param number どの番号に合わせるか
        * @return 金庫を開けるかどうか
        */
       public boolean turnRight( int number ) {
           if( number <= 0 || number > 10 )throw new IllegalArgumentException( "つまみのひねり方が変です。" );
           status[0] = number;
           if( status[0] < 0 ) status[0] += 10;
           status[0] %= 10;
           return check( number );
       }
       
       /**
        * つまみを左にひねる。
        * @param number どの番号に合わせるか
        * @return 金庫を開けるかどうか
        */
       public boolean turnLeft( int number ) {
           if( number <= 0 || number > 10 )throw new IllegalArgumentException( "つまみのひねり方が変です。" );
           status[0] = number;
           if( status[0] < 0 ) status[0] += 10;
           status[0] %= 10;
           return check( number*(-1) );
       }
       
       /**
        * チェック
        * @param number どの番号に合わせるか
        * @return 金庫を開けるかどうか
        */
       private boolean check( int number ) {
           int now = getNowPosition();
           // 左回り
           if( number < 0 ) {
               now *= -1;
           }
           int aaa = key[++status[1]];
           if( now == aaa ) {
               // 開ける
               if( status[1] == key.length -1 ) {
                   return true;
               }
           } else {
               status[1] = -1;
           }
           return false;
       }
       
       /**
        * 今の目盛りを返却する。
        * @return 今の目盛り
        */
       public int getNowPosition() {
           return this.status[0];
       }
   }

宿題スレPart55 >>251-252 への回答 逆行列計算

http://www.wikiroom.com/java/index.php?SourcePost__#p36dc362の改造。
>>251-252の要求を満たすだけならMatrix.power()は不要です。

   // InverseMatrixDemo.java
   public class InverseMatrixDemo {
       public static void main(String[] args) {
           double[][] matrix1 = new double[][] {
                   { 1, 2, },
                   { 3, 4, },
           };
           try {
               double[][] inverse = Matrix.inverse( matrix1 );
               System.out.println( "元の行列:" );
               Matrix.printMatrix( matrix1 );
               System.out.println();
               System.out.println( "逆行列:" );
               Matrix.printMatrix( inverse );
               System.out.println();
               System.out.println( "試しに行列とその逆行列の積を計算してみる:" );
               Matrix.printMatrix( Matrix.multiply(matrix1, inverse) );
           } catch( IllegalArgumentException iae ) {
               iae.printStackTrace();
           }
       }
   
   }
   // Matrix.java
   public class Matrix {
       /**
        * 行列の出力
        * @param matrix 行列
        */
       public static void printMatrix(double[][] matrix) {
           // 出力
           int ROWS = matrix.length;
           int COLS = matrix[0].length;
           for (int i = 0; i < ROWS; i++) {
               System.out.print("[ ");
               for (int j = 0; j < COLS; j++) {
                   System.out.printf("%8.3f\t", matrix[i][j]);
               }
               System.out.println("]");
           }
       }
   
       /**
        * 逆行列の計算
        * アルゴリズムはLU分解法
        * @see ttp://www.fuka.info.waseda.ac.jp/~kozo/suuchi/simple_equation/simple_equation_4.html
        * @param matrix 行列
        * @return 逆行列
        * @exception 逆行列を持たない行列の場合に発生させる。
        */
       public static double[][] inverse( double[][] matrix ) throws IllegalArgumentException {
           // 逆行列が存在するときは与えられる行列は必ず正方行列。
           if (matrix.length != matrix[0].length) {
               throw new IllegalArgumentException("正方行列ではないので逆行列計算はできません。");
           }
           double[][] matrix_ = new double[matrix.length][matrix.length];
           for( int i=0; i<matrix_.length; i++ ) {
               for( int j=0; j<matrix_[0].length; j++ ) {
                   matrix_[i][j] = matrix[i][j];
               }
           }
           double[][] result = new double[matrix_.length][matrix_.length];
           // LU分解
           int n = matrix_.length;
           for( int i=0; i<n; i++ ) {
               for( int j=i+1; j<n; j++ ) {
                   matrix_[j][i] /= matrix_[i][i];
                   for( int k=i+1; k<n; k++ ) {
                       matrix_[j][k] -= matrix_[i][k] * matrix_[j][i];
                   }
               }
           }
           // 逆行列を求める
           for( int k=0; k<n; k++ ) {
               // 初期化
               for( int i=0; i<n; i++ ) {
                   if( i==k ) result[i][k] = 1;
                   else result[i][k] = 0;
               }
               // 解を求める
               for( int i=0; i<n; i++ ) {
                   for( int j=i+1; j<n; j++ ) {
                       result[j][k] -= result[i][k] * matrix_[j][i];
                   }
               }
               for( int i=n-1; i>=0; i-- ) {
                   for( int j=i+1; j<n; j++ ) {
                       result[i][k] -= matrix_[i][j] * result[j][k];
                   }
                   result[i][k] /= matrix_[i][i];
                   if( Double.isNaN(result[i][k]) ) throw new IllegalArgumentException( "逆行列を持ちません。" );
               }
           }
           return result;
       }
       
       /**
        * 行列のかけ算
        * @param matrix1 かけられる行列
        * @param matrix2 かける行列
        * @param 答えの行列
        */
       public static double[][] multiply(double[][] matrix1, double[][] matrix2) {
           // 答えの行列の確保
           int ROWS = matrix1.length;
           int COLS = matrix2[0].length;
           double[][] answer = new double[ROWS][COLS];
           // 計算
           for (int i = 0; i < ROWS; i++) {
               for (int j = 0; j < COLS; j++) {
                   double sum = 0;
                   for (int k = 0; k < matrix1[0].length; k++) {
                       sum += matrix1[i][k] * matrix2[k][j];
                   }
                   answer[i][j] = sum;
               }
           }
           return answer;
       }
   
       /**
        * 行列の累乗
        * @param matrix 累乗する行列
        * @param powerOf 累乗回数
        * @return 答えの行列
        */
       public static double[][] power(double[][] matrix, int powerOf) {
           // 行列の累乗のときは与えられる行列は必ず正方行列。
           if (matrix.length != matrix[0].length) {
               throw new IllegalArgumentException("正方行列ではないので累乗計算はできません。");
           }
           double[][] answer = matrix;
           for (int i = 2; i <= powerOf; i++) {
               answer = multiply(answer, matrix);
           }
           return answer;
       }
   } 
written by iys

CONTENTS

最新の20件

2020-11-14 2005-12-06 2006-11-04 2012-07-15 2009-06-19 2011-03-03 2006-12-13 2007-11-05 2014-07-22 2014-07-19 2014-07-09
  • SourcePost____
2014-01-14 2012-09-03 2012-03-28

今日の17件

人気の30件

  • counter: 7654
  • today: 1
  • yesterday: 1
  • online: 1