見出し画像

6歳の息子にPythonでプログラミングを教えはじめてみた話 2. 足し算・引き算ゲーム

前回はPythonのREPL機能を使って、足し算や引き算、繰り返しによる掛け算の再現などをデモしたお話をしました。その続きとして足し算ゲーム・引き算ゲームを作ったお話を紹介します。

まずは作って遊ばせてみました

import random
def たしざんゲーム():
	たされる数 = random.randint(10, 99)
	たす数 = random.randint(10, 99)
	while True:
		print( str(たされる数) + " + " + str(たす数) + " = ?")
		こたえ=int(input())
		if( こたえ == たされる数 + たす数 ):
			print("あたり!")
			break
		else:
			print("はずれ")

こんな感じのコードを書いてみました。ファイルから読み込むのではなく、その場でタイプして、プログラミングする姿を見せるようにしてみました。

画像1

コードの中身の説明は、わりと聞き流されました(笑)

「いんぽーと らんだむ というのはでたらめな数、乱数を使うためのものだよ。英語ではランダムって言うんだよ。雨宮ラムダは、このランダムをもじったものなんじゃないかな?」とヒプノシスマイクを引き合いにだしてみました。
「random.randint(10,99)ってかいてあげると、10〜99までのでたらめな数を一つ作ってくれるんだよ。これを2回やって、たす数とたされる数を作ったよ」
「その次は繰り返しをさせてるよ。さっきは for で繰り返したけど、今度は ほわいる という繰り返し命令を使っているよ。ほわいる とるぅー ってやると、その下をずーっと繰り返してくれるんだよ」
「繰り返しの中では、問題文を表示して(ここではprint()の中には立ち入りませんでした)、こたえ に息子くんから数字をうけとって(input()命令も説明しませんでした)、こたえ合わせをするようにしてるよ」

と、こんな具合に、だいぶざっくりと大きな流れを説明してみました。息子くんはわりと聞き流してました(笑)

答え合わせをif文で

「=(イコール)を2つ重ねると、同じ数かどうか調べてくれるよ」
「もしも、キーボードから受け取った答えと、パソコンが足し算した数が同じときには、あたりと表示してから、繰り返しをやめるようにしてるよ」
「もしも外れちゃった場合には、また答えを受け付ける表示をするところから繰り返すよ」

たぶん分かってもらえなかったと思います(笑)

カーソルキーの↑で前の入力を表示

カーソルキーの↑で入力を遡れるのは、GNUの標準的なキーバインディングです。息子くんにもこれを教えてあげました。すると、↑を押して足し算ゲームをして、当たったらまた↑を押して・・・というのを繰り返しはじめました。(実際にはキーボードから入力した足し算の答えもヒストリに含まれちゃうので、↑↑ですね)息子くんは今算数にハマっていて、足し算の問題を解くのをとても楽しみにしているのです。

関数呼び出しを無限ループ

というわけで↑↑を押し続けるのも面倒なので、「ずっとたしざんゲーム」を作りました。

def ずっとたしざんゲーム():
	while True:
		たしざんゲーム()

画像2

Ctrl-Cで終わることを教えてあげたら、息子くんは夢中になって足し算を楽しんでました。

引き算ゲームはmin(), max()を組み合わせて負の数が出現しないように

さて息子くんが足し算に夢中になっている間に引き算ゲームも作ってみました。特別難しいことは何もありませんけれど、答えが負の数にならないようにすることだけ気をつけました。

import random
def ひきざんゲーム():
	ひとつめの数 = random.randint(10,99)
	ふたつめの数 = random.randint(10,99)
	ひかれる数 = max(ひとつめの数, ふたつめの数)
	ひく数 = min(ひとつめの数, ふたつめの数)
	while True:
		print( str(ひかれる数) + " - " + str(ひく数) + " = ?")
		こたえ = int(input())
		if( こたえ == ひかれる数 - ひく数):
			print("あたり!")
			break
		else:
			print("はずれ")

def ずっとひきざんゲーム():
	while True:
		ひきざんゲーム()

画像3

このあたりからコードの説明はせずに、息子くんは算数モードに入ってしまいましたので、引き算ゲームを遊び始めました。さすがに繰り下がりのある引き算を暗算できるまでには上達していないので、紙のノートに問題を書き写して筆算を繰り返していました。

変数を増やさずに2つの数をひっくり返すには?

ここはプログラマー向けの小ネタです。プログラミング教育にだけご興味のある方は読み飛ばしてください。今でこそメモリが潤沢にありますけれど、昔はメモリを節約したコーディングが必要とされることがありました。(今でも組み込み系の世界では意識されていることだろうとは思いますけれど)

ここでは引かれる数と引く数を作るのに、安直にmin(), max()を使って新たな変数を作っていますが、変数を増やすことができない場合、どうしましょう?

これはその値が整数であるときだけ使える技なのですけれど、排他的論理和( eXclusive OR)を使うことで変数を増やさずに値を交換することができます。

画像4

XORの性質ってとっても面白いと思っています。どこかで息子くんに半加算器のデジタル回路を見せてあげたいなぁとも思っています。

とりあえず楽しんでくれているからいいか

結局自分から興味をもたないと、なかなか覚えるまでには至らないと思うのです。なので根気よく、プログラミングを使った数遊びをいろいろ見せていこうと思っています。

以下投げ銭です。本文はありません。

ここから先は

0字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?