/** * IgoModModel クラスは、更新モードのモデルを提供します。 * @author Jiro Suzuki */ public class IgoModModel extends IgoModel{ private Kifu kifuForRecord; private int numForRecord; /** * 指定された親インスタンスに対するインスタンスを生成します。 * @param parent 親インスタンス */ IgoModModel(IgoModel parent){ this.parent=parent; } /** * インスタンスを初期化します。 * @param view ビュー */ public void initialize(IgoView view){ super.initialize(view); kifuForRecord=new Kifu(); numForRecord=-1; } /** * 棋譜情報を上書き保存します。 */ public void save(){ write(); } /** * 棋譜情報を、名前を付けて保存します。 */ public void saveAs(){ String fileName=view.showSaveDialog(); if(fileName.length()!=0){ this.fileName=fileName; write(); mode.setMode(Mode.MODE_MOD); view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } } /** * 現行モードを終了するときに呼び出します。 */ public void exit(){ switch(view.askClosedOperation()){ case NotSaveAndNotClose: break; case NotSaveAndClose: System.exit(0); break; case SaveAndClose: save(); System.exit(0); break; } } /** * メインダイアログを閉じるときに呼び出します。 */ public void close(){ switch(view.askClosedOperation()){ case NotSaveAndNotClose: break; case NotSaveAndClose: view.changeController(parent); parent.start(); break; case SaveAndClose: save(); view.changeController(parent); parent.start(); break; } } /** * 一手戻るときに呼び出します。 */ public void back(){ if(numOfMoves>0){ numOfMoves--; intBoard.initialize(); for(int i=0;i<=numOfMoves;i++){ Move move=kifu.getOrderOfMoves().getMove(i); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); } turn.setTurn(kifu.getOrderOfMoves().getMove(numOfMoves).getStoneColor()); turn.changeTurn(); }else if(numOfMoves==0){ numOfMoves--; turn.setTurn(Turn.TURN_BLACK); intBoard.initialize(); } view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } /** * 一手進むときに呼び出します。 */ public void forward(){ OrderOfMoves order=kifu.getOrderOfMoves(); if(numOfMoves<order.size()-1){ numOfMoves++; Move move=order.getMove(numOfMoves); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); turn.setTurn(move.getStoneColor()); turn.changeTurn(); view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } } /** * 五手戻るときに呼び出します。 */ public void back5(){ intBoard.initialize(); if(numOfMoves>4){ numOfMoves=numOfMoves-5; for(int i=0;i<=numOfMoves;i++){ Move move=kifu.getOrderOfMoves().getMove(i); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); } turn.setTurn(kifu.getOrderOfMoves().getMove(numOfMoves).getStoneColor()); turn.changeTurn(); }else{ numOfMoves=-1; turn.setTurn(Turn.TURN_BLACK); } view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } /** * 五手進むときに呼び出します。 */ public void forward5(){ numOfMoves=numOfMoves+5; OrderOfMoves order=kifu.getOrderOfMoves(); if(numOfMoves>order.size()-1){ numOfMoves=order.size()-1; } intBoard.initialize(); for(int i=0;i<=numOfMoves;i++){ Move move=order.getMove(i); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); } if(numOfMoves>-1){ turn.setTurn(kifu.getOrderOfMoves().getMove(numOfMoves).getStoneColor()); turn.changeTurn(); }else{ turn.setTurn(Turn.TURN_BLACK); } view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } /** * 初手に戻るときに呼び出します。 */ public void backAll(){ numOfMoves=-1; turn.setTurn(Turn.TURN_BLACK); intBoard.initialize(); view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } /** * 終局面にするときに呼び出します。 */ public void forwardAll(){ OrderOfMoves order=kifu.getOrderOfMoves(); numOfMoves=order.size()-1; intBoard.initialize(); for(int i=0;i<=numOfMoves;i++){ Move move=order.getMove(i); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); } if(numOfMoves>-1){ turn.setTurn(kifu.getOrderOfMoves().getMove(numOfMoves).getStoneColor()); turn.changeTurn(); }else{ turn.setTurn(Turn.TURN_BLACK); } view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } /** * パスをするときに呼び出します。 */ public void pass(){ turn.changeTurn(); } /** * 設計途中で変更が生じたため、棚上げ。 */ public void pause(){} //棚上げ /** * 検討モードと再生モードを行き来するときに呼び出します。 */ public void examine(){ if(isExam){ isExam=false; intBoard.initialize(); kifu=kifuForRecord; numOfMoves=numForRecord; for(int i=0;i<=numOfMoves;i++){ Move move=kifu.getOrderOfMoves().getMove(i); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); } if(numOfMoves>-1){ turn.setTurn(kifu.getOrderOfMoves().getMove(numOfMoves).getStoneColor()); turn.changeTurn(); }else{ turn.setTurn(Turn.TURN_BLACK); } view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); }else{ kifuForRecord=kifu; kifuForExam=kifu.createExamClone(numOfMoves); kifu=kifuForExam; numForRecord=numOfMoves; isExam=true; view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } } /** * 石を置くときに呼び出します。 * @param row 行番号 * @param col 列番号 */ public void putStone(int row,int col){ OrderOfMoves order=kifu.getOrderOfMoves(); if((intBoard.getIntBoard())[row][col]==0){ for(int i=order.size()-1;i>numOfMoves;i--){ order.remove(i); } kifu.addMove(new Move(turn.getTurn(),row,col)); numOfMoves++; turn.changeTurn(); Move move=kifu.getOrderOfMoves().getMove(numOfMoves); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } } /** * 対局情報を更新するときに呼び出します。 */ public void updateGameInfo(GameInformation gameInfo){ kifu.getGameInformation().setBlackPlayer(gameInfo.getBlackPlayer()); kifu.getGameInformation().setWhitePlayer(gameInfo.getWhitePlayer()); kifu.getGameInformation().setBlackRank(gameInfo.getBlackRank()); kifu.getGameInformation().setWhiteRank(gameInfo.getWhiteRank()); kifu.getGameInformation().setEvent(gameInfo.getEvent()); kifu.getGameInformation().setGameName(gameInfo.getGameName()); kifu.getGameInformation().setDate(gameInfo.getDate()); kifu.getGameInformation().setKomi(gameInfo.getKomi()); kifu.getGameInformation().setResult(gameInfo.getResult()); view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } /** * 更新モードを開始するときに呼び出します。 * @param kifu 棋譜情報 * @param numOfMoves 手数 * @param fileName ファイル名(フルパス指定) * @param turn 手番 */ public void start(Kifu kifu,int numOfMoves,String fileName,Turn turn){ mode.setMode(Mode.MODE_MOD); this.kifu=kifu; this.fileName=fileName; this.numOfMoves=numOfMoves; this.turn=turn; OrderOfMoves order=kifu.getOrderOfMoves(); intBoard.initialize(); for(int i=0;i<=numOfMoves;i++){ Move move=order.getMove(i); intBoard.update(move.getStoneColor(),move.getRow(),move.getCol()); } view.updateView(mode,isExam,this.intBoard,kifu.getGameInformation(),numOfMoves); } /** * 対局情報を表示ときに呼び出します。 */ public void displayGameInfo(){ view.showGameInfoDialog(kifu.getGameInformation()); } /** * ※メソッドが使用されているのか確認中。 */ public void requireUpdateView(){ view.updateView(mode,isExam,intBoard,kifu.getGameInformation(),numOfMoves); } //------------------------------------------------------------------------ private void write(){ SgfWriter writer=new SgfWriter(); writer.write(fileName,kifu); } }