☆gnome-sudokuの不具合修正

去年の11月にtwitterでつぶやいていたgnome-sudokuの不具合について、修正パッチを公開してみます。対象はubuntu jauntyに入っているバージョン2.26.1です。(karmicの場合は下の方に補足を書いています。)
すべてのソースを理解しているわけではありませんし、すべての機能をテストしているわけではありませんが、1ヶ月以上プレイしていておかしな点は出てません。(トラッカなどは使い方がわからないので.....)

gnome本家に報告したり、ppaを作ったりするのがより正しいユーザの在り方なのかもしれませんが、なにぶんわからないことが多いので......。
パッチが危険な動作をするようなことはありませんが、適用に当たってはすべて自己責任でおこなってください。

●不具合の概要

同一の行または列に番号のコンフリクトがある場合、その後から入力した方と同じボックス(3X3の領域)の別セルに同じ数値を入力しても赤くならない。
具体例は下図。反転しているセル(中心のひとつ上)は同一ボックスに同じ数字"1"があるのに赤くなっていない。

●修正方法

patchファイルを
https://sites.google.com/site/midspeclowload/files/sudoku.py.2_26_1.patch.txt?attredirects=0&d=1
に置きました。

対象のsudoku.pyは下記にあります。pythonのスクリプト(テキストファイル)です。
/usr/share/python-support/gnome-games-data/gnome_sudoku/sudoku.py

パッチを当ててから

sudo update-python-modules gnome-games-data
としてやれば使えるようになります。

既にgnome-sudokuを起動したことがあるとエラーが出るかもしれません。
その場合はホームディレクトリにあるsudoku関連のファイルを消してやると
起動するはずです。

find ~/ -name '*sudoku*'
で出てきたディレクトリをガリッと消して問題ないはずです。(必要なディレクトリは次に起動したときにまた作られます。)自分で作ったディレクトリやファイルを削除しないように気をつけてください。

●karmicについて

karmicに入っているgnome-sudokuは2.28です。2.26と同様の不具合があります。
加えてなぜか終了時に表示される経過時間がおかしかったりします。
さらに解けているはずなのに終了のダイアログが出なかったりします。
(2.26と同じ要領で修正する経過時間の件以外は直ります。)

経過時間のほうは直せそうにないので私は手作業で2.26を入れてます。これをやるとアップデートがあった場合に適用されません。しかしjauntyを使っている間、gnomeのゲーム関連でアップデートはみたことがないので多分問題ないでしょう。

(識者の方に怒られそうです。下記の説明はかなりはしょってますが、これでわからない方はやめておいた方がいいと思います。)

要領

1.synapticのゲームのカテゴリに入っているものをアンインストール。

2.jaunty用のdebを落としてきて、arで解凍、さらにdata.tgzをtarで解凍

control.tgzのなかのpostinstallを実行。ファイルは下記から
http://jp.archive.ubuntu.com/ubuntu/pool/main/g/gnome-games/gnome-cards-data_2.26.1-0ubuntu2_all.deb
http://jp.archive.ubuntu.com/ubuntu/pool/main/g/gnome-games/gnome-games-data_2.26.1-0ubuntu2_all.deb
http://jp.archive.ubuntu.com/ubuntu/pool/main/g/gnome-games/gnome-games_2.26.1-0ubuntu2_i386.deb

3.パッチを当てる。

です。ちなみにdpkgでインストールするとupdate-managerを起動したときに
アップグレードが不完全だと怒られます。しかもディストリビューションのアップデートをしないと通常のアップデートの適用ができません。

●修正内容の説明

入力した値がコンフリクトしているとclass SudokuGridに保持しているデータ(コンフリクトチェック用のset3つと盤面対応のlistのlist)には入力値を保持せずに例外を投げます(オリジナルの107行目から始まるaddメソッド参照)。GUI上は数値が入っているので問題の現象が起ります。

そこで、コンフリクトチェック用のsetはlistに変更(当然追加はaddでなくappend)、ただし終了判定などで要素の数をチェックしていたりするので基本的に参照時はset()でset型に直して使用。コンフリクトした場合でも要素の追加を行います。(これはあちこち直します。)

コンフリクトした場合でもチェック用のリストに要素の追加を行っているので、コンフリクトチェックのメソッドで自分自身をコンフリクト判定から除外するように修正します。(オリジナルの179行目から始まるfind_conflictsメソッド)

0 件のコメント:

コメントを投稿