java SammokuSample または java SammokuGUISample
java -jar SammokuMain.jarちなみに,SammokuMain は内部で SammokuSample および SammokuGUISample の main メソッドを呼んで実行してます.
この課題の点数は通常の実習課題の点数とは別のボーナス点として扱います (おまけ課題と同様).
提出期限: 0723木 23:59
(^o^)/ まずはキー入力の処理だけのプログラムを作ってみよう
次のような動作をするプログラムを作ろう.★から右側は解説.
0 1 2 0| | | | 1| | | | ★ 盤面を数字と縦棒で表示 2| | | | 横縦の順に値を入力してね(例: 2 1): 2 1 ★ 右側の 2 1 がキーボードからの入力 (2,1) ★ 入力された値を表示 0 1 2 0| | | | 1| | | | ★ ver.0 では o や x の表示はなく,常に空の盤面を表示するだけ 2| | | | 横縦の順に値を入力してね(例: 2 1): 1 1 (1,1) 0 1 2 0| | | | 1| | | | 2| | | | 横縦の順に値を入力してね(例: 2 1): -1 2 ★ 盤面内の数字かどうかはチェックしたりしてない (-1,2) 0 1 2 0| | | | 1| | | | 2| | | | 横縦の順に値を入力してね(例: 2 1): 99 100 (99,100) 0 1 2 0| | | | 1| | | | 2| | | | 横縦の順に値を入力してね(例: 2 1): 0 hoge ★ 整数として解釈できない入力があると,再入力を促す 横縦の順に値を入力してね(例: 2 1):
/(*_*) 次のことを守ってプログラムを考えよう
import java.util.*; // for Scanner class public class Hoge{ public static void main(String[] args){ // キー入力を扱う Scanner クラス Scanner sc = new Scanner(System.in); // 空白を区切りとして2つの整数を入力するとその和を出力 // 動作確認のためわざと変な入力をしてみるとよい while(true){ int x, y; boolean done = false; do{ System.out.print("x y : "); try{ x = Integer.parseInt(sc.next()); y = Integer.parseInt(sc.next()); sc.nextLine(); // この行の残りを読みとばす done = true; }catch(NumberFormatException e){ x = y = 0; sc.nextLine(); // この行の残りを読みとばす done = false; } }while(!done); System.out.println("x + y = " + (x + y)); } } }
(^o^)/ キー入力で指定された位置に o や x が表示されるようにしよう
次のような動作をするプログラムを作ろう. 以下の動作例からわかるように,このver.1では,SammokuSample に近いふるまいをするけれど, 「キー入力で指定された位置が盤面内かどうか」,「そこに既にo/xがついているかどうか」,のチェックはしないものでよい(それらの処理はver.2で考えよう).盤面外を指定するとプログラムが例外を発生させて異常終了したり,oやxを上書きできてしまうが,それで構わない.
0 1 2 0| | | | 1| | | | 2| | | | 横縦の順に値を入力してね(例: 2 1): 0 0 (0,0) に置いたで 0 1 2 0|o| | | 1| | | | 2| | | | 横縦の順に値を入力してね(例: 2 1): 0 0 (0,0) に置いたで 0 1 2 0|x| | | 1| | | | 2| | | | 横縦の順に値を入力してね(例: 2 1): 0 hoge 横縦の順に値を入力してね(例: 2 1): 0 100 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
/(*_*) 次のことを守ってプログラムを考えよう
以下の「クラスの設計を考えよう」をよく読んで,その指示に従ってください.よくできる人は全部一から考えたくなるでしょうが,与えられた仕様を満たすように作るのも大事ですから,まずは指示に従って課題をこなして,後で好きな設計を考えてみたらよいと思います.
/(?_?) Sammokuクラスのオブジェクトは,データとして何を持てばよい?
つまり,インスタンス変数やクラス変数としてどんなものを用意してどんな情報を格納するのがよい? → 例えば盤面はどう扱う? ○や×などの文字列で扱うのはややこしいからやめた方がよい → 適当に整数値を割り当てるのがよいだろう. といっても,マスの数ぶんの変数を一つ一つばらばらに用意するのはいやんですよねぇ → ということは…
/(*_*) 次のことを守ってプログラムを考えよう
/(?_?) Sammokuクラスのオブジェクトにはどんな機能があればよい?
一つのメソッドがいろんな仕事をするように作ると使い勝手が悪いし保守もしにくい. 一つのメソッドはなるべく単純な仕事しかしないように作って組み合わせるのがよい. → そういうわけで,次のような5つの機能に分ける構成としてみよう(より細分化したい人はご自由にどうぞ)
(^o^)/ 盤面外や既に○×が置いてある場所を指定すると SammokuSample と同様の動作をするように Sammoku を修正しよう.
そのためには,指定した位置に○×を置ける/置けないを判定する機能を追加して,それを使うのがよいでしょう. というわけで,次の仕様のメソッドを定義してそれを使うようにすること
この課題の点数は通常の実習課題の点数とは別のボーナス点として扱います (おまけ課題と同様).
提出期限: 0723木 23:59
SammokuGUISample と同様のふるまいをするプログラム(SammokuGUI)を作ろう.
エラー: ラムダ式から参照されるローカル変数は、finalまたは事実上のfinalである必要があります if(s.isPlaceable(ix, iy)){ ^この問題に対処するには,二重 for ループの内側で setOnAction 呼ぶ前に,
final int fx = ix, fy = jy;と書いておく → setOnAction の引数では ix, iy のかわりに fx, fy を使う,というのがよいでしょう.どうしてこういうエラーが出るのかの説明は省略します.興味のある人は takataka に尋ねてね.
Scene scene = new Scene(root); scene.getStylesheets().add("sammokuGUI.css");
★★★ 次は Step4(おまけ課題)