2021年2月1日月曜日

Python: スイカ割りゲーム

 Python.Japanの入門講座の「スイカ割りゲーム」を理解するために、自分でも参考にして、プログラミングしてみることにした。元の入門講座は以下のところにある。

https://www.python.jp/train/exercise/index.html


まず、以下のようなマス目のボードに、スイカがおいてあり、プレイヤーもそのマス目のどこかに配置する。方向は上向きが北とする。マスの座標はマスの中に書いてあるとおり。(元の例題では5マスだったが7マスに変更した)


ヒントはスイカの位置とプレーヤの位置をx軸とy軸の位置で示す。(元の問題では距離を示すことにしているが、遊びを簡単にするために変更した)


プレイヤーは、東西南北にそれぞれ一マスずつ移動できる。


スイカとプレイヤーが同じ位置に来るまで、移動を繰り返す。


ゲームの手順


1.スイカとプレイヤーの位置を決める。

2.スイカとプレイヤーの位置を示す。

3.キーボードから、移動情報の文字を受け取る。

4.受け取った文字が、nなら北、sなら南、eなら東、wなら西に一マス移動する。

5.スイカとプレイヤーの位置がおなじになるまで、2,3,4を繰り返す。

6。ゲーム終了のメッセージを表示する。


スイカとプレイヤーの初期位置の設定


スイカとプレイヤーの位置は、乱数を使用して、ランダムな位置に設定するようにする。ランダムの発生は、randomモジュールをインポートして使用する。

スイカとプレイヤーの座標は、0から6までなので、randomrange関数を使用する。


randomrange()は、


random.randomrange(開始値、終了値)


の形式で指定する。


ゲームの繰り返し処理


次にプレイヤーとスイカの位置が一致するまでの繰り返し処理を考える。この繰り返し処理は、while文を使用する。


スイカとプレイヤーの位置情報が一致するまで、処理を繰り返す。位置情報が一致するのは、スイカとプレイヤーのx座標の値と、y座標の値が両方とも一致した場合である。


スイカとプレイヤーのx座標、y座標はそれぞれ以下のように設定する。

(suika_x, suika_y)

(player_x, player_ y)


スイカとプレイヤーの距離を求める


スイカとプレイヤーの距離は、x座標の距離とy座標の距離を足したものとする。それぞれの座標はどちらが大きいのかわからないので、その距離や絶対値で示す。


abs(player_x - suika_x) + abs(player_y - suika_y)


この処理は関数として定義した。


def calc_distance(0x1,  y1,  x2,  y2):

    # 2点間の距離を求める

    diff_x = abs(x1 - x2)

    diff_y = abs(y1 - y2)


    return diff_x + diff_y


プレイヤーの移動処理


スイカとプレイヤーの位置情報を表示した後、input() 関数を使ってキー入力を行い、入力文字に従って、プレイヤーの位置を移動する。

元の例題では、入力依頼の文がなかったが、「移動方向を入力してください」という文章を追加した。


入力した文字がnなら北へ、sなら南へ、eなら東へ、wなら西へ移動する。

例えば、北へ移動するのは、プレイヤーのy座標を一つ減らして、ボードの上方に移動する。東へ移動するには、プレイヤーのx座標を一つ増やして、ボードの右方に移動する。


この移動での処理では、プレイヤーの位置がボードの外に飛び出ることがある。

x座標やy座標が、-1になったり、7になったりすることがある。その場合にはボードの外に飛び出さないように、0や6という元の値に戻して、飛び出さないようにする。(元の例題ではこの処理はなかったが、入れておいた)


以上の処理をプログラムに表示してみると以下のようになる。


実行結果は以下のようになる。




0 件のコメント:

コメントを投稿

JR東日本がみどりの窓口削減凍結

 この数年だと思うのだが、JR東のみどりの窓口がぽつりぽつりとなくなっていっていた。 JRの切符は、ネットで切符が予約できるようになったので、日本国内で旅行するときにも、みどりの窓口に行かなくてもすむ。 しかし、みどりの窓口でないとだめなこともある。私の場合だと、大人の休日倶楽部...