【推荐】极简数独1.0源码
???? 前一段時(shí)間迷上數(shù)獨(dú),于是自己做了一個(gè),仿MetroUI,看著蠻簡(jiǎn)單。如下:
???
???? 支持自定義背景,快捷鍵等!
???? 由于自知算法不是很好,所以在做這個(gè)的時(shí)候,使用了一些小技術(shù)!
????
???? 大概說一下,具體的結(jié)構(gòu)!
???????????????????
???? 有四個(gè)小項(xiàng)目,從上到下,分別是:
???? Sudoku.CodeMonk(我自己實(shí)現(xiàn)的一個(gè)數(shù)獨(dú))
???? Sudoku.Common(數(shù)獨(dú)接口和其他的公用類)
???? Sudoku.Test(測(cè)試項(xiàng)目)
???? Sudoku.WinForm(WinForm版的數(shù)獨(dú))
???? 當(dāng)然最關(guān)鍵的肯定是那個(gè)ISudoku接口,它定義了一系列的數(shù)獨(dú)操作,比如生成數(shù)獨(dú),打開和保存數(shù)獨(dú),撤銷重復(fù)等!具體如下:
View Code using System;using System.Collections.Generic;
namespace Sudoku.Common
{
public delegate void FinishHandler();
/// <summary>
/// 數(shù)獨(dú)接口
/// </summary>
public interface ISudoku:IDisposable
{
event FinishHandler OnInitializeFinish;
event FinishHandler OnLoadFinish;
/// <summary>
/// 設(shè)置點(diǎn)
/// </summary>
/// <param name="x">x坐標(biāo)</param>
/// <param name="y">y坐標(biāo)</param>
/// <returns>點(diǎn)</returns>
byte this[byte x, byte y] { get; set; }
/// <summary>
/// 載入數(shù)獨(dú)
/// </summary>
/// <param name="path">路徑</param>
void Load(string path);
/// <summary>
/// 保存數(shù)獨(dú)
/// </summary>
/// <param name="path">路徑</param>
void Save(string path);
/// <summary>
/// 撤銷
/// </summary>
void Undo();
/// <summary>
/// 重復(fù)
/// </summary>
void Redo();
/// <summary>
/// 重置
/// </summary>
void Reset();
/// <summary>
/// 初始化數(shù)獨(dú)
/// </summary>
void Initialize();
/// <summary>
/// 獲取數(shù)獨(dú)數(shù)據(jù)
/// </summary>
/// <returns></returns>
byte[,] Current { get; }
/// <summary>
/// 原數(shù)組
/// </summary>
byte[,] Original { get; }
/// <summary>
/// 等級(jí)
/// </summary>
byte Level { get; set; }
/// <summary>
/// 是否完成
/// </summary>
bool IsFinish { get; }
/// <summary>
/// 設(shè)置或獲取數(shù)獨(dú)的解決方法
/// </summary>
ISudokuSolution Solution { get; set; }
/// <summary>
/// 使用內(nèi)置的解決方法解決當(dāng)前數(shù)獨(dú)
/// </summary>
void Solve();
/// <summary>
/// 檢測(cè)該位置的點(diǎn)是否能放置
/// </summary>
/// <param name="row">行坐標(biāo)</param>
/// <param name="col">列坐標(biāo)</param>
/// <param name="value">值</param>
/// <returns>如果能放置則返回true</returns>
bool CanSet(byte row, byte col, byte value);
/// <summary>
/// 獲取該位置放置的值集合
/// </summary>
/// <param name="row">行坐標(biāo)</param>
/// <param name="col">列坐標(biāo)</param>
/// <returns>放置值的集合</returns>
List<byte> CanSetValues(byte row, byte col);
}
}
??? 里面的ISudokuSolution定義了一些解數(shù)獨(dú)的方法:
View Code using System.Collections.Generic;namespace Sudoku.Common
{
/// <summary>
/// 數(shù)獨(dú)解決方法實(shí)例
/// </summary>
public interface ISudokuSolution
{
/// <summary>
/// 設(shè)置或獲取要解決的數(shù)獨(dú)
/// </summary>
ISudoku Sudoku { get; set; }
/// <summary>
/// 解決數(shù)獨(dú)
/// </summary>
/// <returns>解決完成的數(shù)獨(dú)</returns>
ISudoku Solve();
/// <summary>
/// 檢測(cè)該位置的點(diǎn)是否能放置
/// </summary>
/// <param name="row">行坐標(biāo)</param>
/// <param name="col">列坐標(biāo)</param>
/// <param name="value">值</param>
/// <returns>如果能放置則返回true</returns>
bool CanSet(byte row, byte col,byte value);
/// <summary>
/// 獲取該位置放置的值集合
/// </summary>
/// <param name="row">行坐標(biāo)</param>
/// <param name="col">列坐標(biāo)</param>
/// <returns>放置值的集合</returns>
List<byte> CanSetValues(byte row, byte col);
}
}
??? 為了簡(jiǎn)單起見,還有一些公用的函數(shù)或利用配置文件生成數(shù)獨(dú)或數(shù)獨(dú)解決方案的實(shí)例!
??? Sudoku.CodeMonk代碼的實(shí)現(xiàn)邏輯比較清晰,用的挖洞法來生成數(shù)獨(dú)的!沒有寫什么具體的數(shù)獨(dú)解決方法。撤銷和重復(fù)使用Stack做的,沒有什么Command模式,覺得比較麻煩。保存和讀取是拿xml序列化和反序列化做的。其他的都是窮舉等笨方法!
??? 比較復(fù)雜的一部分就只能算是WinForm項(xiàng)目里的GDI+操作,自定義控件等。
??? 為了讓窗體看起來更Metro一些,我找了些微軟官方的WP開發(fā)圖標(biāo)。并自定義了一個(gè)PicButton,有點(diǎn)小動(dòng)畫的效果(小動(dòng)畫哈)。
??? 復(fù)雜一點(diǎn)就是自定義的SudokuLabel,具體的話看代碼吧!
? ? Release包下載:sudoku-release.zip
??? 源碼下載:http://files.cnblogs.com/wushilonng/Sudoku.zip
??? Codeplex地址:http://longsudoku.codeplex.com/
?
??? 其他:
??? (1)自定義背景,刪除掉目錄下的background.jpg就會(huì)回到默認(rèn)背景,放一個(gè)background.jpg到目錄下就是背景了!
????(2)Ctrl+Z撤銷,Ctrl+Y重復(fù),Ctrl+O打開,Ctrl+S保存,Ctrl+N新建,Ctrl+H輔助解答,Ctrl+R重置!
??? (3)右側(cè)的幾個(gè)數(shù)是用來說明當(dāng)前格子里可以的填寫的哪些數(shù)。
????(4)所謂的小動(dòng)畫就是圖標(biāo)稍稍轉(zhuǎn)一下!
????(5)默認(rèn)難度是1級(jí)(比較弱智),還沒做難度調(diào)節(jié),需要改代碼(囧)。
轉(zhuǎn)載于:https://www.cnblogs.com/wushilonng/archive/2012/03/14/2395743.html
總結(jié)
以上是生活随笔為你收集整理的【推荐】极简数独1.0源码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脚印:关于错误编码的管理的一些思考
- 下一篇: Java版A星算法