1. Undo 와 Redo
움직임의 undo는 Moves stack에서 pop, 그리고 이를 RedoMoves stack에 push, 반대로 redo는 RedoMoves stack에서 pop, 이것을 Moves stack에 push 한다. 디자인 뷰에서 Edit -> Undo를 선택하고 더블클릭하여 이벤트 핸들러 코드를 생성하고 다음과 같이 수정한다.
//
// undo a move
//
private void undoToolStripMenuItem_Click( object sender, EventArgs e )
{
// if no previous moves, then exit
if ( Moves.Count == 0 )
return;
// remove from the Moves stack and push into the RedoMoves stack
String str = Moves.Pop();
RedoMoves.Push( str );
// save the value in the array
SetCell( int.Parse( str.Substring( 0, 1 ) ), int.Parse( str.Substring( 1, 1 ) ), 0, 1 );
DisplayActivity( "Value " + str[2] + " removed at (" + str[0] + ", " + str[1] + ")", false );
}
마찬가지로 Redo 메뉴의 이벤트 핸들러 코드를 생성하고 아래와 같이 수정한다.
//
// redo the move
//
private void redoToolStripMenuItem_Click( object sender, EventArgs e )
{
// if RedoMove stack is empty, the exit
if ( RedoMoves.Count == 0 )
return;
// remove from the RedoMoves stack and push into the Moves stack
String str = RedoMoves.Pop();
Moves.Push( str );
// save the value in the array
SetCell( int.Parse( str.Substring( 0, 1 ) ), int.Parse( str.Substring( 1, 1 ) ), int.Parse( str.Substring( 2, 1 ) ), 1 );
DisplayActivity( "Value " + str[2] + " reinserted at (" + str[0] + ", " + str[1] + ")", false );
}
2. 게임의 저장
퍼즐은 숫자로 이루어진 String으로 텍스트화일에 저장된다. SaveGameToDisk()를 다음과 같이 수정한다.
//
// Save the game to disk
//
public void SaveGameToDisk( Boolean saveAs )
{
// if saveFileName is empty, means game has not been saved before
if ( ( saveFileName == String.Empty ) || saveAs )
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "SDO files (*.sdo)|*.sdo|All files (*.*)|*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.RestoreDirectory = false;
if ( saveFileDialog1.ShowDialog() == DialogResult.OK )
{
// store the filename first
saveFileName = saveFileDialog1.FileName;
}
else
{
return;
}
}
// formulate the string representing the values to store
StringBuilder str = new StringBuilder();
for ( int row = 1; row < 10; row++ )
for ( int col = 1; col < 10; col++ )
str.Append( actual[col, row].ToString() );
// save the values to file
Computer myComputer = new Computer();
try
{
Boolean fileExists;
fileExists = myComputer.FileSystem.FileExists( saveFileName );
if ( fileExists )
myComputer.FileSystem.DeleteFile( saveFileName );
myComputer.FileSystem.WriteAllText( saveFileName, str.ToString(), true );
toolStripStatusLabel1.Text = "Puzzle saved in " + saveFileName;
}
catch ( Exception )
{
MessageBox.Show( "Error saving game. Please try again." );
throw;
}
}
코드를 추가하면 Computer 클래스를 알지 못한다고 에러를 띄운다.
솔루션 익스플로러에서 Reference를 마우스 오른쪽 클릭하고 Add Reference 선택하여 .NET 탭에서 Microsoft.VisualBasic를 선택한다.
그리고 코드 맨 위에 아래 코드를 추가한다.
using Microsoft.VisualBasic.Devices;
File->Save As... 메뉴의 이벤트 핸들러를 생성하고 아래와 같이 수정한다.
//
// Save As... menu item
//
private void saveAsToolStripMenuItem_Click( object sender, EventArgs e )
{
if ( !GameStarted )
{
DisplayActivity( "Game not started yet.", true );
return;
}
SaveGameToDisk( true );
}
File->Save 메뉴의 이벤트 핸들러를 생성하고 아래와 같이 수정한다.
//
// Save menu item
//
private void saveToolStripMenuItem_Click( object sender, EventArgs e )
{
if ( !GameStarted )
{
DisplayActivity( "Game not started yet.", true );
return;
}
SaveGameToDisk( false );
}
3. 저장된 게임 열기
File->Open 메뉴의 이벤트 핸들러는 다음과 같다.
//
// Open a saved game
//
private void openToolStripMenuItem_Click( object sender, EventArgs e )
{
if ( GameStarted )
{
var response = MessageBox.Show( "Do you want to save current game?",
"Save current game",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question );
if ( response == DialogResult.Yes )
SaveGameToDisk( false );
else if ( response == DialogResult.Cancel )
return;
}
// load the game from disk
String fileContents;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
Computer myComputer = new Computer();
openFileDialog1.Filter = "SDO files (*.sdo)|*.sdo|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = false;
if ( openFileDialog1.ShowDialog() == DialogResult.OK )
{
fileContents = myComputer.FileSystem.ReadAllText( openFileDialog1.FileName );
toolStripStatusLabel1.Text = openFileDialog1.FileName;
saveFileName = openFileDialog1.FileName;
}
else
{
return;
}
StartNewGame();
// initialize the board
int counter = 0;
int value;
for ( int row = 1; row < 10; row++ )
{
for ( int col = 1; col < 10; col++ )
{
try
{
value = int.Parse( fileContents[counter].ToString() );
if ( value != 0 )
SetCell( col, row, value, 0 );
}
catch ( Exception )
{
MessageBox.Show( "File does not contain a valid Sudoku puzzle" );
throw;
}
counter++;
}
}
}
4. 게임 종료
File -> Exit 메뉴의 이벤트 핸들러는 다음과 같다.
//
// Exit the application
//
private void exitToolStripMenuItem_Click( object sender, EventArgs e )
{
if ( GameStarted )
{
DialogResult reponse = MessageBox.Show( "Do you want to save current game?",
"Save current game",
MessageBoxButtons.YesNoCancel );
if ( reponse == DialogResult.Yes )
SaveGameToDisk( false );
else if ( reponse == DialogResult.Cancel )
return;
}
this.Close();
Application.Exit();
}
'Programming > Programming Sudoku' 카테고리의 다른 글
| Chapter 4. Intermediate Techniques (0) | 2012.10.12 |
|---|---|
| Chapter 3. Basic Sudoku Solving Technique (0) | 2012.10.08 |
| Chapter 2. Creating the Sudoku Application (3) (0) | 2012.09.27 |
| Chapter 2. Creating the Sudoku Application (2) (0) | 2012.09.27 |
| Chapter 2. Creating the Sudoku Application (1) (0) | 2012.09.27 |
