<< 前のページ
2024年12月6日(金) 22:02
最後に置いたブロックは、右隣りに置いて縦位置列を消す方が明白に好形である。それを判断できていない。更には、1マスだけの空き地が多過ぎる。1マスだけの空き地は大きな減点要素にしているのに、まるで考慮されていないようだ。
空き地の広さを判定する処理は動いているはずなのに・・・とその周辺をチェックし、単純ミス発見。修正する。
その後もいろいろ修正して試していたが、どうしても1万点と行かないうちに解無しゲームオーバーを食らう。人間に対する優位性が感じられない。
そもそもがブロックブラストをソフト打ちする意味がなく自己満足でしかない。もういいかな、と思い始めた。エアガン機動戦闘車の製作に戻る頃合いだ。
普通に人力でプレイするのが楽しめるアドベンチャーモードも、日数制限あってそれまでクリアしたラウンド数が初期化されてしまうのに萎えた。
written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
2024年12月5日(木) 21:05
空きブロックごとに、隣接4方向ではなく斜めも含めた8方向をチェック。空きブロックうが何箇所あるかをカウント。空き地ごとに、空き地に属するすべてのブロックの隣接空き数を合計したのが数字である。
こうして計算した隣接空きの多さを足し算したうえで、空き地の数で割って評価値を算出。256倍したうえで小数部は切り捨ててしまう。
txは足し算した結果で、それを256倍して空き地の数(今の場合は8)で割ったものがtyとなる。実際には計算ミスで、9で割ってしまっている。しかし、大勢に影響はない。
tyが大きいほど盤面は良いという評価関数にして、ゲームを進めてみた。だが、途中経過でも良い盤面に導かれている感じがしない。tyの値と人間が感じる盤面の良さが、大して相関していないように感じる。
そして案の定、しばしばコンビが途切れるくせに突然の解無しゲームオーバー。その時の盤面も空き地が8分割されているなどボロボロである。
またしても、評価関数の作成に失敗したようだ。
人間が見て好形と感じる度合いを数値化するのは、想像以上に難しい。ちっとも改善していない。コンピューターは見落としがないという一点だけで断然有利なのに、自分で普通にプレイしたときと変わらないスコアしか取れていない。盤面の好悪判断で、圧倒的に人間(自分)に劣っているのだ。
こうなると、アプローチを変えざるを得ない。
古典的手法の方が適しているかもしれない。すなわち、人間の判断基準を片っ端からリストアップし、それをプログラムとして記述しまくるのだ。
その前に、まずコンボについて言及したい。
クラシックでハイスコアを狙うには、コンボが必須である。コンボが続かない状態だと、悲しいほど全然スコアが伸びない。コンボを続けるには、適切なリソース管理がキモとなる。リソースとは、縦横のライン消しを行う取っ掛かりになるブロックのことだ。適切にブロックが存在していないと、コンボができにくくなる。だから、全消しは望ましくない。一方でブロックが存在し過ぎていても、イコール空き地が少ないということなので置き場所がなくてゲームオーバーになり易い。
すなわち、コンボ切れとゲームオーバーの両方を回避できるような「適度な」ブロックが盤上に存在しているのが望ましい。そんな状態をできるだけキープしつつコンボを途切れさせないのがリソース管理である。
リソース管理の観点から見ると、最外周にブロックが存在しているのが望ましい。それ以外の場所にブロックが存在していても得失は両方あって難しいので、最外周にブロックがある場合にボーナス評価というのが妥当だろう。
コンボが連続すると、リソースが消費されがち。3ブロック中に1回はライン消しを発生させることは極めて重要だが、複数回のライン消しを発生させてもリソース消費のデメリットが一般には上回る。よって、ライン消し発生回数の評価は 1>2>3>>0 と行うべきだろう。コンボ余裕は多いに越したことはないが、余裕を重視し過ぎて盤面を汚くする方が悪い。よって、コンボ余裕は評価するがスコアは小さくする。
written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
2024年12月4日(水) 22:06
隣空き地の数が2でもペナリティーを増やし、3や4でないと損になるよう評価関数を微調整してみる。
やはりコンボは繋がらず、点数がなかなか増えない。そして、突然の解無しゲームオーバー。
盤面は幾つもの空き地に分割されてしまっている。空き地の分断も悪い盤面なのに、それを評価できていない。
盤面の好悪を数値化するのは、意外に難しいと実感して来た。
ただ、評価関数以外のガワはまっとうに動作しているようだ。つまり、今後は適切な評価関数を作ることだけに集中できる。
そこで、空き地ごとにリストアップするプログラムを作り、正しく動作していることを表示で確認。同じ番号は同じ空き地に属し、異なる番号は異なる空き地に属している。
塗り潰し処理を応用したもので、自分は「塗り潰し」処理が最も「再帰呼び出し」のサンプルに適していると思っている。プログラムの学習で再帰呼び出しの概念は結構な壁だと思うが、塗り潰しプログラムを見ながら概念を実感するのが分かり易いと考えている。
再帰呼び出しのサンプルには階乗を計算するプログラムが良く登場するが、階乗はわざわざ再帰呼び出しを使わなくても直感的なアルゴリズムで計算できる。それに対し塗り潰しは、再帰呼び出しを使わずに記述するのは難しい。どうやって処理すれば良いか途方に暮れるだろう。いっぽう再帰呼び出しを使うと、数行でサラっと書けてしまう。
こんな感じである。
void paint1(char *cp) { // cp と上下左右を塗り潰す
if (*cp) return; // cp が空白でなければ何もせず処理終了
(*cp) = 1; // cp を塗る
paint1(*(cp-9)); // 上隣とその上下左右を塗り潰す
paint1(*(cp+9)); // 下隣とその上下左右を塗り潰す
paint1(*(cp-1)); // 左隣とその上下左右を塗り潰す
paint1(*(cp+1)); // 右隣とその上下左右を塗り潰す
}
これを、paint1(塗り潰し開始位置); で呼び出す。
written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
2024年12月3日(火) 20:41
空所をリストアップし、それぞれの空所において上下左右の4隣も空所になっているかカウントする。1マスの飛び空き地なら4隅の空所はゼロ。広い空き地の中央部は空所が4。
空所におけるこの隣接空所数の「平均値」を算出し、評価関数に活用。
この修正版を動かすと、相変わらず連鎖をガンガンつなげつつ盤面も乱れにくく、快調に得点を重ねて行く。
良さげだと思って進めていると、突然「解無しゲームオーバー」になった。
その盤面を見ると、1マスの飛び空き地が5箇所もある上に空所が分断されていて、極悪盤面になっている。どうやらコンボを優先し過ぎて、盤面の悪化が無視された模様。
すると、頻繁にコンボが途切れて、得点が伸びなくなった。それでも延々と続ければ得点は加算されるのだが、これまた解無しに遭遇。
盤面を見ると、1マスの飛び空き地こそ1箇所だけだが、好形とは言い難い。空き地が細長く伸び過ぎている。これは、好形かどうかを適切に数値化できていない。隣空き地の数が2あれば「それなりの盤面」とされてしまい、しかしてその盤面の実態がコレというわけだ。
written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
2024年12月2日(月) 20:02
マウスクリックで問題を設定し、キーボードのリターンキーで読みの開始としてある。
読みが終わると、リターンキーで1手ずつブロックを置くようにした。消えると分かり難くなるので、ブロック位置を赤四角で強調表示。
こうして3手分の解を確認したら下段の3つのブロックは空白になっているので、改めて続く問題を設定してどんどん進行できるようにした。
←では3つのブロックいずれとも異なる形状のブロックが赤表示されているが、1つ前の盤面最後に置いたブロックだ。
実機上で並行して入力し、盤面が実機と異なる状態に変化したりしないかどうか確認。大丈夫だ。
とりあえずコンボ状況だけを見て、コンボができるなら最優先。コンボできないならとにかく置ける解を出す。盤面が綺麗かどうかはまだ考慮していない。
それだけの判定で動作させたところ快調にコンボが連鎖し、もしかして盤面の綺麗さなど判定せずにコンボだけでうまく機能するのでは?と思い始めた。
だが、30連鎖ぐらいで「解無し」ゲームオーバー。
やはり、盤面は綺麗にする必要があるようだ。
ブロックブラストは明らかにツモ操作が行われている。盤面があるていど綺麗な状態であれば、解が存在するような3つのブロックが用意される。そして、盤面が汚くなって来ると詰んでゲームオーバーという感じ。
よって、盤面の綺麗さを数値化する評価関数の作成が重要課題となる。
written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
<< 前のページ
Generated by MySketch GE 1.4.1
Remodelling origin is MySketch 2.7.4