- ベストアンサー
Javaの応用問題で
以下のプログラムがさっぱりわかりません。 全ての値が0の2次元配列を,以下のルールに基づいて全て1にするゲームTurnAllPanels.javaを作成する。ルール:ある座標を指定すると,指定した座標とその上下左右の座標について,その値が0ならば1,1ならば0に交換する。プログラムは以下の仕様を満たす。 1,int型2次元配列のフィールドboard を持つ。これがこのゲームの盤となる。 2,盤の行と列の大きさを保持するint型のフィールド、rowMaxとcolumnMaxを持つ。 3,board の内容を、次のスライドで示す形式で表示できるメソッドshowBoard() を持つ。 4,指定された座標位置の配列の値が0ならば1,1ならば0に交換するメソッドturnOverを持つ。 5,指定された座標位置の配列の値とその上下左右の値を、turnOverを用いてひっくり返すメソッドturnPlaceSettingを持つ。ただし指定された座標位置がboard の端の場合は、その上下左右の内のどれかが無いので、場合分けが必要。 6,終了条件(全ての値が1かどうか)をチェックするメソッドcheckBoard() を持つ。 7,mainメソッドでは、board の配列の縦横の大きさを入力させ,それぞれcolumnMax,rowMaxとして、これらを用いてこのクラスのオブジェクトpanel を生成する。 8,次に交換したい座標の指定を行わせ,それをcolumn, rowとする。座標がcolumnMax, rowMaxよりも大きい場合や0以下の場合には警告を出力させる。 9,panel にshowBoardやturnPlaceSettingを実行させることで、次のスライドに示すような表示を得る。 10,3×3の場合,ゲーム終了までの最速の手順は5手,「左上」「右上」「中央」「左下」「右下」を一度ずつ指定するものである。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
仕様が明確でないので、ある程度勝手に解釈してコーディングしています。 エラー報告は例外PanelExceptionで行っています。 また、プロンプト表示などは適当です。 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; class Panel { private int rowMax; private int columnMax; private int[][] board; public Panel(int rowMax , int columnMax) { this.rowMax = rowMax; this.columnMax = columnMax; this.board = new int[rowMax][columnMax]; for(int i=0 ; i<rowMax ; i++) { for(int j=0 ; j<columnMax ; j++) { this.board[i][j] = 0; } } } public void showBoard() { for(int i=0 ; i<this.rowMax ; i++) { for(int j=0 ; j<this.columnMax ; j++) { System.out.print(this.board[i][j] + " "); } System.out.println(); } } private void turnOver(int row , int column) throws PanelException { if(row<0 || row>=this.rowMax) { throw new PanelException("out of range : row = " + row); } if(column<0 || column>=this.columnMax) { throw new PanelException("out of range : column = " + column); } if(this.board[row][column] == 0) { this.board[row][column] = 1; } else if(this.board[row][column] == 1) { this.board[row][column] = 0; } else { throw new PanelException("value is not 0 or 1"); } } public void turnPlaceSetting(int row , int column) throws PanelException { this.turnOver(row , column); if(row-1 >= 0) this.turnOver(row-1 , column); if(row+1 < this.rowMax) this.turnOver(row+1 , column); if(column-1 >= 0) this.turnOver(row , column-1); if(column+1 < this.columnMax) this.turnOver(row , column+1); } public boolean checkBoard() { for(int i=0 ; i<this.rowMax ; i++) { for(int j=0 ; j<this.columnMax ; j++) { if(this.board[i][j] == 0) { return false; } } } return true; } } class PanelException extends Exception { PanelException(String str) { super(str); } } class TurnPanels { public static void main(String args[]) { int row = 3; int column = 3; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { System.out.print("row of board > "); String rowstr = br.readLine(); System.out.print("column of board > "); String clmstr = br.readLine(); row = Integer.parseInt(rowstr); column = Integer.parseInt(clmstr); } catch(IOException e) { e.printStackTrace(); } Panel p = new Panel(row , column); while(true) { p.showBoard(); try { System.out.print("input row > "); String rowpos = br.readLine(); System.out.print("input column > "); String clmpos = br.readLine(); row = Integer.parseInt(rowpos); column = Integer.parseInt(clmpos); p.turnPlaceSetting(row , column); } catch(IOException e) { e.printStackTrace(); } catch(PanelException e) { e.printStackTrace(); } boolean end = p.checkBoard(); if(end) break; } p.showBoard(); } }
その他の回答 (1)
3.の「次のスライドで示す形式」って何ですか?
補足
返事が遅くなってすいません。プログラムを実行するとこうなります。あと次のスライドも以下のようになります。 盤面の横の大きさを指定してください:3 盤面の縦の大きさを指定してください:3 000 000 000 横座標を指定してください(左端が1):1 縦座標を指定してください(上端が1):1 (1,1)をひっくりかえします 110 100 000 横座標を指定してください(左端が1):3 ... (中略) ... 111 111 111 全て1になりました.ゲームを終了します というプログラムになります。 どうぞよろしくお願いします。
お礼
本当にありがとうございます!!助かりました。