このページのコンテンツ一覧(5個位までにしてください。上が最新で下が最古です)
昔作った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() { // 人まかせ } }
//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; } } } }
// 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 ) {} } } }
// 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]; } }
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; } }