広告 Python プログラミング

新米プログラマーによるPython入門-サイコロ・おみくじ・じゃんけん-

2021年1月25日

Pythonアイキャッチ

前回の記事の投稿から期間が開いてしまい申し訳ありません。今回はPython入門の第2弾です。
今回の記事では前回の記事で学んだif文とwhile文を利用してちょっとしたプログラムを作ってみたいと思います。
今回新しく登場するのが「乱数」になります。手短に乱数の関数について解説します。

乱数について

まず乱数という文字を見てどのような数字かは何となく予想できると思います。「乱れた数」つまりランダムな数ということです。
乱数は様々な使い方がありますが、イメージとしてつかみやすいのはゲームのガチャでしょうか。「★4確定ガチャ」とあっても★4の何が出るかはランダムですよね?「★4の○○確定」とキャラクター名が書いてあっても同じキャラクターに複数の★4が存在すればほしいキャラクターが出るかは確率になります。乱数はそういった確率を利用したプログラムを作成したいときに使用します。

randomモジュールについて

randomモジュールを使用するには初めにインポートする必要があります。

import random

その後は関数を使用するだけです。randomモジュールの関数random()は0.0以上1.0未満の浮動小数点数float型の乱数を生成します。

import random
print(random.random())

以下のようにrandint()を使用すると第1引数~第2引数の間のどれか1つのint値(整数値)を生成します。

random.randint(開始数,終了数)

float値(浮動小数点値)をの場合は。random.uniform(開始数,終了数)を使用します。
randomモジュールには他にもたくさんの関数が存在しますが、今回は浮動小数点値と整数値のみを使用します。

サイコロを作ろう

さて、まずはサイコロを作ります。と言っても乱数で生成する整数を使用するので難しくありません。
ただ数字を出すだけだと面白くないので何回サイコロを振るか入力してその回数分だけサイコロを振るようにしましょうか。

import random

def dice():
	val = input('サイコロを振る回数を入力してください。>> ') #inputを使用して回数を入力
	for num in range(int(val)):
		print(random.randint(1,6))

dice() #関数を実行

5行目の「range(int(val)):」についてですが、入力した値が格納されているvalを「int()」で囲っている理由ですが「val」は文字列として取得しているため数値ではありません。
そこで「int()」で囲うことで整数にしているわけです。

さて、これだけで入力した回数分1~6のいずれかの数字がランダムに出力されます。
実行するして数値を入力すると...

サイコロを振る回数を入力してください。>> 5 #数値を入力
6
4
2
5
3

私の場合はこの数字が出力されたと言うだけで数字が異なっていても入力した回数分出力されていれば成功です。
どうでしょうか。これくらいであれば簡単にできましたかね...?
では次に行きましょう。

おみくじを作ろう

おみくじです。一回きりのおみくじだと味気ないので、「おみくじを終了しますか?」「はい」で終了するおみくじにしましょう。
サイコロで使った整数の乱数を使用しましょう。コピペして実行するだけでも勉強になるので、コピペして終了ではなく内容を理解していきましょう。
今回は繰り返し処理に「for文」ではなく「while文」を使用したいと思います。油断すると無限ループになりかねないので要注意です。
おみくじについてですが、シンプルに「大吉・中吉・小吉・末吉・吉・凶」としましょう。

import random

def omikuji():
	while True:
		num = random.randint(1,51)
		if num > 0 and num < 5:
			print("大吉です。")
		elif num >= 5 and num < 15:
			print("中吉です。")
		elif num >= 10 and num < 25:
			print("小吉です。")
		elif num >= 25 and num < 35:
			print("末吉です。")
		elif num >= 35 and num < 50:
			print("小吉です。")
		else:
			print("凶です。")
		flg = input('おみくじを終了しますか?(終了する場合は「はい」その他はEnter)>> ')
		if flg == "はい":
			print("終了します。")
			break

omikuji()

急にプログラミングっぽくなってきましたね!確率的な感じにしました。
今回は単純なプログラムなので実行したと同時に1回目のおみくじの結果が出力されます。
「if・elif・else」を使用して条件分岐をしています。その条件は「乱数が●以上かつ×未満」と言った条件になっています。この数字の範囲を広くすることで条件に一致する確率が高くなります。
さてここでも出ました「input」。
今回は純粋にループを抜けるかどうかの条件に使用するために使っています。「はい」と入力されない限り繰り返します。
実行した結果がこちら。

小吉です。
おみくじを終了しますか?(終了する場合は「はい」その他はEnter)>> 
中吉です。
おみくじを終了しますか?(終了する場合は「はい」その他はEnter)>> 
末吉です。
おみくじを終了しますか?(終了する場合は「はい」その他はEnter)>> 
小吉です。
おみくじを終了しますか?(終了する場合は「はい」その他はEnter)>> 
小吉です。
おみくじを終了しますか?(終了する場合は「はい」その他はEnter)>> はい
終了します。

さて、少し難易度が上がってきましたね!!これの応用で次はじゃんけんです。

じゃんけんを作ろう

さてさて、最後にじゃんけんですね。おみくじと違う点は勝ち負けとあいこの条件がある点ですね。ただ、今回のおみくじは条件分岐を使用しているのでおみくじのさらなる応用と言う感じになります。
今回は勝つまでじゃんけんが終わらない仕様にしてみました。

import random

def user_input():  #ユーザー入力関数
    print("x=グー y=チョキ z=パー")
    user = input('[xかyかzを入力]>>>  ')
    user = user.lower()
    return user

def rock_paper_scissors():
    rps = {'x':'グー','y':'チョキ','z':'パー'}
    print("じゃーんけーん")
    user = user_input()
    while True:
        try:
            user_choice = rps[user]
            choice_list = ["x", "y", "z"]
            pc = rps[random.choice(choice_list)]
            draw = '引き分け!'
            win = '勝ち!!'
            lose = '負け!!'
            if user_choice == pc:
                result = draw
            else:
                if user_choice == "グー":
                    if pc == "チョキ":
                        result = win
                    else:
                        result = lose
        
                elif user_choice == "チョキ":
                    if pc == "パー":
                        result = win
                    else:
                        result = lose
        
                else:
                    if pc == "グー":
                        result = win
                    else:
                        result = lose
                        
            print("あなた:%s" %user_choice)
            print("コンピュータ:%s" %pc)
            print("結果は......%s" % result)
            if result == "引き分け!" or result == "負け!!":
                user = user_input()
            else:
                break
        except:
            print("xかyかzを入力してください。")
            user = user_input()

rock_paper_scissors()

ユーザーの入力は勝たない限り続くので関数にしてまとめました。
共通処理は関数という形でまとめてしまうと後々のメンテナンスが楽になりますよ。

まとめ

本業の方が忙しくなってしまい久しぶりの投稿になってしまいました。申し訳ないです。
これからまた少しずつ投稿していくのでお待ちいただけると助かります。
今後はマイクラのプラグイン開発の投稿に力を入れていこうと思います。

-Python, プログラミング