SSブログ
コンピュータ ブログトップ

スパイダーソリティア必勝法 [コンピュータ]

spider.gif
ウインドウズ付属のゲームに「スパイダース ソリティア」というのがあって、これがなかなか面白い。トランプのひとり遊びなのだが、初級、中級、上級がある。やってみると初級は簡単で、上級に進むと非常に難しくなる。というより、殆ど不可能だろうという気がしてくる。しかし、ゲームとして成り立っているのだから解けないわけでもあるまいと思ってやっていると、最後にバサバサとカードが消えて行きゴールとなる。おめでとうとロゴが出て花火が上がると言うおまけまでついている。もう一度花火が見たくてまた挑戦してしまう。だんだんと腕前が上がり、あれほど難しく思えたのがウソのようになる。現在の所、XPでの勝率25%で、vistaではまあ時間をかければ大体クリア出来るようになった。図は100回目で25勝の時の画面記録だ。どうすればクリアできるかというか、楽しい遊び方を公開しておこう。裏技だなどど卑下する必要はない、これが難しいゲームの正しい楽しみ方なのだ。だから、必勝といっても常勝ではない。

1)ゲームを選ぶ
喧嘩に勝つコツは勝てる相手とやること。最初のカードが気にいらなければ、スパイダーソリティアはF2でゲームを変えることが出来る。これは負けにカウントされない。一回でも手を進めると途中で止めたものは負けとしてカウントされる。最初のカードだけが問題なのではないが、最初が良ければ序盤戦は攻めやすくなる。判断基準は3ペアと考えると良い。89、45、32のように同じスーツで動かせるペアが3つあることが条件だ。なかなか出ずに20回以上もF2を繰り返すこともあるが、勝つためには忍耐が肝要。

2)「待った」をする
囲碁将棋にまったはご法度だが、スパイダーソリティアでは許されている。出来る限り待ったをする。CnTl+zで手を戻す。どこまで戻せるかというと、カードを配ってもらう所、あるいは一列をクリアしたところだ。何回もやり直して最善の手で次に進む。何が最善かというと、出来るだけ多くを表向けにして、出来るだけ多くを一連のつながりにするということだ。vistaでは何処までも戻れて面白さが減った。

3)やり直す
どうしてもクリアできない場合は、「最初からゲームをやり直す」を行い、間違った箇所をやり直す。これは1回負けになるが、何のカードが出るかわかっているのでやりやすい。vistaではcntl-zで何処までも戻れてしまうので、これは「待った」と同じことになる。

4)序盤戦の進め方
序盤戦ではとにかく、カードをめくることに専念する。「待った」を繰り返し、なるべく多くのカードを表にしていく。カードをめくっていけば、やがて空きスペースが出来る。2枚目を配った所で空きスペースが出来ないようではクリアはおぼつかない。空きスペースが出来たら、これを使って、つながりをつけるように並べ替えていく。一度出来た空きスペースは徹底利用し、そう間単には塞がないこと。

5)中盤戦の進め方
小さなつながりをだんだんと大きなつながりに育てていく、Aまでつながって一列クリアになることもあるが、喜んではいけない。必ず、クリアした後の一手を考える。クリアする前にやっておくべきことがないかよく考える。「間接入れ替えテクニック」が役に立つので応用する。

6)終盤戦の進め方
最終のカードが配られたらここで勝敗が決る。この状態で空きスペースがないと身動きできない。幾つかの空きスペース候補を作っておく。大きなクラスターも出来ているので、どれをクリアするかを決めてそれに集中する。他のクラスターは崩すことをいとわない。ここでも「間接入れ替えテクニック」は重要。

「間接入れ替えテクニック」とは、私の勝手なネーミングだが、例えば次のような状況を考えてみよう。
line1:[ハート]k,[ハート]q,[ハート]j,[ハート]t,[ハート]9,[ハート]8,[クラブ]7,[クラブ]6,[クラブ]5,[クラブ]4,[クラブ]3,[クラブ]2,[クラブ]a
line2:[クラブ]k,[クラブ]q,[クラブ]j,[クラブ]t,[クラブ]9,[クラブ]8,[ハート]7,[ハート]6,[ハート]5,[ハート]4,[ハート]3,[ハート]2,[ハート]a
line3:
これでline1のクラブをline3に退避させてline2のハートと入れ替えればよいことはすぐに気が付く。これは直接入れ替えである。
クラブの前にスペードが入って次のような場合、
line1:揮毫[ハート]k,[ハート]q,[ハート]j,[ハート]t,[ハート]9,[ハート]8,[スペード]7,[スペード]6,[スペード]5,[スペード]4,[クラブ]3,[クラブ]2,[クラブ]a
line2:[クラブ]k,[クラブ]q,[クラブ]j,[クラブ]t,[クラブ]9,[クラブ]8,[ハート]7,[ハート]6,[ハート]5,[ハート]4,[ハート]3,[ハート]2,[ハート]a
line3:
line4:[スペード]k,[スペード]q,[スペード]j,[スペード]t,[スペード]9,[スペード]8,[ダイヤ]7
同じようにクラブを退避させただけでは入れ替えが出来ない。このようなとき、まず[クラブ]3,[クラブ]2,[クラブ]aをline3に移す。すると[スペード]6,[スペード]5,[スペード]4がline4に移せることになる。[クラブ]3,[クラブ]2,[クラブ]aもline4に積み上げればline3が空き、[スペード]7を置ける。これでハートがクリアできる。直接に入れ替えるのでなく、line4に積み上げて、入れ替えが出来る状態を作るので「間接入れ替え」と呼んでいる。[ダイヤ]7はどのマークでも良いから応用は広い、さらに二段間接の場合もある。

以上の知識でXPで25%vistaならほぼ100%のクリアが出来るだろう。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:ゲーム

パワーポイントで遠近法の絵を描く [コンピュータ]


絵を描くツールとして意外と重宝なのがパワーポイント。いろんな既定の図形が用意されているし、手作業で動かしたり、前後関係を調整したり出来る。均等配置で並べたり出来るのも便利だ。この機能はワードでもエクセルでも共通だが、パワーポイントは400%まで拡大出来るから細かいところまであわせることが出来る。

欠点としてはCADではないので寸法関係が目分量になってしまうことだ。これはマクロを使うことで対処できる。あまりパワーポイントでマクロを使っている人はいないようだが、寸法を考慮した図を描こうと思えばマクロを使うのがやりやすい。

いろいろと使い方に工夫しているとだんだん欲が出てくる。物事をビジュアルに説明しようと思えば図面よりもスケッチがわかりやすい。それは3次元を表現できるからだろう。遠近法で描いた絵は自然で理解しやすい。しかし、これをパワーポイントで描こうとおもうとなかなか容易でない。そもそもパワーポイントは斜め線すら得意でないのだ。

これもやっぱりマクロでなんとかなる。しかし、なかなか手の込んだことをやらねばならない。まず3次元座標を決めて、それを2次元の遠近法座標に変換する。次に図形を面に分解して、見る角度によって異なる「見える面」を選び出す。この面を順次描いていけばいいのだが、それにも順番がある。レンダリングはなかなか難しい。

一週間かかりの試行錯誤で悩みながら描いてみた絵がこのようなものだ。もっと、簡単にかける方法があれば知りたいものだ。実際、かなり高級なCADでもパース図はなかなか完璧ではない。

続きを読む


点をなめらかな曲線でつなぐ--3次式補間 [コンピュータ]

一昨年のボーナスが80万円、今年のボーナスが75万円、去年のはいくらだったっけ?なんて時には大体その中間だろうと見当をつける。しかし、3年前に90万円だったりすると、去年はもう少し少なかったように思う。グラフを書いて見て、滑らかに線を引っ張ると半年前が底で去年も75万と言うことになる。

これをコンピュータでやろうとするとどうなるか? 一番簡単なのは2点の間を直線で結んで折れ線グラフにしてしまう線形補間だが、大体その中間だろうと見当をつけるのと同じで、これではあまりに芸がない。やはり点を滑らかにつなぎたいと言うことになる。

直線の次に簡単なのは放物線で、点が3つあれば1つの放物線が決められ、3点が綺麗に曲線で結ばれる。しかし、実際には3点でなく、もっとたくさん点がある場合が多い。この場合、区間に切って、区間ごとに放物線を決める3点を変えていくことになる。

やってみるとこれがうまく行かない。線がまがりくねっている場合、放物線を決める3点を変更したとたんに値にピョンと飛びが出てしまうのだ。点のところで切り替えをすれば飛びはなくなるが、カクっと角ができて、全然なめらかではない。放物線は2乗の係数の正負で曲がり方が逆になってしまうのだからいたし方ない。

世の中にはこれを解決する方法があり、ベジェ曲線とかスプライン曲線と言うものがそれだ。ベジェ曲線は2点間をあまりに自由につなぐので補間には向かない。スプライン曲線は数学的に完璧なものだが大きなマトリックスを解いたりせねばならずお手軽ではない。

実用的なのは放物線を一歩進めて3次曲線で結ぶという方法だ。補間する区間の端とその外側の点4つで3次式を決める。3次式の場合、4点をずらして行くと、区間の外側で傾きが反対になっても、区間内の曲がりは同じになる。微分連続というわけではないが、微分がそう急激に変わらずに連続性が保たれているわけだ。

(x(0),y(0))から(x(3),y(3))までの4点を通る3次曲線yy=ax^3+bx^2+cx+dの係数a,b,cを求めるのは以下のとおり。ちょっと複雑だが一度書いてしまえばいつでも滑らかに点をつなぐことができる。正式のスプラインは点列全部を読み込んで大きな行列を解くのだが、この3次式補間は周りの4点だけで値を決めるのではるかにお手軽になる。

強引に方程式を解いて y=a+bx+cx^2+dx^3 の係数を決めてやると
d=(x(0)*(x(0)-x(2))*x(2)*(x(0)-x(3))*(x(2)-x(3))*x(3)*y(1)+x(1)^3*(x(0)*(x(0)-x(3))*x(3)*y(2)+x(2)^2*(x(3)*y(0)+x(0)*y(3))+x(2)*(x(3)^2*y(0)-x(0)^2*y(3)))+x(1)*(x(0)^2*(x(0)-x(3))*x(3)^2*y(2)+x(2)^3*(x(3)^2*y(0)+x(0)^2*y(3))+x(2)^2*(x(3)^3*y(0)-x(0)^3*y(3)))+x(1)^2*(x(0)*x(3)*(x(0)^2+x(3)^2)*y(2)+x(2)^3*(x(3)*y(0)-x(0)*y(3))+x(2)*(x(3)^3*y(0)+x(0)^3*y(3))))/((x(0)-x(1))*(x(0)-x(2))*(x(1)-x(2))*(x(0)-x(3))*(x(1)-x(3))*(x(2)-x(3)))
c=(x(0)^2*(x(0)-x(3))*x(3)^2*(y(1)-y(2))+x(2)^3*(x(3)^2*(y(0)-y(1))+x(0)^2*(y(1)-y(3)))+x(1)^2*(x(3)^3*(y(0)-y(2))+x(0)^3*(y(2)-y(3))+x(2)^3*(-y(0)+y(3)))+x(2)^2*(x(3)^3*(-y(0)+y(1))+x(0)^3*(-y(1)+y(3)))+x(1)^3*(x(3)^2*(-y(0)+y(2))+x(2)^2*(y(0)-y(3))+x(0)^2*(-y(2)+y(3))))/((x(0)-x(1))*(x(0)-x(2))*(x(1)-x(2))*(x(0)-x(3))*(x(1)-x(3))*(x(2)-x(3)))
b=(-x(0)*x(3)*(x(0)^2-x(3)^2)*(y(1)-y(2))+x(2)*(x(3)^3*(y(0)-y(1))+x(0)^3*(y(1)-y(3)))+x(1)^3*(x(3)*(y(0)-y(2))+x(0)*(y(2)-y(3))+x(2)*(-y(0)+y(3)))+x(2)^3*(x(3)*(-y(0)+y(1))+x(0)*(-y(1)+y(3)))+x(1)*(x(3)^3*(-y(0)+y(2))+x(2)^3*(y(0)-y(3))+x(0)^3*(-y(2)+y(3))))/((x(0)-x(1))*(x(0)-x(2))*(x(1)-x(2))*(x(0)-x(3))*(x(1)-x(3))*(x(2)-x(3)))
a=(x(0)*(x(0)-x(3))*x(3)*(y(1)-y(2))+x(2)^2*(x(3)*(y(0)-y(1))+x(0)*(y(1)-y(3)))+x(1)*(x(3)^2*(y(0)-y(2))+x(0)^2*(y(2)-y(3))+x(2)^2*(y(0)+y(3)))+x(2)*(x(3)^2*(y(0)+y(1))+x(0)^2*(y(1)+y(3)))+x(1)^2*(x(3)*(y(0)+y(2))+x(2)*(y(0)-y(3))+x(0)*(-y(2)+y(3))))/((x(0)-x(1))*(x(0)-x(2))*(x(1)-x(2))*(x(0)-x(3))*(x(1)-x(3))*(x(2)-x(3)))

なのだが、それは凡人がやることであって、賢く考えればもっと簡単に求めることができる。3次式による補間とはラグランジェ補間の次数を3次に止めただけのことだ。
y=y(4)*(x-x(1)/(x(4)-x(1)) * (x-x(2)/(x(4)-x(2)) * (x-x(3)/(x(4)-x(3))
+y(1)*(x-x(2)/(x(1)-x(2)) * (x-x(3)/(x(1)-x(3)) * (x-x(4)/(x(1)-x(4))
+y(2)*(x-x(2)/(x(2)-x(3)) * (x-x(4)/(x(2)-x(4)) * (x-x(1)/(x(2)-x(1))
+y(3)*(x-x(2)/(x(3)-x(4)) * (x-x(1)/(x(3)-x(1)) * (x-x(2)/(x(3)-x(2))

というのがその解なのだが、さすがラグランジェ先生は頭が良い。yの4つの値のミキシングだと考え、x=x(1)の時には他の項が消えるように(x-x(i))をかけて、あとで規格化するために割ってやる。これで何次の式であろうと作れる。ここでは最低必要な3次式にしている。これで4点ごとに3次式を決めて行けば補間ができて、緩やかな曲線なら本格的なスプラインに比べても遜色ないように思う。

「スプラインに比べて遜色ないように思う」と書いてはみたが、データの上がり下がりが大きい場合はやはり角張る。大きく外れるわけではないのだが厳密には微分連続ではないからだ。遜色ないようにするにはもう少し改良がいる。






続きを読む


二次元データの補間 [コンピュータ]

interplation.jpg
与えられたデータを実際に使おうとすると、中間点での値が必要になるからどの場合でも補間は必須だ。スプラインとかラグランジェとか高度な補間の仕方はもあるが、一番簡単なのは直線近似つまり点間を直線で結んでデータはその上にあるとすることだ。

これは一次元の話だが、二次元データでも同じように平面近似が出来るかというと、実はそう簡単ではない。直線が2点で決まるように平面は3点で決まってしまうからだ。データが三角メッシュで与えられているならばそれでいい。しかし、大抵の場合四角メッシュで与えられる。それが普通だ。
4pplane.jpg
だから4点をもとにした補間が必要なのだが、4点で決まる面は図のように曲面にならざるを得ない。平面で近似しようとすると一点余ってしまう。強引に3点だけを使うようにするとメッシュ点を切り替える境界で飛びが出来ることになる。4点の場合「ねじれ」を考慮しなければならず、直線近似できないのだ。

では、どうすればいいかというと、「定数」「x項」「y項」「xy項」の4つにしてそれぞれの係数を4点のデータで決めるとよい。一番簡単な、縦横の間隔dx,dyのメッシュでデータが与えられている場合の補間式を掲げておこう。

V0=(1 -(x-x0) /dx-(y-y0)/dy +(x-x0)(y -0y)/dx/dy)*val(0)

V1=((x -x0)/dx-(x -x0)(y-y0)/dx/dy)*val(1)

V2=((y -y0)/dy-(x -x0)(y-y0)/dx/dy)*val(2)

V3=( (x-x0)(y -0y)/dx/dy*val(3)

Val(x,y)=v0+v1+v2+v3

nice!(0)  コメント(0) 
コンピュータ ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。