【#11】~スコア実装編~新人プログラマーはテトリスを作れるのか?【C#.NET】

2021.08.02

CATEGORY : C#.NET プログラミング

こんにちは、あんみんどうふです。

今回はスコアを実装します。やはりゲームにはこれが無いとやりがいがありませんね!

前回の記事はこちら。

こんにちは、あんみんどうふです。 今回はTスピンを行ったかどうかの判定を作って、いろいろ応用したいと思います。 現状、回転入れができるだけなのでTスピンをしても特に何もありません。 高度なテクニックをきめたのに何も見返りがない...

全編見たい方はタグからどうぞ。

11-0.テトリスのスコアについて

作品によって異なりますが、本家テトリスには各消し方の得点が決められています。今回は「ぷよぷよテトリス」を基準にして作ります。

各種消し方の獲得スコアは以下の通りです。

名称基本スコア
シングル(1列消し)100
ダブル(2列消し)300
トリプル(3列消し)500
テトリス(4列消し)800
Tスピンのみ400
Tスピンシングル800
Tスピンダブル1200
Tスピントリプル1600
REN(連続消し)50×REN数(最大1000)

これらに加え、パーフェクトクリアやTスピンミニ、Back To Backのボーナスが加算されます。追加スコアは以下の通りです。

名称追加スコア
パーフェクトクリア・シングル(1列消し)+800
パーフェクトクリア・ダブル(2列消し)+1000
パーフェクトクリア・トリプル(3列消し)+1800
パーフェクトクリア・テトリス(4列消し)+2000
Tスピンミニ+100
Back To Back×1.5

(参考:Puyo Puyo Tetris – Hard Drop – Tetris Wiki

ちなみに、Back To Backの乗算ボーナスはテトリスや各種Tスピンのみに適用されるので、追加スコアには乗算されません。
まとめると「((基本スコア+RENスコア)×BackToBack+追加スコア)」といった計算式になります。

また、消し方の他にもソフトドロップハードドロップにも獲得スコアがあり、1マス進める度に2点獲得します。

こうやって見ると結構複雑ですが、前作ったスーパーローテーションよりはマシですね。今回はこれを実装します。

 

11-1.スコアを表示する

コードを書く前にスコアを表示させる領域が必要なので、デザイナーを開きLabelを適当な位置に配置します。nameは「scoreValue」にしました。
プロパティですが、BorderStyleをFixedSingleにして領域をわかりやすくし、AutoSizeをfalseにしてちょうどいいぐらいの大きさに変え、右揃えにするためにTextAlignをMiddleRightにしています。

ここがスコアだよ~、と一目でわかるように”SCORE”と書かれたLabelも置きました。
nameは「scoreStr」にしましたが、これには特にコードを書く予定はないのでお好みで。

コードに戻り、グローバル変数として以下の変数を追加します。

scoreは現在のスコアを表します。そのまんま。

そしてフラグ関連の変数も追加します。これはuseTSpinとか書いている所にまとめておくとわかりやすいです。

BackToBackはその名の通り、BackToBackを行ったかどうかのフラグです。
perfectもその名の通り、パーフェクトクリアのフラグです。そのまんま。

次に、獲得した点数をスコアに適用させるためのメソッド「scoring」を新規で作成し、以下のコードを入力します。

スコアに引数resultScoreの値が加算され、合計が現在のスコアとしてされます。また、上限(99999999)を上回らないようにする処理も兼ねてます。

試しにスコアを獲得させてみます。
さっき作ったscoringの引数に「880」と入れてmainForm_Loadに追記して実行させます。

880点がスコアとして入ってます!これでスコアを獲得する処理は出来上がりです。

ちなみに880という数字は私の一番好きなポケモン「パッチラゴン」の図鑑番号です。

 

11-2.ソフトドロップ・ハードドロップでスコア獲得

ソフトドロップ・ハードドロップで1マス移動する度に2点入るようにします。

ハードドロップですが、今のwhile文のままだと実装は難しいのでちょこっといじります。
while文を使わずに真下へ移動させるため、ゴースト描画で使ったminoGhostメソッドを修正します。

今まではゴーストの高さ(ゴースト自体のY座標)を返すだけでしたが、引数がtrueの場合には現在位置からゴースト位置の差分を返すようにしました。

次にKeyDownイベントのKeys.Upを修正します。

変数hDropに差分の値を入れることでそのまま移動量として使えます。再利用できていいですね~。
獲得スコアは1マスにつき2点で、下移動を行った回数分乗算されます。

続けてKeys.Downも修正します。こちらは移動成功する度に2点加算させるだけでOKです。

 

ハードドロップで18マス移動しているので、2×(18+1)=38点入りました!

 

 

11-3.消し方によって獲得スコアを変える

最初に解説した各種消し方のスコアを獲得できるようにします。ついでにTスピン等の文字表示もここでやっちゃいます。
その前に、前回minoDropに追記したTスピン文字表示関連のコードは消しておきます。

新規メソッド「lineClear」を作成し以下のコードを入力します。
(コード中ではBackToBackをBTBと略しています。長いので・・・)

「Tスピン→ライン消し(もしくはテトリス)→BTBボーナス→REN→パーフェクトクリア→スコア反映」の順に処理しています。

Back To Backのボーナスは先述の通り、Tスピンテトリスにしか反映されないのでそれらの後に行います。

また、スコアに反映した後にBack To Back対象の消し方(Tスピンorテトリス)をしていた場合にフラグを立たせています。このフラグがtrueの時にTスピンかテトリスを行うと、Back To Backのボーナスを獲得できます。

あとはminoDropに追記して・・・

できました!ハイスコアを目指す遊び方ができるので、ゲームとしてまた一つ進歩しました。

 

やりたいことはまだまだあるので続きます。次はDASARRの実装です。
特殊テクニックとかそういうのではなく、テトリスの細かい仕様です。詳しくはまた次回。

#12 DAS・ARR編へ続く。

こんにちは、あんみんどうふです。 今回はDASとARRの実装です。今まで結構テトリスやってきている私も単語自体は初めて聞きました。 前回の記事はこちら。 https://www.terasol.co.jp/%e3%83%9...