【人狼ゲームでPythonの総復習】Pythonの入門〜関数までの基礎文法の総復習をゲームを通して出來るサンプルコード

この記事では、簡単な人狼ゲームを作りながら、Pythonの入門〜関数までの基礎文法の総復習が出来るサンプルコードを掲載しております。

この記事で学習出来ることは、

・「=」代入と「==」比較演算子の違い

・無料で使えるオンラインのエディター紹介

・乱数とIF文で勝敗バトル

・Whileループと乱数で勝敗バトル

・↑記事に関数を導入

・Forループの基本的な使い方

・人狼役職の配列表示

・配列とForループ

・プログラミング学習コンテンツの紹介

についての概要が掴めます。
Python学習中の皆さま方、どうか宜しくお願いします


プログラミングの学習を始めた頃、「=」と「==」の違いで少し迷った時期がありました。

これについては、実際に手を動かしてコードを書いてみると、その疑問が氷解出来ました。

まず、「=」の代入ですが、変数roleに役職「市民」を代入して、print文で表示させます。

ご存知の方には恐縮ですが、コメントは「#」を付けます。
また、英語でroleは「役目」を表す単語です。

プログラミングには英語が良く出て来ますが、英検3級に落ちた私でも分からなかったら即調べるを繰り返して基礎文法は身に付きましたので、どうかご安心なさって下さい。

#変数roleに「市民」を代入
role='市民'

#役職を表示する
print(role)

実行結果はこちらです。

roleという変数に、役職「市民」が代入されて出力されました。
この後、roleに「裏切り者」を代入して出力します。

role='市民'

#別の役職、「裏切り者」を代入
role='裏切り者'

print(role)

実行結果です。

このように、代入では入れる値によっては上書きされるというイメージを持って頂けたらと思います。

一方で、「==」は、等しいかどうかの判定を行います。
boolで真偽(True か False)を返します。

role='人狼'

#boolで等しい時はTrue、そうでなければFalse
print(bool(role=='市民'))

「人狼」と「市民」は等しくないので、この様な実行結果になります。

IF文では、もしも「まっさらな市民」だとしたら自分は退場して、騎士などの役職持ちのメンバーに頑張ってもらいたい時は、例えばこの様に記述します。

role='市民'

#役職が市民だったら退場する
if role=='市民':
    print('自分は退場して、騎士や霊媒師などに頑張ってもらう')

実行結果です。

ここでもし、「==」を「=」にしてしまうと、エラーが出てしまって、正しく実行されません。

7行目の所でエラーが出ています。

「=」の代入と、「==」の比較演算子の違いは、実際に書いてみるのが一番理解できました。

とはいえ、「書いてみて」と言われても、プログラミングって環境構築に結構な時間や手間が掛かりますよね。

そこで、すぐに試してコードを書いて実行できる、オンライン上で無料の開発環境IDEを次の項目で紹介します。


結論ですが、paiza.ioがオススメです。

「コード作成を試してみる(無料)」→ 「Python3」 からすぐに学習開始出来ます。

無料のオンラインエディタ(IDE)を調べたら10個ぐらい出てきて、どれを使おうか迷いましたが、

といった点から、paiza.ioをオススメします。

ここでは、標準入力を使ってみます。
paiza.ioの下のタブの「入力」を選択して、自分のやりたい役職を入力します。

この状態で下記のコードを実行します。
変数roleに標準入力で入れた役職が入り、それを出力します。

#標準入力で、やりたい役職を入力する
role=input()

#その役職を表示する
print('私が1番やりたい役職は【'+role+'】です。')

標準入力についてはここまでにして、次からはランダムな数字である乱数を使って、ゲーム的な要素をプログラミングに取り入れてみます。


ここから、乱数を使って、「市民チーム」と「人狼チーム」の勝敗を出力するといった、ゲーム的要素を入れたコードを書いて行きます。

1から10までの乱数を作って、5以上だったら人狼チームの勝ち、そうで無ければ市民チームの勝ちとします。

乱数は、import random で使える様になり、1から10のランダムな整数は random.randint(1,10)で生成します。
その乱数を変数numに代入します。

勝者を入れる変数は、winnerを使います。

#乱数を使える様にする
import random

#1から10までの乱数を作る
num=random.randint(1,10)

#5以上だったら人狼チームの勝利
if num>=5:
    winner='人狼'
else:
    winner='市民'

#勝敗結果を出力
print('勝者は【'+winner+'】チームです!!')

実行結果です。

何回か実行してみると、

実行結果が変わりました。
このままでも、どっちが勝ったのか分かるのですが、乱数の数値が何だったのか知りたいので、numも表示させてみます。

#乱数を使える様にする
import random

#1から10までの乱数を作る
num=random.randint(1,10)

#5以上だったら人狼チームの勝利
if num>=5:
    winner='人狼'
else:
    winner='市民'

#勝敗結果を出力
print('勝者は【'+winner+'】チームです!!')
print(num)

あとは、1行で表示されるようにしたいのと、numもprint文の中に一緒に入れたいのですが、数値型の変数を文字列型と一緒に使う場合には、str(num)と書きます。

#乱数を使える様にする
import random

#1から10までの乱数を作る
num=random.randint(1,10)

#5以上だったら人狼チームの勝利
if num>=5:
    winner='人狼'
else:
    winner='市民'

#勝敗結果と乱数を一緒に出力
print('numが「'+str(num)+'」より、勝者は【'+winner+'】チームです!!')

実行結果です。


ループを使ってちょっとRPGっぽく、市民チームと人狼チームのHPを指定して、HPが0になったらループを抜けて負けにしてみます。

Whileループの継続条件は、両方のチームのHPが0以上の場合です。

攻撃されるとHPが減って、攻撃によってどれぐらいHPが減るのかを乱数attackで指定します。

flagが0だったら人狼チームの攻撃、1だったら市民チームの攻撃にします。

改行は「\n」を使います。

ちょっと複雑だな・・・と思われた方は、次の次のForループの所まで読み飛ばして頂いても大丈夫です♪

#乱数を使える様にする
import random


#市民チームと人狼チームのHP初期値を10にする
shimin_HP=10
jinro_HP=10

#whileループでバトル!!
while shimin_HP>0 and jinro_HP>0:

    #相手チームに与えるダメージは1から5までの乱数にする
    attack=random.randint(1,5)

    #0だったら人狼チームの攻撃、1だったら市民チームの攻撃にする
    flag=random.randint(0,1)

    if flag==0:
        print('人狼チームが市民チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された市民チームのHPがマイナスされる
        shimin_HP-=attack
    else:
        print('市民チームが人狼チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された人狼チームのHPがマイナスされる
        jinro_HP-=attack
    print('市民チームHP残:'+str(shimin_HP)+'\n人狼チームHP残:'+str(jinro_HP))
    print('----------')
    
#勝敗結果
if shimin_HP>jinro_HP:
    winner='市民'
else:
    winner='人狼'

print('勝者は【'+winner+'】チーム!!')  

実行結果は長いので省略させて頂きますm(_ _)m

コード自体が長くなってきて、メンテナンスの意味も込めて、次の項目ではバトルの部分と勝敗結果をdefを使って関数にして、関数をループ中やprint文の中から呼び出してみるようにコードを書き換えてみます。


バトルの部分を関数battleにして、whileループで呼び出し、勝敗結果をprint文の中で呼び出すコードに書き換えてみました。

#乱数を使える様にする
import random


#市民チームと人狼チームのHP初期値を10にする
shimin_HP=10
jinro_HP=10


#defで関数battleを定義する
def battle(shimin_HP,jinro_HP):
    
    #相手チームに与えるダメージは1から5までの乱数にする
    attack=random.randint(1,5)

    #0だったら人狼チームの攻撃、1だったら市民チームの攻撃にする
    flag=random.randint(0,1)

    if flag==0:
        print('人狼チームが市民チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された市民チームのHPがマイナスされる
        shimin_HP-=attack
    else:
        print('市民チームが人狼チームに「'+str(attack)+'」のダメージを与えた')
        #攻撃された人狼チームのHPがマイナスされる
        jinro_HP-=attack
    print('市民チームHP残:'+str(shimin_HP)+'\n人狼チームHP残:'+str(jinro_HP))
    print('----------')
    
    return shimin_HP,jinro_HP


while shimin_HP>0 and jinro_HP>0:
    #関数battleを呼び出している
    shimin_HP,jinro_HP=battle(shimin_HP,jinro_HP)    
    
#defで関数winを定義している
def win():
    if shimin_HP>jinro_HP:
        winner='市民'
    else:
        winner='人狼'
    return winner

#print文の中で関数winを呼び出している
print('勝者は【'+win()+'】チーム!!')


上記のWhileループの他にForループがあって、配列と一緒に使うのに便利です。
人狼ゲームの役職の配列を作ってその中身を取り出すのにForループを使って行きます。
その前に、Forループの基本的な使い方を確認します。

・0から4まで1ずつ加算

#0から4まで1ずつ加算
for i in range(5):
    print(i)

実行結果です。

もっと短いコードで書ける、内包表記を使うとこの様になります。

#0から4まで1ずつ加算
for i in range(5):
    print(i)

#内包表記
[print(i) for i in range(5)]

内包表記の実行結果も上のループと同じになります。

・0から9まで2ずつ加算

#0から9まで2ずつ加算
for i in range(0,10,2):
    print(i)

#内包表記
[print(i) for i in range(0,10,2)]

実行結果(同じなので、片方だけのスクショです。)

・5から1まで1ずつ減算

#5から1まで1ずつ減算
for i in range(5,0,-1):
    print(i)

#内包表記
[print(i) for i in range(5,0,-1)]

以上が、Forループの基本的な使い方です。


配列って、なんか難しそうだ・・・と思われた方は、配列とは団地みたいなものをイメージして下さい。

団地の0号室に「市民」が住んでいて、1号室に「霊媒師」が住んでいて・・・そんなイメージです。

普通の団地と異なるのは、0号室から始まることです。

#配列を定義
array=['市民','霊媒師','占い師','騎士','裏切り者','人狼']

#配列を出力
print(array)

出力結果です。

配列は0から始まるので、例えば「占い師」を表示させたい場合は、array[2]になります。

#配列を定義
array=['市民','霊媒師','占い師','騎士','裏切り者','人狼']

#配列を出力
print(array[2])

次の項目では、先ほどのループと配列を合わせた、プログラミングでは使用頻度の高いコードを掲載します。


ループを使って、配列の中身を取り出します。
通常の表記と、内包表記を併記します。

#配列を定義
array=['市民','霊媒師','占い師','騎士','裏切り者','人狼']

#Forループで配列の出力
for role in array:
 print(role)
 
#内包表記
[print(role) for role in array]

実行結果です。

この記事ではここまでで、Pythonの入門〜関数までの総復習が出来たと思います。

もっと詳しく勉強したい方は、下記の学習コンテンツがオススメです。
いきなり本を買っても良いのですが、出来れば動画学習コンテンツで多少知識を入れてからの方が、本当に必要なお買い物が出来ると思います。

本も紹介させて頂きます。


初めてのプログラミング学習では、やはり講師の説明を聞きながら動画を見て、それを自分のPCで動かして試してみる・・・という方法がハードルが低いので、オススメの学習コンテンツを2つ紹介します。

どっちが良いのか迷われた方は、両方の無料レッスンを受けてみて、自分に合いそうな方を取り入れて下さい。

ドットインストール
paizaラーニング

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

長々と書いてしまいましたが、本当に読んで下さって有難うございます。
大変、お疲れ様でした。


ブレイクタイムPhotoは・・・

遊歩道の桜

地元の遊歩道の桜並木です。


Python自作サンプルに戻る
写真クリエイターとしての活動

自己紹介

【Python_立体図形】関数を使いこなして立体図形(立方体・直方体・円柱・三角錐・四角錐・円錐)の体積を求める

この記事を読むことで、

・関数で立体図形の体積を算出

・Pythonでの累乗(二乗、三乗)などの書き方

・ドリルの様に演習してPythonの関数に慣れる

についての概要が掴めます。


立方体についてですが、例えばサイコロも立方体です。
体積の求め方は、縦、横、高さをそのままかけた値です。

立方体は縦、横、高さの全てが同じ長さです。
今回は3cmの立方体の体積を求めます。

まず、辺の長さをここで定義しています。

side=3

次に関数を呼び出します。

volume=cube(side)

立方体の体積を求めるcube関数が引数にside(今回は3cm)で呼び出されました。

では、cube関数のコードです。

#立方体の体積を計算する関数
def cube(x):
    return x**3

このxの所に3が入って3乗の計算結果をreturnで返しています。
二乗でも考え方は同じですが、三乗ではこのように書いています。

x**3

それが戻り値としてvolumeに入ります。

volume=cube(side)

ここまでのコードと実行結果です。

#立方体の体積を計算する関数
def cube(x):
  return x**3

#辺の長さを定義
side=3

#関数を呼び出し
volume=cube(side)

#立方体の体積を表示
print('立方体の体積は【'+str(volume)+'】cm^3です。')


では次に、直方体の体積を求めます。

直方体の体積は、タテ×ヨコ×高さなので、この様にコードを書き換えました。
関数の名前を図形ごとに変えるのは手間ですので、これ以降「figure3d」という名称に致しました。

コードと実行結果です。

#直方体の体積を計算する関数
def figure3d(x,y,z):
  return x*y*z

#タテ、ヨコ、高さの辺の長さを定義
vertical=3
beside=5
height=7


#関数を呼び出し
volume=figure3d(vertical,beside,height)

#直方体の体積を表示
print('直方体の体積は【'+str(volume)+'】cm^3です。')

底面積である三角形の面積に高さをかけて3で割っています。

ここではタテ4cm、ヨコ5cm、高さ6cmとしています。
また、底面積が三角形であることと何々錐で3で割っているため、整数で求めています。
コードと実行結果です。

#三角錐の体積を計算する関数
def figure3d(x,y,z):
  return x*y/2*z/3

#タテ、ヨコ、高さを定義
vertical=4
beside=5
height=6


#関数を呼び出し
volume=figure3d(vertical,beside,height)

#三角錐の体積を表示
print('三角錐の体積は【'+str(int(volume))+'】cm^3です。')


次に四角錐(ピラミッド型)の体積を求めます。
こちらは、タテ5cm、ヨコ5cm、高さ6cmとしています。

#四角錐(ピラミッド)の体積を計算する関数
def figure3d(x,y,z):
  return x*y*z/3

#タテ、ヨコ、高さを定義
vertical=5
beside=5
height=6


#関数を呼び出し
volume=figure3d(vertical,beside,height)


#四角錐の体積を表示
print('四角錐(ピラミッド形)の体積は【'+str(int(volume))+'】cm^3です。')


円柱の体積は、円の面積に高さをかけて求めるので、円周率πを使うため、mathモジュールをインポートしました。
また、円周率は桁数が長いので、小数点以下3桁まで求める様にしました。

ここではこの記事に合わせて、円の半径を5cm、円柱の高さを10cmとしています。

#円周率πを使うため、mathモジュールをインポートする
import math

#円柱の体積を計算する関数
def figure3d(r,h):
  return math.pi*r**2*h

#半径と高さを定義
radius=5
height=10


#関数を呼び出し
volume=figure3d(radius,height)

#小数点以下3桁まで求める
volume=round(volume,3)

#円柱の体積を表示
print('円柱の体積は【'+str(volume)+'】cm^3です。')


最後に円錐(道路などにあるコーン)の体積を求めます。

底円の面積に高さをかけて3で割ると求められます。
円周率πを使うので、mathモジュールをインポートしています。
ここでは半径を4cm、高さを6cmとしています。

#円周率を使うため、mathモジュールをインポートする
import math


#円錐の体積を計算する関数
def figure3d(r,h):
  return math.pi*r**2*h/3

#半径と高さを定義
radius=4
height=6


#関数を呼び出し
volume=figure3d(radius,height)

#小数点以下3桁まで求める
volume=round(volume,3)

#円錐の体積を表示
print('円錐(コーン形)の体積は【'+str(volume)+'】cm^3です。')


お疲れ様でした。ブレイクタイムPhotoは、

稲村ヶ崎海岸です。江ノ電で行きました。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【Python関数で長方形、三角形、台形】関数を「カレーライス」に例えて、平面図形の面積を求める

この記事を読むことで、

Pythonの関数をカレーライスを作る例を通して理解

簡単な平面図形の面積が求められる

についての概要が掴めます。

関数とは、ざっくり言って、「カレー鍋」です。
鍋に入れる「ジャガイモ、ニンジン」が引数、出てきた料理が戻り値です。

それでは、肩の力を抜いて、長方形、三角形、台形の面積を使いながら関数に慣れて行きましょう!


最初に、縦5cm、横3cmの長方形の面積を計算します。
コードと実行結果を載せます。

#長方形の面積を計算する関数
def rectangle(x,y):
  return x*y

#長方形の縦と横の長さを設定
vertical=5
beside=3

#長方形の面積を計算する関数を呼び出して戻り値をareaとする
area=rectangle(vertical,beside)

print('長方形の面積は【'+str(area)+'】cm^2+です。')

では、簡単ですが、このプログラムをトレースしてみます。
長方形面積は、「縦×横」ですね。

変数verticalに縦の長さをここでは「5」、変数besideに横の長さをここでは「3」とします。

長方形はrectangleなので、長方形を計算する関数をrectangleとしました。
ですので、カレー鍋がrectangleになります。

area=rectangle(vertical,beside)

これで、rectangleというカレー鍋に、ジャガイモのverticalと、ニンジンのbesideが入って煮込みます。

def rectangle(x,y): 
 return x*y

鍋に入れるときに、verticalはx、besideはyに入ります。

verticalやbesideが引数と呼ばれることに対し、x,yは仮引数と呼ばれます。

return x*y

で、出来上がったカレーライスがお手元に届けられます。

コードの縦verticalと横besideの値を変えると、当然求まってくる長方形の面積も変わりますので、コードを書き換えてみます。

縦8cm、横11cmにしてみます。

#長方形の面積を計算する関数
def rectangle(x,y):
  return x*y

#長方形の縦と横の長さを設定←ここの長さを変える
vertical=8
beside=11

#長方形の面積を計算する関数を呼び出して戻り値をareaとする
area=rectangle(vertical,beside)

print('長方形の面積は【'+str(area)+'】cm^2+です。')

ここで変数や関数名のことですが、基本的に英語にしますので、ローマ字でtate、yoko,chouhoukeiとは書かずに、縦(vertical)や横(beside)や長方形(rectangle)という名前にします。

英語が苦手でも今はGoogle翻訳なども使えるので、変数名を決める時の参考にしています。


今度は三角形を求められるようにコードを改変してみます。
関数の戻り値のところを2で割ると、お馴染みの公式、底辺×高さ÷2ですね。
割り算をしているので、int関数を使って整数値を求めています。

#三角形の面積を計算する関数
def triangle(x,y):
  return int(x*y/2)

#三角形の底辺と高さ
bottom=4
height=3

#三角形の面積を計算する関数を呼び出して戻り値をareaとする
area=triangle(bottom,height)

print('三角形の面積は【'+str(area)+'】cm^2+です。')

実行結果です。


最後に台形を求めるプログラムに変更致します。
台形(trapezoid)は、

(上底+下底)×高さ÷2

で求められます。

上底を5cm、下底を7cm、高さを4cmをします。
コードと実行結果です。

#台形の面積を計算する関数
def trapezoid(x,y,z):
  return int((x+y)*z/2)

#台形の上底と下底と高さ
top_side=5
bottom_side=7
height=4

#台形の面積を計算する関数を呼び出して戻り値をareaとする
area=trapezoid(top_side,bottom_side,height)

print('台形の面積は【'+str(area)+'】cm^2+です。')


関数って最初は面倒でしたが、慣れるととても便利です。
各機能が分かりやすくなって、コードも見やすくなります。

ざっとまとめると、関数がカレー鍋、引数がジャガイモやニンジン、戻り値が出来上がったカレーです。

お疲れ様でした。ブレイクタイムPhotoは、

しながわ花海道に咲いていた、アオイ科のムクゲです。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【Python_円周率】円の面積、球体の体積、円周を計算する関数の使い方、二乗3乗などの累乗の計算の仕方、戻り値の小数点以下桁指定

この記事を読むことで、

・Pythonの二乗・3乗などの累乗の計算

・円周率を使った計算で円の面積を求める関数

・球の体積を求める関数

・円周を求める関数

・小数点以下を含めた桁の指定



の概要が掴めます。

用意する関数は、

・円の面積を求める関数area(引数:半径r)
・球の体積を関数globe(引数:半径r)
・円周を求めるcircle(引数:半径r)

です。

今回は引数の半径rは共通なので、それぞれの関数呼び出しの前に、ここでは半径rを5cmとしているので、

r=5

を記述しました。

それぞれの関数の呼び出しのコードです。
上から、円の面積、球の体積、円周の長さです。

#それぞれの関数の呼び出し
area_ans=(area(r))   #円
globe_ans=(globe(r)) #球
circle_ans=circle(r) #円周

上記の3つの関数を呼び出して、そこで計算した値(戻り値)をそれぞれ

area_ans(求めた円の面積)
globe_ans(求めた球の体積)
circle_ans(求めた円周の長さ)

に代入して、小数点以下も含めた桁指定をして、結果を表示します。

円周率を扱うのに、モジュールをインポートしています。

#円周率を扱うのに、インポートしている
import math

円の面積を計算するのに、事情はr**2で半径の二乗を求めています。
**の後を3にする球体や立方体など3次元の体積が求められます。

#円の面積を計算。**で二乗を使っている
def area(r):
    return r**2*math.pi

円周率はご存知の通り、3.14159265359…と桁数が膨大なので、戻り値の表示はここでは整数も含めた5桁で表示します。
コードはこの様になります。

#桁数を指定して表示
print('円の面積は'+'{:.5}'.format(area_ans)+'cm ^2です。')
print('球の体積は'+'{:.5}'.format(globe_ans)+'cm ^3です。')
print('円周は、'+'{:.5}'.format(circle_ans)+'cmです。')

では、まずは円の面積を求めます。
コードと実行結果です。

import math

#円の面積を計算。**で二乗を使っている
def area(r):
  return math.pi*r**2

#半径
r=5
area_ans=area(r)


#桁数を指定して表示
print('円の面積は'+'{:.5}'.format(area_ans)+'cm ^2です。')


次に球の体積を求めます。
公式は、

V=\frac{4}{3}πr^{3}

ですので、体積を計算する関数のコードは、

#球の体積を計算。**で3乗を使っている
def globe(r):
    return 4/3*math.pi*r**3

となります。

コードと実行結果です。

import math

#円の面積を計算。**で二乗を使っている
def area(r):
  return math.pi*r**2

#球の体積を計算。**で3乗を使っている
def globe(r):
    return 4/3*math.pi*r**3


#半径
r=5

#関数を呼び出し
area_ans=area(r)#円の面積
globe_ans=globe(r)#球の体積

print()

#桁数を指定して表示
print(' 円の面積は'+'{:.5}'.format(area_ans)+'cm ^2です。\n')
print(' 球の体積は'+'{:.5}'.format(globe_ans)+'cm ^3です。\n')

結果表示のprint文の最後の改行は、「\n」を使っています。
macをお使いの方は、[option]+[¥]で「バックスラッシュ」が表示されます。


最後に円周の長さを求めます。

#円周を求める
def circle(r):
    return 2*math.pi*r

コードと実行結果です。

import math

#円の面積を計算。**で二乗を使っている
def area(r):
  return math.pi*r**2

#球の体積を計算。**で3乗を使っている
def globe(r):
    return 4/3*math.pi*r**3

#円周を求める
def circle(r):
    return 2*math.pi*r


#半径
r=5

#関数を呼び出し
area_ans=area(r)#円の面積
globe_ans=globe(r)#球の体積
circle_ans=circle(r)#円周の長さ

print()

#桁数を指定して表示
print(' 円の面積は'+'{:.5}'.format(area_ans)+'cm ^2です。\n')
print(' 球の体積は'+'{:.5}'.format(globe_ans)+'cm ^3です。\n')
print(' 円周は、'+'{:.5}'.format(circle_ans)+'cmです。\n')


お疲れ様でした。ブレイクタイムPhotoは、

スカイツリーからの眺めです。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【Python関数でジャンケンゲーム】乱数の扱い方など

この記事を読むことで、

・乱数を使った簡単なじゃんけんゲームが作れる

・標準入力


・論理演算子 OR

・IF文を使った勝敗分岐の復習

についての概要が掴めます。

ルールとして、
1:グー 2:チョキ 3:パー で、変数youに半角数字で標準入力を使って入力をします。

コンピューターは、1〜3までの乱数を求めて変数pcに代入します。
乱数の算出と表示をするコードはこちらになります。

#乱数を使う為、ランダムモジュールをインポートする
import random

#乱数pcの範囲を1から3までとする
pc=random.randint(1, 3)
print(pc)

これで乱数が求まりました。

次に、あなたの手を標準入力します。

#標準入力で、あなたの出す手を決める
print("じゃんけんの手を半角数字で「1:グー  2:チョキ  3:パー」 >>>",end="")
you=int(input())

これで、半角で数値が入力出来るようになり、1から3までがそれぞれジャンケンの手に対応しています。

勝敗の判定をIF文で行っています。

#勝敗の判定
if you == pc:
    msg="あいこです。"
elif you == pc -1 or you == pc +2:
    msg="YOU WIN!!!!!!"
else:
    msg="YOU LOSE...."

print(msg)

まず、一番簡単なのが「あいこ」の時なので、最初に書きます。
次にあなたがコンピューターに勝つ場合は、

・グー(1) VS チョキ(2)…. youはpcより1小さい

・チョキ(2) VS パー(3)…. youはpcより1小さい

・パー(3) VS グー(1) …. youはpcより2大きい

の場合です。

つまり、youがpcよりも1小さいか、2大きい時にあなたの勝ちとなります。
または、に当たりますので、IF文の中でORを使っています。

ここまでのコードをまとめてみます。

#乱数を使う為、ランダムモジュールをインポートする
import random

#乱数pcの範囲を1から3までとする
pc=random.randint(1, 3)
print(pc)

#標準入力で、あなたの出す手を決める
print("じゃんけんの手を半角数字で「1:グー  2:チョキ  3:パー」 >>>",end="")
you=int(input())


#勝敗の判定
if you == pc:
    msg="あいこです。"
elif you == pc -1 or you == pc +2:
    msg="YOU WIN!!!!!!"
else:
    msg="YOU LOSE...."

print(msg)

ここからは、このジャンケンの部分を関数にしていきます。
コンピュータが出す手の乱数とその手の表示、勝敗分岐まで関数に記述しました。

関数Comuter_Handの仮引数youは、標準入力であなたが入力した1〜3までの半角英数字が入ります。

#コンピューターの出す手の関数
def Computer_Hand(you):

  #乱数pcの範囲を1から3までとする
  pc=random.randint(1, 3)
  print(pc)

  #コンピューターの出した手
  if pc==1:
    print("PC:グー") 
  elif pc==2:
    print("PC:チョキ")
  else:
    print("PC:パー")

  #勝敗の判定
  if you == pc:
    msg="あいこです。"
  elif you == pc -1 or you == pc +2:
    msg="YOU WIN!!!!!!"
  else:
    msg="YOU LOSE...."
  return msg

この関数を呼び出すのは、あなたが標準入力でジャンケンの手を入れてからです。
戻り値として勝敗結果のmsgを呼び出し元に返します。

#標準入力で、あなたの出す手を決める
print("じゃんけんの手を半角数字で「1:グー  2:チョキ  3:パー」 >>>",end="")
you=int(input())

judge=Computer_Hand(you)

関数Computer _Handの引数をyouとして呼び出しています。
戻り値として帰ってきた勝敗結果がjudgeに代入されます。


ジャンケンコードの全体と実行結果です。

#乱数を使う為、ランダムモジュールをインポートする
import random

#コンピューターの出す手の関数
def Computer_Hand(you):

  #乱数pcの範囲を1から3までとする
  pc=random.randint(1, 3)
  print(pc)

  #コンピューターの出した手
  if pc==1:
    print("PC:グー") 
  elif pc==2:
    print("PC:チョキ")
  else:
    print("PC:パー")

  #勝敗の判定
  if you == pc:
    msg="あいこです。"
  elif you == pc -1 or you == pc +2:
    msg="YOU WIN!!!!!!"
  else:
    msg="YOU LOSE...."
  return msg


#標準入力で、あなたの出す手を決める
print(" じゃんけんの手を半角数字で「1:グー  2:チョキ  3:パー」 >>>",end="")
you=int(input())

judge=Computer_Hand(you)
print(judge)


いきなり負けました(笑)

今度こそは!!

やった、勝った♪

最後はあいこで。


お疲れ様でした。ブレイクタイムPhotoは、

東京モノレールです。
羽田空港第二ターミナルまで行きます。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【Pythonで割り算ゲームと関数】Adoさんの半端ならK.O…「踊♪」で剰余演算子を習得

この記事を読むことで

・割り算を使った簡単なゲームの作成

・関数と剰余演算子の使い方

・IF文による割り算の結果と勝敗の分岐

・標準入力の使い方

についての概要が掴めます。

割り算ゲームの題材として、歌い手のAdoさんの「踊」の歌詞を用います。
半端(=割り切れない時)ならK.O.されちゃいます(笑)


半端、つまり、割り算をして割り切れなかったら負け、割り切れたら勝ちという割り算ゲームを格闘ゲームをイメージして作りました。
余りが0で割り切れたなら勝ち、余りが出たら負けです。

ここで被除数(割られる数)を「9」とします。
変数は「dividend」を用います。

次に除数(割る数)を「2」とします。
変数は「divisor」を用います。

余りの変数を「remainder」とします。
ここで剰余演算子「%」を使用します。

#計算結果から余りを算出
remainder=dividend % divisor


余りは1になり、勝負は「負け」です。

勝敗結果の「負け」を変数「msg」に代入します。

#dividendは被除数(割られる数)
dividend=9

#divisorは除数(割る数)
divisor=2

#計算結果から余りを算出
remainder=dividend % divisor

#割り切れるかどうかの判定
if remainder==0:
  msg="YOU WIN!!!!!!!!!!!!!!!!!!!\n"
else:
  msg="YOU LOSE.....\n"

print(msg)

実行結果です。

あー、負けちゃいましたね。
では、

ここで被除数(割られる数)の変数「dividend」を「8」、
次に除数(割る数)の変数「divisor」を「4」とします。

今度は余り「remainder」が0になるので、msgには「勝利」のメッセージが代入されます。

そのコードと実行結果です。

#dividendは被除数(割られる数)
dividend=8 # ←変更

#divisorは除数(割る数)
divisor=4 # ←変更

#計算結果から余りを算出
remainder=dividend % divisor

#割り切れるかどうかの判定
if remainder==0:
  msg="YOU WIN!!!!!!!!!!!!!!!!!!!\n"
else:
  msg="YOU LOSE.....\n"

print(msg)


今度は、標準入力を使って、自在に数を指定出来るように致します。

#dividendは被除数(割られる数)を入力
print("dividend被除数(割られる数)を入力して下さい>>>",end='')
dividend=int(input()) # ←標準入力に

コードと実行結果です。
標準入力で指定して、12を4で割っているので、この勝負は勝ちです!

print('♪ 半端ならK.O......\n') #まずは歌って♪

#dividendは被除数(割られる数)を入力
print("dividend被除数(割られる数)を入力して下さい>>>",end='')
dividend=int(input()) # ←標準入力に

#divisorは除数(割る数)
print("divisor除数(割る数)を入力して下さい>>>",end='')
divisor=int(input()) # ←標準入力に

#計算結果から余りを算出
remainder=dividend % divisor

#割り切れるかどうかの判定
if remainder==0:
  msg="YOU WIN!!!!!!!!!!!!!!!!!!!\n"
else:
  msg="YOU LOSE.....\n"

print(msg)

細かい修正ですが、割られる数、割る数、余りを表示させます。
その実行結果です。

print('♪ 半端ならK.O......\n') #まずは歌って♪

#dividendは被除数(割られる数)を入力
print("dividend被除数(割られる数)を入力して下さい>>>",end='')
dividend=int(input()) # ←標準入力に

#divisorは除数(割る数)
print("divisor除数(割る数)を入力して下さい>>>",end='')
divisor=int(input()) # ←標準入力に

#計算結果から余りを算出
remainder=dividend % divisor

print("被除数(割られる数)="+str(dividend))
print("割る数="+str(divisor)+"\n")
print("余り【"+str(remainder)+"】\n")


#割り切れるかどうかの判定
if remainder==0:
  msg="YOU WIN!!!!!!!!!!!!!!!!!!!\n"
else:
  msg="YOU LOSE.....\n"

print(" 果たして勝負の結果は・・・・\n"+msg)

割り切れませんので、余り、半端なのでK.O.されて負けました。


次に、ここまで書いたコードを関数を使ってみます。
標準入力で割られる数、割る数を入力して、それらを引数として関数「dance_div」を呼び出します。

呼び出された「dance_div」の中で仮引数として、割られる数「x」と割る数「y」が入ります。
計算をして数を表示します。
余りによる分岐をして、勝敗結果の変数msgを戻り値として呼び出し元に戻します。

呼び出し元では変数「judgment」に代入します。

関数の部分です。

#割り算してあまりを返す関数
def dance_div(x,y):
  #計算結果から余りを算出
  remainder=x % y

  print(" 被除数(割られる数)="+str(x))
  print(" 割る数="+str(y)+"\n")
  print(" 余り【"+str(remainder)+"】\n")

  #割り切れるかどうかの判定
  if remainder==0:
    msg=" YOU WIN!!!!!!!!!!!!!!!!!!!\n"
  else:
    msg=" YOU LOSE.....\n"
  
  #関数の呼び出し元に代入する
  return msg    

コードと実行結果です。

print('♪ 半端ならK.O......\n') #まずは歌って♪

#割り算してあまりを返す関数
def dance_div(x,y):
  #計算結果から余りを算出
  remainder=x % y

  print("被除数(割られる数)="+str(x))
  print("割る数="+str(y)+"\n")
  print("余り【"+str(remainder)+"】\n")

  #割り切れるかどうかの判定
  if remainder==0:
    msg="YOU WIN!!!!!!!!!!!!!!!!!!!\n"
  else:
    msg="YOU LOSE.....\n"
  
  #関数の呼び出し元に代入する
  return msg    


#dividendは被除数(割られる数)を入力
print("dividend被除数(割られる数)を入力して下さい>>>",end='')
dividend=int(input()) 

#divisorは除数(割る数)
print("divisor除数(割る数)を入力して下さい>>>",end='')
divisor=int(input())

#関数を呼び出して勝敗結果を「judgment」に代入
judgment=dance_div(dividend, divisor)


print("果たして勝負の結果は・・・・\n"+judgment)


お疲れ様でした。ブレイクタイムPhotoは、

コスモスの花です。
しながわ花海道で撮影しました。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【Python関数とデフォルト値】正義のヒーロー「変なおじさん」

この記事を読むことで、

・Pythonの関数で引数に何も指定しない時は、決まった値(デフォルト値)を与える

・関数を複数呼び出して挙動の違いを確認する

といったことの概要が掴める様になります。

今回のコードの具体例として、引数に何も指定しないと「会社員」と表示されます。

例えば引数に「サトウ」さんだけを指定して、職業の所に何も入れないと「サトウさんは会社員です。」と表示されます。

引数の名前の所に「志村けん」さん、引数の職業の所に「変なおじさん」と指定すると、「志村さんは変なおじさんです。」と表示されるプログラムを作りました。

だっふんだ!!

余り上手くないので、似顔絵では無く落書きです。

早速ですが、コードと実行結果を掲載します。
関数Workの所で、デフォルト値の「会社員」を設定しています。

#デフォルト値を指定した関数のWork
def Work(name,job='会社員'):
  print("【"+name+"】さんは【"+job+"】です。")

#関数を色々な例で呼び出し
Work("サトウ")
Work("ヤマダ")
Work("坂本龍馬","幕末の土佐藩士")
Work("ヒガ")
Work("志村けん","変なおじさん")
Work("シマブクロ")
Work("両津勘吉","警察官")

サトウさん、ヤマダさん、ヒガさん、シマブクロさんは、関数Workに名前だけを引数に指定して、職業はデフォルト値の「会社員」と表示されました。

それに対して、坂本龍馬さん、志村けんさん、両津勘吉さん(こちら葛飾区亀有公園前派出所、通称こち亀の両さん)には名前に加えてそれぞれの職業の引数を指定しているので、「幕末の土佐藩士」、「変なおじさん」、「警察官」と表示されたことが確認できました。


突然ですが、皆さまには子供の頃、ヒーローはいましたか?
私のヒーローは志村けんさんで、良く学校で「だいじょぶだぁ」や「変なおじさん」のモノマネをしていて、将来の夢は「変なおじさんになること」でした。
今でも志村けんさんは、私にとって永遠にヒーローです。

全力でバカ殿や変なおじさんなどのギャグをやって下さった姿は、今でも忘れられません。

そこで、プログラミングを学ぶものとして追悼の思いも込めて、Pythonの関数、デフォルト値を使って、変なおじさんを表示してみました。

最後に「バカ殿」のイラストで締めたいと思います。
バカ殿が五郎丸選手のルーティーンをやっていた姿も面白かったです。


お疲れ様でした。ブレイクタイムPhotoは、

ちょっと怖可愛い、マクセルアクアパーク品川の、ノコギリエイです。
なんだチミはぁぁぁぁって感じのエイですね(笑)

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【PythonのIF文】関西人度と関東人度診断をチェック

この記事を読むことで、

・IF文

・標準入力


・比較演算子


・関数

の練習になります。

例として「関西人度、関東人度」診断を用います。

標準入力や比較演算子を使い、あなたの関東人ポイントがいくつで、関西人ポイントがいくつで、どちらが多いか比較して【関東人】または【関西人】を判定します。

コードのメンテナンス目的で関数の基本的な説明も掲載しました。

参考にした診断はコチラです。
あなたが「関東人」か「関西人」かを見極める10の質問 隠しても無駄だぞ!!

こちらをヒントにしてPythonでアレンジしてみました。

まず、私(東京都出身)がやってみたコチラの診断結果です。

この診断をPythonでプログラミングしてみました。
質問には半角の1か2を入れて回答するので標準入力を用います。
標準入力で数字を扱う場合は、このように記述します。

#標準入力で数字を入れる
ans=int(input())

これで、ansに標準入力で1または2の解答を入力します。
それでは、1つ分の診断プログラムを作成致します。

#関東人・関西人の質問
print("あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#関東人・関西人の分岐処理
if ans==1:
  print("あなたは【関東人】です。")
elif ans==2:
  print("あなたは【関西人】です。")
else:
  print("半角数値の1か2を押して下さい。")

質問の部分のprint文に使われている「\n」は改行はです。
「\」のバックスラッシュは、macの場合は「option」+「¥」です。

また、

if ans==1:

と「==」としているのは、「=」一つだけだと代入になってしまうので、ansが1と等しいか判定する際には、「==」とイコールを2つ並べて書きます。

このコードでは、「あなたが道を教える時は?」と言う質問に対して、
「1:この横断歩道を渡って・・・」と答えるか、
「2:そこをガ〜〜〜〜って行って・・・」と答えるかで処理が分岐されます。
1または2の該当する方を選びますが、それ以外の回答を選んだ場合のメッセージも表示されています。

1を選んだ場合

2を選んだ場合

それ以外(999)などを押してしまった場合

質問が1つだけだと本当に関東人か関西人か分かりづらいので、関東に該当する答えを選んだ場合は、関東人ポイント(eastPoint)が加算され、関西に該当する答えを選んだ場合は、関西人ポイント(westPoint)が加算され、どちらが多いか比較するプログラムに改良してみます。

まず、この部分で各ポイントを0で初期化します。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0

また、「+=」と、加算代入演算子で使って加えています。

if ans==1:
  eastPoint+=1

また、トータルで関東人ポイントと関西人ポイントのどちらが多いかの計算結果による判定のコードはこちらになります。
同じ場合は「ハイブリッド」にしました。

#関東人か関西人かの判定
if eastPoint>westPoint:
  msg="\nあなたは【関東人】です。"
elif westPoint>eastPoint:
  msg="\nあなたは【関西人】です。"
else:
  msg="\nあなたは【ハイブリット】です。"

関東人か関西人かハイブリットかを変数msgに入れて、最後にprint文で出力することにより、printと書く分量を節約でき、コードが簡潔になりました。

それでは、質問1と質問2までのコードを掲載致します。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0


#質問1
print("質問1:あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint+=1
elif ans==2:
  westPoint+=1
else:
  print("半角数値の1か2を押して下さい。")


#質問2
print("\n質問2:納豆は?")
print("1:「くさい!!!」\n2:「美味しい」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  westPoint+=1
elif ans==2:
  eastPoint+=1
else:
  print("半角数値の1か2を押して下さい。")

#関東人か関西人かの判定
if eastPoint>westPoint:
  msg="\nあなたは【関東人】です。"
elif westPoint>eastPoint:
  msg="\nあなたは【関西人】です。"
else:
  msg="\nあなたは【ハイブリット】です。"


print("あなたは"+msg+"\nあなたのeastPointは「"+str(eastPoint)+"」、westPointは「"+str(westPoint)+"」でした。")

関東人の場合の実行結果

関西人の場合の実行結果

ハイブリットの場合の実行結果

これでもプログラムは動くのですが、このコードをじっくりと眺めてみて、ちょっと冗長な部分がございました。

例えば、

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint+=1
elif ans==2:
  westPoint+=1
else:
  print("半角数値の1か2を押して下さい。")

と、それぞれのポイントを加算している箇所がございます。

今は質問が2つだけですが、今後質問が増える時にちょっとコードの量が多いので、ここの部分を関数にして見ました。加算するポイントを引数にして、関数add_pointで加算処理をしています。

#ポイントを加算
def addPoint(x):
  return x+1

xの中に加算するポイント(eastPointまたはwestPoint)を入れて、returnで1加えた値を戻り値としています。

呼び出し元です。

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint=addPoint(eastPoint)
elif ans==2:
  westPoint=addPoint(westPoint)

また、1か2以外の数字を入れた場合は、関数otherを定義しました。

#半角の1,2以外が押されてしまった場合
def other():
  print("半角数値の1か2を押して下さい。")

呼び出し元です。
(elseの所)

else:
  other()

更に、関東か関西か分岐をする処理の箇所で、この部分を関数judgeとして定義しました。

#判定
def judge(e,w):
  if e>w:
    return "\nあなたは【関東人】です。"
  elif w>e:
    return "\nあなたは【関西人】です。"
  else:
    return "\nあなたは【ハイブリット】です。"

判定の呼び出し元です。

#関東人か関西人かの判定
msg=judge(eastPoint,westPoint)

関数judgeを呼び出す際に引数として、eastPointとwestPointを入れて、戻り値としてmsgにポイントが多い方の文字列が入る様にしました。

流れとして、呼び出し元のeastPointが関数judgeの仮引数のeに入り、呼び出し元のwestPointが関数judgeの仮引数のwに入って、関東、関西、ハイブリッドの判定をして、その文字列を戻り値として呼び出し元のmsgに入ります。

ここまでをまとめたコードがこちらになります。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0

#ポイントを加算
def addPoint(x):
  return x+1

#半角の1,2以外が押されてしまった場合
def other():
  print("半角数値の1か2を押して下さい。")

#判定
def judge(e,w):
  if e>w:
    return "\nあなたは【関東人】です。"
  elif w>e:
    return "\nあなたは【関西人】です。"
  else:
    return "\nあなたは【ハイブリット】です。"


#質問1
print("質問1:あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint=addPoint(eastPoint)
elif ans==2:
  westPoint=addPoint(westPoint)
else:
  other()


#質問2
print("\n質問2:納豆は?")
print("1:「くさい!!!」\n2:「美味しい」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  westPoint=addPoint(westPoint)
elif ans==2:
  eastPoint=addPoint(eastPoint)
else:
  other()


#関東人か関西人かの判定
msg=judge(eastPoint,westPoint)


print("あなたは"+msg+"\nあなたのeastPointは「"+str(eastPoint)+"」、westPointは「"+str(westPoint)+"」でした。")


お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会2025です。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介