kurokawa49 2018/06/28 23:01

ゲームを作ろう_6

今回はランダムと勝ち負け判定を実装していきましょー
しかし第六回でまだこことは、驚きの牛歩っぷりですね。


ランダムは↓のようなコードを書きます。
[iscript]
tf.judge = Math.floor( Math.random() * 3)
[endscript]

例によってアスタリスクは半角です。
ここでは実行するたびに0,1,2のどれかがランダムに決定されて、tf.judgeに代入されます。
tf.judgeは変数です。
変数と演算を活用する
なんでか、公式の基本チュートリアルでは変数出てこないんですよね。

[iscript] はJavaScriptを記述できるタグです。まあ・・・めんどくさいんでとりあえず理解しないでコピペでいいと思います・・・。真面目な解説もページの最後に書いたんで、よかったらあとで見てください。
ともかく重要なのは、上のコードで0,1,2の数値をランダムに取れるってことです。
これを今回のゲームに当てはめると・・・

1.プレイヤーに手を選んでもらう
2.CPUの手をランダムに選ぶ
3.お互いの手から、勝ち負けを判定する。

コード!!


1.プレイヤーに手を選んでもらう
これは前回やったやつです。

;プレイヤーが手を選ぶ
[link target=*select_goo]グー[endlink][r]
[link target=*select_choki]チョキ[endlink][r]
[link target=*select_par]パー[endlink][r]
[s]

; 0:グー、1:チョキ、2:パー とする
*select_goo
[cm]
[eval exp="tf.playerHand = 0"]
@jump target=*gouryuu

*select_choki
[cm]
[eval exp="tf.playerHand = 1"]
@jump target=*gouryuu

*select_par
[cm]
[eval exp="tf.playerHand = 2"]
@jump target=*gouryuu

*gouryuu

前回は選択肢を選んだあと文字を表示しただけでしたが、今回は、プレイヤーが選んだ手を変数に格納しています。変数の格納にはevalタグを使います。
[eval exp="XXXXX"]
という形で、XXXXXの中に式を書きます。(ちなみにevalタグのオプションはexpしかないみたいです)


2.CPUの手をランダムに選ぶ
一番上でやったばっかですね。

[iscript]
tf.cpuHand = Math.floor( Math.random() * 3)
[endscript]
CPUの手は、[emb exp="tf.cpuHand"]でした。[r]

以上


3.お互いの手から、勝ち負けを判定する。
まずはコード

;お互いの手から勝ち負けを判定する
[if exp="(tf.playerHand == 0 && tf.cpuHand == 1) || (tf.playerHand == 1 && tf.cpuHand == 2) || (tf.playerHand == 2 && tf.cpuHand == 0)"]
プレイヤーの勝ちです![l][r]
[elsif exp="(tf.playerHand == tf.cpuHand)"]
引き分けです[l][r]
[else]
プレイヤーの負けです...[l][r]
[endif]

条件分岐、いわゆるif文ですね。
2行目がすごいことになってますが、これは、

プレイヤーがグーかつ相手がチョキ、
またはプレイヤーがチョキかつ相手がパー、
またはプレイヤーがパーかつ相手がグー

を表しています。要するに、「プレイヤーの勝ちか?」を判定してるわけですね。
論理演算子
※ティラノスクリプトとは関係ない解説サイト

4行目は、プレイヤーとCPUの手が一緒か?を見ています。もちろんあいこのパターンです。式にすると楽ちんですね。

最後に、それ以外なら負けということで[else]タグを書いてめでたしめでたし。


ここまでの実装をまとめたシナリオファイル

scene1.ks (1.08kB)

ダウンロード

次回はライフポイントの管理、勝敗時のイベントを実装する予定です。
こんなノロノロペースですが、あと2,3回で完成しそうですね

ところで、今回は「変数」とか「判定文」とか「論理式」とか、結構知ってる前提で書いてるやつが多いです。
調べれば簡単に出てくるようなものですが、調べるの面倒くせえ説明しろks等のコメントはお気軽にどうぞ




tf.judge = Math.floor( Math.random() * 3) の謎

Math.random()は0以上1未満の実数をランダムに返す関数です。0とか0.1とか0.98とか0.114514とかをランダムに出してくれるわけです。特定の数だけ高確率で出る、なんてことはなくて、全部の数が同じ確率で出てきます多分。

Math.floor()は、()で囲まれた数の小数点以下を切り捨てる関数です。Math.floor(0.1)は0になるし、Math.floor(8.99999)は8になります。

で、分かりづらいのは「*3」の部分ですよね。これは今回3パターンのランダムが欲しいので3と書いたわけですが、なんでこう書くんでしょうか?
見ただけだと意味不明ですが、計算してみたら実はなんてことはないです。(あ、ここでのアスタリスクは乗算です)

Math.floor( Math.random() * 3)が0になるのは、Math.random()が0.33333...以下の時です。
Math.floor( Math.random() * 3)が1になるのは、Math.random()が0.33333...より大きくて、0.66666...以下の時です。
Math.floor( Math.random() * 3)が2になるのは、Math.random()が0.66666...より大きい時です。

Math.random()は0~1未満の実数をランダムに等確率で出しますから・・・
0<=範囲1<=0.33333<範囲2<=0.66666....<範囲3<=0.9999...
これらの各範囲に当てはまる確率は1/3ずつですね。
で、これらの各範囲の数字は、一番上の式だと0、1、2を出すってことらしいので、3つの数字を等確率でランダムに出してくれるって寸法です。

最新の記事

月別アーカイブ

限定特典から探す

記事を検索