這個小的project是前一個階段,待業(yè)在家的時候,迷戀sudoku的時候,自己寫來玩的。
正好當(dāng)時在看Uncle Bob的《Agile Software Development: Principles, Patterns, and Practices》 (敏捷軟件開發(fā):原則、模式與實踐),所以就按照自己對書中的一些概念和方法的理解,結(jié)合自己之前的開發(fā)經(jīng)驗寫出來一段小的代碼。
代碼行數(shù): < 900
類的個數(shù): 18
抽象類的個數(shù):2
工廠類的個數(shù):1
包的個數(shù):5
一些關(guān)于類和包作用的說明:
1.Cell:表示一個Cell,是一個游戲中的一個單元格。
? Cell主要由3個部分組成,Point,Value,Status.
2.Point:表示一個坐標(biāo),主要格式為:(2,3).
? !!!注意:由于個人比較懶,所以開始的錯誤被貫徹了下來。
? 這個錯誤就是(2,3)表示的是由最左上的位置為坐標(biāo)原點,第二行和第三列所確定的那個單元格。也就是縱坐標(biāo)在前,橫坐標(biāo)在后了。
3.Value:表示一個值
4.Status:表示Cell的狀態(tài),只有兩個狀態(tài),一個是NotSure,另一個是Sure.
5.AbstractCells:表示一些cell的集合,主要有三個子類
???? BlockCells:表示一個由多個Cell組成的塊,例如一個2*2由4個Cell組成的塊,或者一個2*3由6個Cell組成的塊
???? HorizonCells:表示一個橫行,即:從(0,0)到(0,n)坐標(biāo)確定的所有Cell的集合。
???? VerticalCells:表示一個縱行,即:從(0,0)到(n,0)坐標(biāo)確定的所有Cell的集合。
6.AbstractPolicy:就是游戲的策略。
?? 這個主要表示的是:4*4的游戲,還是9*9的游戲。
?? 可以在以后對此類進(jìn)行繼承和擴(kuò)展,例如16*16的游戲我就沒有實現(xiàn)。
?? 主要擴(kuò)展3個方法:
????????????????? 1)getValueRange,返回當(dāng)前policy的value的個數(shù)。4*4的游戲的getValueRange返回的就應(yīng)該是4。
??? ??? ? 2)getStep:表示當(dāng)前policy中相鄰的兩個BlockCells的坐標(biāo)差。
??? ??? ? 3)getIncrease:說不明白了:)(只可意會不可言傳。)
7.Game:進(jìn)行Policy的場所(我一直想拋棄這個類)
8.TestGame:游戲運行的地方,包括從PolicyFactory取得指定的Policy,設(shè)置輸入輸出文件的路徑。
9.PolicyFactory:取得Policy的工廠。
??? getPolicy(int x) :這個方法獲得的是正方形的sudoku的策略。例如:4*4的,9*9,16*16。
??? getPolicy(int x, int y):這個方法獲得的是長方形的Sudoku的策略。例如:9*12的。
雖然是盡量避免bad code smell,但是由于能力有限,還是出現(xiàn)了一些不好的地方。
例如:之間的關(guān)聯(lián)關(guān)系還是很多,而且很強(qiáng);抽象的方法和抽象類的個數(shù)偏少等等。
里面實現(xiàn)了三個解決sudoku的方法:
1.在一個Cell中出現(xiàn)的Value,不會在和這個Cell處在同一個AbstractCells中的所有Cell中出現(xiàn);
2.如果一個Cell中,所有可能出現(xiàn)的Value的個數(shù)為1,那么Cell的Value必然是這個最后的Value;
2.如果一個Value,如果在當(dāng)前AbstractCells的所有其他的Cell中都不可能出現(xiàn),那么它必然是最后一個Cell的Value。
附件1:src code
http://www.aygfsteel.com/Files/GandofYan/sudoku.rar
附件2:輸入輸出文件的example
http://www.aygfsteel.com/Files/GandofYan/temp.rar