隨筆-14  評(píng)論-25  文章-1  trackbacks-0
          這個(gè)小的project是前一個(gè)階段,待業(yè)在家的時(shí)候,迷戀sudoku的時(shí)候,自己寫來玩的。
          正好當(dāng)時(shí)在看Uncle Bob的《Agile Software Development: Principles, Patterns, and Practices》 (敏捷軟件開發(fā):原則、模式與實(shí)踐),所以就按照自己對(duì)書中的一些概念和方法的理解,結(jié)合自己之前的開發(fā)經(jīng)驗(yàn)寫出來一段小的代碼。

          代碼行數(shù): < 900
          類的個(gè)數(shù): 18
          抽象類的個(gè)數(shù):2
          工廠類的個(gè)數(shù):1
          包的個(gè)數(shù):5

          一些關(guān)于類和包作用的說明:
          1.Cell:表示一個(gè)Cell,是一個(gè)游戲中的一個(gè)單元格。
          ? Cell主要由3個(gè)部分組成,Point,Value,Status.
          2.Point:表示一個(gè)坐標(biāo),主要格式為:(2,3).
          ? !!!注意:由于個(gè)人比較懶,所以開始的錯(cuò)誤被貫徹了下來。
          ? 這個(gè)錯(cuò)誤就是(2,3)表示的是由最左上的位置為坐標(biāo)原點(diǎn),第二行和第三列所確定的那個(gè)單元格。也就是縱坐標(biāo)在前,橫坐標(biāo)在后了。
          3.Value:表示一個(gè)值
          4.Status:表示Cell的狀態(tài),只有兩個(gè)狀態(tài),一個(gè)是NotSure,另一個(gè)是Sure.

          5.AbstractCells:表示一些cell的集合,主要有三個(gè)子類
          ???? BlockCells:表示一個(gè)由多個(gè)Cell組成的塊,例如一個(gè)2*2由4個(gè)Cell組成的塊,或者一個(gè)2*3由6個(gè)Cell組成的塊
          ???? HorizonCells:表示一個(gè)橫行,即:從(0,0)到(0,n)坐標(biāo)確定的所有Cell的集合。
          ???? VerticalCells:表示一個(gè)縱行,即:從(0,0)到(n,0)坐標(biāo)確定的所有Cell的集合。
          6.AbstractPolicy:就是游戲的策略。
          ?? 這個(gè)主要表示的是:4*4的游戲,還是9*9的游戲。
          ?? 可以在以后對(duì)此類進(jìn)行繼承和擴(kuò)展,例如16*16的游戲我就沒有實(shí)現(xiàn)。
          ?? 主要擴(kuò)展3個(gè)方法:
          ????????????????? 1)getValueRange,返回當(dāng)前policy的value的個(gè)數(shù)。4*4的游戲的getValueRange返回的就應(yīng)該是4。
          ??? ??? ? 2)getStep:表示當(dāng)前policy中相鄰的兩個(gè)BlockCells的坐標(biāo)差。
          ??? ??? ? 3)getIncrease:說不明白了:)(只可意會(huì)不可言傳。)
          7.Game:進(jìn)行Policy的場(chǎng)所(我一直想拋棄這個(gè)類)
          8.TestGame:游戲運(yùn)行的地方,包括從PolicyFactory取得指定的Policy,設(shè)置輸入輸出文件的路徑。
          9.PolicyFactory:取得Policy的工廠。
          ??? getPolicy(int x) :這個(gè)方法獲得的是正方形的sudoku的策略。例如:4*4的,9*9,16*16。
          ??? getPolicy(int x, int y):這個(gè)方法獲得的是長(zhǎng)方形的Sudoku的策略。例如:9*12的。


          雖然是盡量避免bad code smell,但是由于能力有限,還是出現(xiàn)了一些不好的地方。
          例如:之間的關(guān)聯(lián)關(guān)系還是很多,而且很強(qiáng);抽象的方法和抽象類的個(gè)數(shù)偏少等等。

          里面實(shí)現(xiàn)了三個(gè)解決sudoku的方法:
          1.在一個(gè)Cell中出現(xiàn)的Value,不會(huì)在和這個(gè)Cell處在同一個(gè)AbstractCells中的所有Cell中出現(xiàn);
          2.如果一個(gè)Cell中,所有可能出現(xiàn)的Value的個(gè)數(shù)為1,那么Cell的Value必然是這個(gè)最后的Value;
          2.如果一個(gè)Value,如果在當(dāng)前AbstractCells的所有其他的Cell中都不可能出現(xiàn),那么它必然是最后一個(gè)Cell的Value。

          附件1:src code
          http://www.aygfsteel.com/Files/GandofYan/sudoku.rar
          附件2:輸入輸出文件的example
          http://www.aygfsteel.com/Files/GandofYan/temp.rar

          posted on 2006-07-13 16:19 混沌中立 閱讀(2169) 評(píng)論(4)  編輯  收藏 所屬分類: about java & j2ee

          評(píng)論:
          # re: 一個(gè)Sudoku的java求解算法 2007-08-12 17:11 | dreamstone
          寫的不錯(cuò)啊  回復(fù)  更多評(píng)論
            
          # re: 一個(gè)Sudoku的java求解算法 2007-08-13 10:38 | GandofYan
          @dreamstone


          謝謝夸獎(jiǎng)

          去年在迷sudoku的時(shí)候?qū)懙?br>
            回復(fù)  更多評(píng)論
            
          # re: 一個(gè)Sudoku的java求解算法 2008-07-15 18:17 | 和尚
          想學(xué)習(xí)下,但似乎您的連接下載不了的說  回復(fù)  更多評(píng)論
            
          # re: 一個(gè)Sudoku的java求解算法 2008-07-15 18:19 | 和尚
          不好意思,ok了,
          感謝!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 双桥区| 玉溪市| 扎囊县| 建阳市| 玉环县| 伊吾县| 永善县| 正蓝旗| 宜州市| 怀宁县| 陆河县| 库车县| 启东市| 嘉鱼县| 大姚县| 长宁县| 库尔勒市| 台州市| 望奎县| 泰来县| 化隆| 呼图壁县| 南投市| 田东县| 彭泽县| 育儿| 尼玛县| 内乡县| 九台市| 宣威市| 武城县| 临漳县| 林芝县| 温州市| 蒲城县| 安达市| 成武县| 普格县| 东丽区| 巴林右旗| 揭西县|