日向坂46の2024年お正月「人狼ゲーム」でPythonの入門の入門のサンプルコードを作ってみました。

この記事では、2024年お正月に配信された、日向坂46の人狼ゲームの配信を元に、Pythonの入門の入門のサンプルコードを作ってみました。

こちらのYouTube動画です。

配信の感想は、アメブロの記事に、四期生の正源司 陽子(しょうげんじ・ようこ)さん推しの視点で書きました。

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

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

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

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

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

・↑記事に関数を導入

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

・人狼役職の配列表示

・配列とForループ

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

です。
それでは、宜しくお願いします(=^ェ^=)

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

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

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

ご存知の方には恐縮ですが、コメントは「#」を付けます。

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

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

実行結果はこちらです。

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

role='市民'

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

print(role)

実行結果です。

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

一方で、「==」は、等しいかどうかの判定を行います。

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号室に「霊媒師」が住んでいて・・・そんなイメージです。

#配列を定義
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ラーニング

長々と書いてしまいましたが、本当にご精読ありがとうございます。
大変、お疲れ様でした。

(一気に記事を書き上げたので、私も少し肩が凝ってきました 笑) ストレッチでもしようかな。)


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

地元の遊歩道の桜並木です。
私は東京の中でも、かなり辺鄙な所に住んでおります。
住めば都というように、写真の被写体としては面白い風景が至る所にあるので、写真を始めてから、「ここに住んでいて良かった」と思えてきました。

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

投稿者: nekosiestr

プログラミング学習中のロスジェネ(就職氷河期世代)の発達障害者です。 宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、その他双極性障害やHSP(5人に1人の繊細さん)などの生きづらさを抱えておりますが、それでも楽しく生きて行きたいです!! 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。

モバイルバージョンを終了