9年前、私はPSPを購入することに無謀でした。 ソリティアの欠如だけが喜びによって曇っています。 私がソリティア愛好家だったわけではありませんが、どういうわけかオプションの1つである「スカーフ」のレイアウトに慣れました。 私はこのソリティアを自分で書かなければなりませんでした。 その後、PSP用に書かれたこのソリティアをWindowsおよびQNXで移植しました。 この記事では、このようなゲームの作成方法を説明します。
まず最初に、グラフィックが必要です。 描画方法がわからないので、すべてのグラフィックをインターネットから取得しました。 PSPカードのバージョンでは、フラグメント(数と色)から推測しましたが、他のバージョンでは、移植時に各カードが個別のスプライトを受け取りました。 次に、ソリティア自体のアルゴリズムの実装について考える必要があります。
この構造でカードを配置できるボックスを設定しましょう:
合計で13個の箱があります。 各ボックスは52の区画で構成されています。 これらは図にあります:
競技場の箱マップ可視性フラグは、マップが開いていることを意味します。 カードの値が負の場合、ボックスにこれ以上カードがないと仮定します。
最大52枚のカードを各引き出しに入れることができ、カードがもうないことを示す別の印-合計53個のセルコンパートメント。
カードを引き出し間で移動する機能が必要です。 ここにあります:
ここでは、取得するブランチインデックスと配置できるブランチインデックスを探しています。 しかし、この機能はカードのスートと価値を考慮した移動のルールをチェックしません。 一番下のカードをある引き出しから別の引き出しに移動するだけです。
また、ゼロボックスから最初のボックスにカードを移動する機能も必要です。 これらのボックスはストアであるため、その内容は円を描いて移動します。
ここで、カードをゼロボックスから最初のボックスに移動します。そのような移動が失敗した場合、ゼロボックスは空なので、最初のカードからすべてのカードをゼロに戻す必要があります。
次に、レイアウトを初期化する必要があります。 このようにしましょう:
最初は、すべてのカードがゼロボックス(ストア)に配置され、このボックスがランダムな数までスクロールし、2〜8のインデックスを持つ他のボックスに移動します。もちろん、ソリティアが確実に収集されるようにカードを投げることができますが、私はそうですしませんでした。 また、52枚のカードからランダムにカードを選択し、目的のボックスに入れるだけです。 それで私もしませんでした
上記の関数は別の関数を使用します:
さて、ここではすべてが明確だと思います。 もちろん、最適化のために、カードの数はいつでも覚えることができますが、あまり意味はありません。これらの関数はほとんど呼び出されないため、ここではパフォーマンスは重要ではありません。
どのカードが表示され、どのカードが表示されないかを追跡しないために、ここでそのような機能を設定します。
彼女は、引き出し2〜8の一番下のカードをすべて開きます。
MoveCard関数は上記のとおりです。実際、ソリティアの初期化段階とストアをスクロールするときにのみ使用されるため、実際にはゲーム自体では使用されません。 問題は、ソリティアでは、個々のカードではなく、カードのグループを転送する必要があるということです。 このようなグループを移動するには、ChangeBox関数があります。これには、ソースボックス、宛先ボックス、およびセルインデックスを指定する必要があり、そこからカードを転送する必要があります。
ただし、すべてのルールを考慮したカードの完全な移動は、ChangeBoxを使用する別の関数によって実行されます。
アセンブリフィールド(インデックスが9から12のボックス)では、値の大きい順に適したカードのみを配置できますが、最初のカードは常にエースである必要があります。 競技場では、スーツの色が反対になり、カードの値が増加し、空のフィールドに移動できるのは王だけです。
ソリティアは、各ボックスのアセンブリフィールドに正確に13枚のカードがある場合に収集されます。
ボックスの便利な作業のために、座標を持つ配列があります:
この配列は次のように入力されます。
この配列では、各ボックスに対して、52枚すべてのデッキカードのすべての場所が形成されます。 この配列を使用すると、プレーヤーがマウスで選択したものを簡単に判断できます。
実際、ここでソリティアの論理部分の記述が終了します。 好みに合わせてインターフェイスを作成できます。 PSP(while(1)に回転する場所)からプログラムを転送したため、ループをタイマーに個人的に接続し、各タイマーモードに独自の番号とハンドラーを割り当てました。 また、タイマーから実行されるOnPaintを非同期的にバインドします。 これは、移植時にこれを行う最も簡単な方法でした。
QNX用およびPSP用のオリジナルのWindows用
アーカイブプログラム。
GitHubでプログラムを修正:
github.com/da-nie/PatienceMoveCard-サイクルは最大52でなく、最大53でなければなりません。 アーカイブが再充填されます。