UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY 14 初級の機能をフル活用してハイローゲームをプログラミング!

DAY14は今までで習った機能を活用してハイローゲームをプログラミングする。

 

ハイローゲームとは、どちらの数値が高いかを応えて正解するごとにスコアアップするゲーム。

 

A: お金配りおじさん

B: きゃりーぱみゅぱみゅ

 

どっちのフォロワーが多い?

A!

みたいな感じ。

 

今回は1問応えたらBがAになって、Bに新しい質問が出てくる仕様にする。

2問目

A; きゃりーぱみゅぱみゅ

B: HIKAKIN

どっちのフォロワーが多い?

 

みたいなね。

 

素材はgame_data.pyというものが別にあり、

data = [
{
'name': 'Instagram',
'follower_count': 346,
'description': 'Social media platform',
'country': 'United States'
},...

 

 こんな感じで必要な情報がたくさんある。

 

 

 


それでは毎回のごとくゲームの流れを確認。

 

  1. 最初にAとB2つ分の比較するデータをリストからランダムに取得する。
  2. AとB、どちらのが大きいかを聞き、応えてもらう。
  3. AとBのフォロワー数を比較し、答えと大きいほうがあっていたら
    ゲームスコアを+1し、正解!スコア:1という出力をする。
    間違いなら不正解で最終スコア:1を出力してゲームストップ。
  4. 正解ならBをAに移動して、Bに新しいデータを取得して、再度続ける。

 

こんな感じ。

import game_data as datas
from random import choice

まずはゲーム素材とランダムをインポート。

 


def clear():
command = 'clear'
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
command = 'cls'
os.system(command)

def get_data():
return choice(datas.data)

次の質問に行く時は表示をクリアするのでクリアの機能も。

そしてランダムにデータを取得する機能も。

 

def game():
game_score = 0
compare1 = get_data()

 

ゲームそのものもファンクションに。

初期状態として、スコアと1番最初のデータだけは取得しておく。

(2回目以降はBがAになるのでwhileに入れる)

 

game_continue = True
while game_continue:
print(f"A: {compare1['name']}, {compare1['description']}, from {compare1['country']}, {compare1['follower_count']}")
compare2 = get_data()
while compare1 == compare2:
compare2 = get_data()
print(f"B: {compare2['name']}, {compare2['description']}, from {compare2['country']}, {compare2['follower_count']}")

answer = input("どちらのほうがフォロワー数多いでしょう? 'A' or 'B': ").upper()

 

続けて、ゲームが続くまで

Bのデータも取得し、AとBを表示してinputで答えてもらう。

途中にあるwhile compare1 == compare2のくだりは、

もし両方とも同じデータを取得した場合はドローになってしまうので
同じデータになった場合は違うデータになるまで取得しなおす、という動作にしています。

 

def compare(compare1, compare2):
if compare1 < compare2:
return "B"
else:
return "A"

 

game()のなかではなく上に追記します。

AとBを比較してどちらが正解かを吐き出すファンクション。

 

clear()
if answer == compare(compare1["follower_count"], compare2["follower_count"]):
game_score += 1
compare1 = compare2
print(f"正解! スコア:{game_score}")
else:
print(f"不正解 最終スコア: {game_score}")
if input("Do you wanna play again? y / n : ") == "n":
game_continue = False
else:
clear()
game_score = 0
compare1 = get_data()

 

答えを入力したら、先程のファンクションを使って

正解とプレイヤーの答えを比較。

 

同じであればスコアを1増やして

BをAに移動せさせ、続けます。

 

違っていればゲームオーバー。

追加機能としてもう一回やる?選択肢をいれています。

clear()を入れてコンソールをスッキリして続けています。

 


game()

 

最後に起動しておしまい。

 

全てのコードはこちら。

 

import art
import game_data as datas

from random import choice
import os

def clear():
command = 'clear'
if os.name in ('nt', 'dos'):
command = 'cls'
os.system(command)

def get_data():
return choice(datas.data)


def compare(compare1, compare2):
if compare1 < compare2:
return "B"
else:
return "A"

def game():
game_score = 0
compare1 = get_data()

game_continue = True
while game_continue:
print(f"A: {compare1['name']}, {compare1['description']}, from {compare1['country']}, {compare1['follower_count']}")
compare2 = get_data()
while compare1 == compare2:
compare2 = get_data()
print(f"B: {compare2['name']}, {compare2['description']}, from {compare2['country']}, {compare2['follower_count']}")

answer = input("どちらのほうがフォロワー数多いでしょう? 'A' or 'B': ").upper()
clear()
if answer == compare(compare1["follower_count"], compare2["follower_count"]):
game_score += 1
compare1 = compare2
print(art.logo)
print(f"正解! スコア:{game_score}")
else:
print(f"不正解 最終スコア: {game_score}")
if input("もう一回やりますか? y / n : ") == "n":
game_continue = False
else:
clear()
game_score = 0
print(art.logo)
compare1 = get_data()

game()

 

今回はお手本のコードでなく、自分で1からかけたコードを公開しています。

しっかり動いている!

 

成長しているなあとちょっと感じました。笑

Python : APIのデータ取得テンプレ

例:トリビアサイトからの質問データを毎回ランダムに10個、2択問題を抽出する場合

 

import requests
parameter = {
"amount" : 10,
"type" : "boolean",
}
response = requests.get(url="https://opentdb.com/api.php", params=parameter)
response.raise_for_status()
question_dict = response.json()
question_data = question_dict["results"]

print(question_data)

 

import requestsはPyCharmには標準でダウンロードされていないのでインストールする

response変数は任意。

 

APIサイトURLをget()にいれて、?以降のパラメーターはparamsで制御。

raise_for_status()でもし見つからなかった場合やエラーが起きた時教えてくれるようにする

ダウンロード形式は基本jsonなはず

最後にjsonから必要なデータを呼び出すためにリスト変数を呼び出す

 

ちゃんと出力されているかprint()で確認するのも大事。

 

 

・出力されたテキストがHTMLのエスケープ文字が入っていた場合

 

import html
q_text = html.unescape("questioin")

 

htmlモジュールをインポートして、エスケープ文字を戻すことで

読める文字に戻してくれる。

 

 

 

DAY 13 よくあるバグについて

今回はバグについて。

バグはプログラマーには絶対ついて回るものですが、

大事なのはバグを見つけた時、どこがエラーなのか

どこを直せばいいのかを知ること。

 

よくあるエラーをいくつか学ぶ。

 

1・randomなどのrange(1,20)などの設定

 

結構間違えやすいエラーで、この場合だと

if i == 20:

    print("finish")

 

 とつい書いちゃうけど、この場合はrange(1,20)は19までしか範囲に入らないので

注意。

 

でもrandom.randint(1,100)だと100も含まれるのでやっかい。

 

 

2・1、2回では正常だけど何回かやるとエラーになる場合

 

これもよくある、random使ってる時にほとんど大丈夫だったけど

一番最後とか一番最初選んだらエラーになっちゃうパターン。

 

3・比較する時の=のつけ忘れ

 

if i < 2000 and i > 1950:
print("....")

elif i > 2000:
print("....")

一見良さそうな感じだけど、i がちょうど2000の場合は

なにも出力されないエラーが起きる。

どちらかに=をつけてあげないと2000がカバーできない。

 

4・inputの結果が整数なのに文字列で出ちゃう

 

answer = input("何歳?")

if answer < 20:
print("未成年")

else:
print("大人")

 

答えを数字で欲しいけどこのままだとエラーになる。

inputはstrings なのでint()で囲ってあげないといけない。

 

5・エラーが出たらprintで確認してみる。

ながいプログラムを書いているとAがおかしいのはBの計算がおかしいから、という場合もあってエラーがわかりにくくなる。

 

そういう場合は怪しいところをprintでちゃんとその通りにいっているか確認するのが大事。

 

6・デバッガーソフトで確認するのもあり。

Thonnyというソフトは1つ1つをステップで動かしてくれる機能があるので便利だし、

python tutorというサイトにコードを入れると同じようにステップでわかりやすくpythonの動作の流れを見せてくれる。

pythontutor.com

 

7・どうしてもわからない場合は人に聞く・ググる

最終これ。

ja.stackoverflow.com

 

qiita.com

 

自分で見落としている部分を他の人が解決してくれる。

とても助かる。

 

以上でDAY13終わり。

 

DAY 12 : Scopeを学びつつ数字あてゲームをプログラミングする!

DAY12は数字当てゲームを作る。

 

その前にScopeについての勉強があって、

変数を定義する時、pythonではインデントされたものは

同じインデント部分以下でしか使えない。

例えば数字当てゲームのコードからいうと

 

import random
EASY = 5
HARD = 10

def select_mode():
mode = input("モードを選んでください。 easy or hard : ")
if mode == "easy":
return EASY
else:
return HARD

 

このEASYとHARDはインデントがないので全てのファンクションから引っ張ってこれるが、

mode =

の部分はselect_mode()の部分でしか基本的には使えない。

return modeにしたら結果は使えるけど、mode を変更することはできない。

 

そんな感じ。javascriptとか他の言語では使えたりする場合もあるけど、

気づかずに同じ変数で定義しちゃった時とかおかしくなるのでいい機能なのかもしれない。

 

 

数字あてゲームに入る。

 

1・1-100の数字をコンピューターがランダムで取得し、それを当てる。

 ・間違えていい回数を難易度として選べる。5回だとハード、10回だとイージー

 

2・回数をセットして、回数分数字を選べる。

 ・答えより高い場合は高い!低い場合は低い!とヒントを出す。

 ・残り回数を1減らす。

 

3・残り回数があるうちに数字をあてたら勝ち、あてられなかったら負け。

 

4・もう一回やるか聞く。

 

 

ではコーディングへ。

 

 

1・1-100の数字をコンピューターがランダムで取得し、それを当てる。

 ・間違えていい回数を難易度として選べる。5回だとハード、10回だとイージー

 

import random
EASY = 5
HARD = 10

def select_mode():
mode = input("モードを選んでください。 easy or hard : ")
if mode == "easy":
return EASY
else:
return HARD

answer = random.randint(1, 100)

 

easyを入力したら EASY、5が返ってきて、

それ以外だとHARD、10にする。

このEASYとHARDは簡単に変えていい部分としてトップにもってきている。

 

answerはrandomをインポートして整数をランダムで取得。

 

次。

 

2・回数をセットして、回数分数字を選べる。

 ・答えより高い場合は高い!低い場合は低い!とヒントを出す。

 ・残り回数を1減らす。

 

print("数字当てゲームへようこそ。!\n"
"1~100の中からこちらが用意した数字を当ててください。")
mode_num = int(select_mode())
print(f"あなたは {mode_num} 回解答できます。")

 

mode_numはselect_modeで返された5、または10をintで数値として変換してから

使う。

 

for n in range(mode_num):
print(f"残り {mode_num} ")
guess = int(input("数字を予測してください。: "))
if guess < answer:
print("低い!")
mode_num -= 1
elif guess > answer:
print("高い!")
mode_num -= 1
elif guess == answer:
print("正解!")
break

 

mode_num = 5 なので、5回分をfor で回す。

そのうちで正解したら、breakでfor を停止する。

 

 


3・残り回数があるうちに数字をあてたら勝ち、あてられなかったら負け。

if mode_num > 0:
print("あなたの勝ち!")
else:
print("あなたの負け!")

 

forが終わった時点で残り回数が0以上なら勝ち、0なら負けと出力。

 

 


4・もう一回やるか聞く。

数字当てゲームへようこそ…からあなたの負け!までを

def game():

としてファンクションにして、whileで全体を回すようにする。


is_over = True
while is_over:
game()
if input("もう一回する? y / n : ") == "n":
is_over = False

 

ソース全体はこちら。

 

import random
EASY = 5
HARD = 10

def select_mode():
mode = input("モードを選んでください。 easy or hard : ")
if mode == "easy":
return EASY
else:
return HARD

def game():
print("数字当てゲームへようこそ。!\n"
"1~100の中からこちらが用意した数字を当ててください。")
answer = random.randint(1, 100)
mode_num = int(select_mode())
print(f"あなたは {mode_num} 回解答できます。")

for n in range(mode_num):
print(f"残り {mode_num} ")
guess = int(input("数字を予測してください。: "))
if guess < answer:
print("低い!")
mode_num -= 1
elif guess > answer:
print("高い!")
mode_num -= 1
elif guess == answer:
print("正解!")
break

if mode_num > 0:
print("あなたの勝ち!")
else:
print("あなたの負け!")


is_over = True
while is_over:
game()
if input("もう一回する? y / n : ") == "n":
is_over = False

 

この日は復習は自分で全て書けた。上達。

(数字あてのfor部分は先生はwhileで回していたり比較部分もdefにしていたけど)

DAY 11: ブラックジャックゲームをプログラミングする!

11日目の勉強はブラックジャックのゲームをPythonで再現する。

 

まずはブラックジャックのゲーム内容をおさらい。

今回はディーラーvsプレイヤーの2人だけの対決。

 

1・まずゲームをしますか?という質問。はいならゲーム開始。いいえならbreak。

2・ゲーム開始でカードがランダムでプレイヤーに配られる。

  ディーラーには1枚配られて見えるようになる。

 ・カードは数字を足すのでJ,Q,K,Aは文字なので数字に置き換える必要がある。

 11,2,3,4,5,6,7,8,9,10,10,10,10となる。

 ・Aは1にも11にもなるので、合計が21になるようであればAは11に、

  22以上になるのならAは1に変化する。

3・21に近づけるためにカードをもらうか、そのまま対決するか決める。

 ・カードをもらって22以上になったらバースト、負け。

4・対決になるとディーラーもカードを追加して勝負する。

5・21に近い方が勝ち。2人ともブラックジャックならドロー。

6・1の質問で続けるか決める。

 

 

こんな感じ。

ではプログラミングしていく。

 

1・まずゲームをしますか?という質問。はいならゲーム開始。いいえならbreak。

 

input("ブラックジャックしますか? Type 'y' or 'n': ") == "y":

 

はいを選んだら、カードを配る。


2・ゲーム開始でカードがランダムでプレイヤーに配られる。

カードを配るのはプレイヤーとディーラー2人に同じことをするので、

ファンクション化した方が楽そう。

調べたところrandom.sampleだと複数配れるみたいだけど、

カードがいる時は1まいずつなので1枚ずつで。

カードはAは最初は11からスタートで、21を超えたら1になると。

 

import random
def deal_card():
cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
card = random.choice(cards)
return card

 

ランダムにもらったカードをreturnする。

 

ついでに現在のカード合計がどれくらいかを計算する機能も書く。

 

def calculate_score(cards):
if sum(cards) == 21 and len(cards) == 2:
return 0
if 11 in cards and sum(cards) > 21:
cards.remove(11)
cards.append(1)
return sum(cards)

カードが最初の2枚でBJだった場合は0を返す。

もしくは

 ・Aは1にも11にもなるので、合計が21になるようであればAは11に、

  22以上になるのならAは1に変化する。

この部分をremove(11)  とappend(1)

でクリアしてから、合計を返す。

0を返す場合は後々の勝負の時に使う。

 

 

ゲーム全体もファンクション化する。

プレイヤーのカード・ディーラーのカードを空リストで定義して、

最初に2枚配るのはfor文で繰り返す。

 

 

def play_game(): 

user_cards = []
computer_cards = []
is_game_over = False

for _ in range(2):  
user_cards.append(deal_card())
computer_cards.append(deal_card())

while not is_game_over:
user_score = calculate_score(user_cards)
computer_score = calculate_score(computer_cards)
print(f" あなたのカード: {user_cards}, 現在のスコア: {user_score}")
print(f" ディーラーの1枚目: {computer_cards[0]}")

 

・ディーラーには1枚配られて見えるようになる。

 

これらは21にを目指すまでカードを配るかやめるかなので

繰り返しのwhileで囲う。

 


if user_score == 0 or computer_score == 0 or user_score > 21:
is_game_over = True
else:
user_should_deal = input("カードをもらう? y /n: ")
if user_should_deal == "y":
user_cards.append(deal_card())
else:
is_game_over = True

 

プレイヤーのターンが終わったら、次はディーラーのターン。

こちらもwhileで21を目指すまでカードをくばる。

ギリギリ21だとディーラーも負けやすくなるので、18以上にいったらカードをとめる。

 

while computer_score != 0 and computer_score < 17:
computer_cards.append(deal_card())
computer_score = calculate_score(computer_cards)

 

最後に現在のプレイヤーのスコアとディーラーのスコアを計算して、

比較して勝負。

 


print(f" 手持ちのカードは: {user_cards}, 現在のスコアは: {user_score}")
print(f" ディーラーのカードは: {computer_cards}, ディーラーのスコアは: {computer_score}")
print(compare(user_score, computer_score))

 

最後のcompare()部分はまだファンクションかしていないので、

書き終えたあとにdef game()の上で書く。

 

def compare(user_score, computer_score):
if user_score > 21 and computer_score > 21:
return "バースト!負け 😤"


if user_score == computer_score:
return "引き分け🙃"
elif computer_score == 0:
return "ディーラーがブラックジャック!負け 😱"
elif user_score == 0:
return "ブラックジャック!勝ち 😎"
elif user_score > 21:
return "バースト!負け 😭"
elif computer_score > 21:
return "ディーラーがバースト!勝ち 😁"
elif user_score > computer_score:
return "勝ち! 😃"
else:
return "負け 😤"

 

 

6・1の質問で続けるか決める。

1と6を同時にするということでwhileを先につけて解決。

clear()はこの前も作ったimport osでファンクションを作る。

 

while input("ブラックジャックしますか? Type 'y' or 'n': ") == "y":
clear()
play_game()

 

これでおしまい。

結構コード量多めだったな。。。

 

プログラムもそうだけどやっぱりゲームの勝負の条件とか

動作の条件とかをしっかり設計してからプログラムにとりかからないと

あとで大変な目にあうなあと思う。

 

 

DAY 10 function の returnを覚えて簡易計算機をプログラミングする!

今回は、今まで学んできたfunction()の新しい出力方法 returnを学んで、

計算機を作る授業。

 

今まではfunctionの使い方は

def dothis():

    do something()

    do something()

    something = do somethings()

    print(something)

 

みたいな感じで何か複数の行動をまとめたり、

その結果を出力するものとして学んできたけれども

returnを使うと、defの中だけで終わっていたデータを

他のものにも流用ができるようになる。

 

今回の計算機でいうと、

def add(n1, n2):

    return n1 + n2

 

 というfunctionをつくると、

add(3,4)

add(5,9)

とか流用もできるし、

 

def subtract(n1, n2):

     return n1 - n2

 

これは引き算のfunctionをつくったのだけど

n1 = 5

n2 = 2

n3 = 1

print(subtract(n1, add(n2,n3)))

みたいなこともできる。

 

もちろん数字だけじゃなくて文字や変数でも使える。

 

 

returnの練習として計算機を作る。

 

簡易計算機の流れとしては、

1・最初の数字を入力してもらう。

2・足す・引く・かける・割るのどれを使うか選択する。

  ・上記の4つ以外をタイプした場合はクリアしてやり直す。

3・次の数字を入力してもらう。

4・計算結果をプリントする。

5・計算を続けるかを確認する。

  ・続けない場合はクリアしてやりなおす。

6・続ける場合は計算結果からさらに計算を続ける。

 

こんな感じ。

 

 

まずは4つの計算方法を先程の足す引くのように入力する。

 

def add(n1, n2):
return n1 + n2

def subtract(n1, n2):
return n1 - n2

def multiply(n1, n2):
return n1 * n2

def divide(n1, n2):
return n1 / n2

 

1・最初の数字を入力してもらう。

これは簡単ですね。

num1 = float(input("What's the first number? : "))

 

2・足す・引く・かける・割るのどれを使うか選択する。

  ・上記の4つ以外をタイプした場合はクリアしてやり直す。

これは前回使った辞書型のリストを使ってkeyだけを呼び出すといい。

なぜリスト型かというと、inputでそれぞれの計算を入力すると、

それぞれのfunctionが動くようにしているから。

+ を答えると、add(n1, n2)が動く。

 

operations = {
"+" : add,
"-" : subtract,
"*" : multiply,
"/" : divide
}
for operation in operations:
print(operation)

 

・上記の4つ以外をタイプした場合はクリアしてやり直す。

これも簡単でifを使う。

if select == "+" or  select == "-" or select == "*" or select == "/":

続きはここからインデントして全部かいていく。

クリアしてやり直す部分は、あとで。

 

 

3・次の数字を入力してもらう。

これも普通にinputで。

num2 = float(input("What's the next number?"))

 

4・計算結果をプリントする。

ここで、入力してもらった計算方法をリスト表記で入力することで、

リスト型の表記なんだけど計算ができるようになる。

result = operations[select](num1, num2)

記述的にわかりづらい場合は一旦変数にした方がいいのかもしれない。

calc_func = operation[select]
result = calc_func(num1, num2)

 

で、結果がわかったので計算方法と一緒に出力する。

print(f"{num1} {select} {num2} = {result}")

 

5・計算を続けるかを確認する。

  ・続けない場合はクリアしてやりなおす。

これもinputで聞いて、ifで分岐させる。

continue_calc = input(f"Type 'y' to continue calculating with {result}, or type 'n' to start a new calculation: ").lower()

6・続ける場合は計算結果からさらに計算を続ける。

if continue_calc == "y":
num1 = result
elif continue_calc == "n":
end_calc = False
clear()
calc()

 

終わらない限り続ける、というのは whileを使うといいので、

計算方法を聞くところから最後までをwhileでくくっちゃう。

終わらせるための変数も end_calcというのを作っておく。

 

end_calc = True
while end_calc:
select = input("Pick an operation: (+ - * /) : ")
if select == "+" or select == "-" or select == "*" or select == "/":
num2 = float(input("What's the next number?"))
result = operations[select](num1, num2)
print(f"{num1} {select} {num2} = {result}")
continue_calc = input(f"Type 'y' to continue calculating with {result}, or type 'n' to start a new calculation: ").lower()

if continue_calc == "y":
num1 = result
elif continue_calc == "n":
end_calc = False
clear()
calc()
else:
clear()
print("wrong type. clear")
calc()

 

クリアして計算を始める、というのが触れていなかったけど

表記としては

clear()

calc()

というのが出ている。

 

今までの流れだと繰り返しができないので、

計算機そのものをcalc()として囲うのと、

clear()というのでコンソールを消去する機能がいる。

clear()の機能はosというのをインポートして、

自作でコンソールクリアというのを作らなければいけない。

 

もちろん自分で作れるレベルではないので、

ググってコピペ。

だいたいわからないことは先人が残してくれている。w

 

先頭に追加して、

import os

def clear():
command = 'clear'
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
command = 'cls'
os.system(command)

 

最初の数字を聞くところから最後までをdef calc():で囲っちゃう。

 

最終的なソースはこれ。

PyCharm便利。。。(これもAngela Yu先生が教えてくれた、無料。)

 

import os

def clear():
command = 'clear'
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
command = 'cls'
os.system(command)

def add(n1, n2):
return n1 + n2

def subtract(n1, n2):
return n1 - n2

def multiply(n1, n2):
return n1 * n2

def divide(n1, n2):
return n1 / n2


operations = {
"+" : add,
"-" : subtract,
"*" : multiply,
"/" : divide
}

def calc():
num1 = float(input("What's the first number? : "))

for operation in operations:
print(operation)

end_calc = True
while end_calc:
select = input("Pick an operation: (+ - * /) : ")
if select == "+" or select == "-" or select == "*" or select == "/":
num2 = float(input("What's the next number?"))
result = operations[select](num1, num2)
print(f"{num1} {select} {num2} = {result}")
continue_calc = input(f"Type 'y' to continue calculating with {result}, or type 'n' to start a new calculation: ").lower()

if continue_calc == "y":
num1 = result
elif continue_calc == "n":
end_calc = False
clear()
calc()
else:
clear()
print("wrong type. clear")
calc()

calc()

 

 

returnの使い方や、functionの()の中の変数の使い方とかを学びましたとさ。

 

DAY:9 辞書型リストを使って簡易シークレットオークションをプログラムする!

今回は辞書型リストを学んでシークレットオークションを作ってみます。

UdemyのAngela Yu先生のコースは毎回何かを作りながら学ぶので

面白いし作ったもので遊べるのがとてもいい。

 

さて辞書型リストについて。

 

今まで習ったリストは[0, 1, 2, [3,4]]などの1つ、または複数に入れ子にした変数を入れられるものだけだったけど、

辞書型のリストというのもある。書き方は

jisho = { "sensei" : "Angela Yu", "student" : me }

 

こんな感じ。

例えばAngela Yuのデータを取得したい場合は

name = jisho["sensei"]

print(name)

 

これで出せる。

 

このリストに新しいデータを追加したい場合は、

jisho["new_student"] = "you"

で追加ができる。

 

 

今回作るシークレットオークションについて説明すると、

ヤフオクとかだと最初は1円で、そこからいろんな人が値段を買値を上げていって、

一番高い値段を見て自分が値段を上げるか諦めるかわかる。

最終的に一番高い人が購入できるというものだけど

 

シークレットの場合はそうじゃなくて、

それぞれに参加したい人と値段を司会の人が聞いて、

一番高く値段を出した人だけがみんなに知らされる感じ。

他の人の値段とかはまったくわからない。

 

そういうもの。流れでいうと

・参加者の名前と、買値を聞いて、リストに登録する。

・他にも参加者がいるか聞く。

・いれば参加者の名前と買値を聞いてリストに追加する。

・いなければそのリストの中から1番高い人を知らせる。

 

こんな感じ。

 

pythonでプログラムすると、

まずオークションリストを作る。

auction_list = {}

 

参加者の名前と、買値を聞いて、このリストに登録する。

これはfunction化してみる。

def new_bid():
name = input("What's your name? : ")
price = input("How much will you bid? : $")
auction_list[name] = int(price)

 

ソースコピペしたらこんなんなった!今回からこれでいこう

 

で、参加者がいなくなるまで続ける。

whileを使うとよさそう。

is_finished = False
while not is_finished:
new_bid()
finish_q = input("Will you finish? Y/N").lower()
if finish_q == "y":
is_finished = True

 

参加者がいなくなったら、最後にどの人が勝ちかを判定する。

これもファンクション化して、最初に買った人の値段と名前を定義してから、

for文でオークションリストのデータを登録された分を見ていく。

前の人より金額が多かったらその人が勝ち、

勝ちの人より次の人の金額が多かったら勝ちが入れ替わる。

そんな流れで、終わったら「あなたが勝ち!金額は●●です!おめでとう!」

というような発表をする、という流れ。

 

def winner_is():
winner_price = 0
winner = ""
for bidder in auction_list:
bid_price = auction_list[bidder]
if winner_price < bid_price:
winner_price = bid_price
winner = bidder
print(f"The winner is {winner} and price is ${winner_price}! Congratulation!")

winner_is()

 

DAY9も始めたときは辞書型リストむずかし!と思ったけど

復習して説明を記事にすると思ったよりすんなり最初から書けて

ちょっとは成長しているんだなと実感。