くーぱぱのエンジニア作業ログ

一児の父で、エンジニアの、日々の作業記録です

STEP2-0 Pythonista3でオセロ

ベータ版のお披露目

まだまだブラッシュアップする場所はありますが、とりあえずお披露目です。

何人か身近な人にも見ていただいて、「こっちのがわかりやすい!」などの意見をいただき、若干のUI改善をおこなってます。

ではでは、STEP2では、2Dゲームなどの作成に利用できる「scene」というライブラリの紹介をしながら、実際にどのように調べたり、デバッグしたりして開発していったのか、を解説したいと思います。

目次

※記事作成後にリンクをアップデートします。 ※目次は作成した記事の長さに応じて、適宜調整します。

  • STEP2-1 雛形作成〜画面に画像を表示

  • STEP2-2 オセロの盤面を表示させる

  • STEP2-3 触った盤面を特定する

  • STEP2-4 石を置いてみる

  • STEP2-5 ゲームのロジックを組む

  • STEP2-6 ブラッシュアップ アニメーションの追加...etc

  • STEP2-7 総括

まだまだライブラリを使いこなしたとは言えませんが、へー、と驚かれるレベルにはなったのかなと。

ステップ数的には200行程度です。

AI的な感じで、戦えば戦うほど強くなるCPUが作れないかなぁ、と画策中です。※副業はどこいった!笑

以上、くーぱぱでした。

STEP1-6 演習7 解説 part3

初心者が躓きそうなところ

下記記事で紹介した演習サイトは非常に良いです。

STEP1-2 pythonの構文を調べる - くーぱぱのエンジニア作業ログ

ただし学生さん以外は答えを知りません。

あってるか確認する方法も、解決するためのサンプルコードもないため、挫折したときに手の打ちようがないですね。

ということで、躓きそうなこの章は、解説しながら解いていきたいと思います。

演習7-3

問:

import sys

fh = open(sys.argv[1],'r')
line = fh.readline()
i = 1
while line:
    print(i, ' : ', line.strip())
    line = fh.readline()
    i = i + 1
fh.close

解説

といっても、この問題自体は今までの問題と比べると解説することは特にありません。

じゃあ何を解説するの?というところですが、それはPythonistaでの引数実行です。

一応このシリーズの読者の想定は、PythonistaでPythonを勉強し始めた人を想定しています。

今までは、ただ作ったpythonコードを実行すれば解決してましたが、ここでは引数でパラメータを受け取ることを前提にしています。

Pythonistaでは、どのようにして、引数をわたして実行することができるのか、紹介した記事がこちらです。

Pythonista3のアレコレ(引数実行) - くーぱぱのエンジニア作業ログ

要するに、右上のレンチマークからRun optionsを実行することで、引数が渡せますよ、という話ですね。

これわからないと、プログラムが悪いのか、やり方が悪いのか判別つかないかな、と思ったので、解説しました。

その他

使い方、演習問題など、わからない点等あれば、ご質問ください。

とりあえずこんなところでSTEP1は終了です。

続いてSTEP2です。

時系列的には既にある程度完成していますが、完成に至るまでの試行錯誤や問題点、工夫した点など、ソースを交えながら解説していきたいと思います。

以上、くーぱぱでした。

STEP1-5 演習7 解説 part2

初心者が躓きそうなところ

下記記事で紹介した演習サイトは非常に良いです。

STEP1-2 pythonの構文を調べる - くーぱぱのエンジニア作業ログ

ただし学生さん以外は答えを知りません。

あってるか確認する方法も、解決するためのサンプルコードもないため、挫折したときに手の打ちようがないですね。

ということで、躓きそうなこの章は、解説しながら解いていきたいと思います。

演習7-2

問:

def fibonacci(n):
    if n == 0 :
        return 1
    elif n == 1 :
        return 1
    else :
        return fibonacci(n - 1) + fibonacci(n - 2)

n = int(input('please input real num n ='))
print(fibonacci(n))

解説

再帰関数については、こちらの記事で解説しています。 STEP1-4 演習7 解説 part1 - くーぱぱのエンジニア作業ログ

ここでも同様に問題を読み替えてみましょう。

n番目の数字は、n - 1番目の数字と、n - 2番目の数字を足した値だ!

プログラムチックに読み替えるとこんな感じですね。

fibonacci(n) = fibonacci(n - 1) + fibonacci(n - 2)

終了条件は、下記のとおりですね。

nが1のときは1だ!
nが0のときも1だ!

ということで、フィボナッチ数列の関数は出来上がりです。

終了条件は1つとは限りません。

あくまで、自分自身を呼び出さない条件と解釈すると、スムーズに理解できると思います。たぶん。

また、フィボナッチ数列の問題を再帰関数を使わずに解くとこのようになります。

def fibonacci(n):
    num1 = 1
    num2 = 1
    res = 1
    
    for i in range(0, n - 2):
        #フィボナッチ数列の計算
        res = num1 + num2
        #次の計算では、num1は現在のnum2になる
        num1 = num2
        #次の計算では、num2は現在のresになる
        num2 = res
    return res
            
n = int(input('please input real num n ='))
print(fibonacci(n))

実装できますが、ロジックの正しさが直感的には理解しづらいですね。

なんで次の計算のことを今考えないといけないの?!ってなっちゃいます。

こういったロジックのややこしさが、不具合の原因になりやすいです。

関数や、オブジェクト指向などの手法は、一つ一つの役割を小さく簡単なものに細分化することで、解決すべき問題をわかりやすいものに落とし込むことにあると思います。

もし、現在取り組んでいる問題が複雑だな、と感じることがあれば、本当に細分化ができているのか?を見つめ直してもいいかもしれませんね。

以上、くーぱぱでした。

STEP1-4 演習7 解説 part1

初心者が躓きそうなところ

下記記事で紹介した演習サイトは非常に良いです。

STEP1-2 pythonの構文を調べる - くーぱぱのエンジニア作業ログ

ただし学生さん以外は答えを知りません。

あってるか確認する方法も、解決するためのサンプルコードもないため、挫折したときに手の打ちようがないですね。

ということで、躓きそうなこの章は、解説しながら解いていきたいと思います。

演習7-1

問:

解1:

def power(x, n):
    return x ** n

x = float(input('please input x = '))
n = int(input('please input real num n = '))

print(power(x, n))

解説①

こちらは、非常に簡単ですね。

Pythonでは、標準で冪乗の演算が可能です。

なので、以下の手順で計算しているだけになります。

1.入力を受付け、xとnを取得する

x = float(input('please input x = '))
n = int(input('please input real num n = '))

2.関数に受け取ったパラメータを渡す

print(power(x, n)) 

3.関数では、冪乗演算の結果を返却する

def power(x, n):
    return x ** n

ただしこれは、問題の解答ではありますが、出題者の意図に沿った解ではないですね。

この程度であれば、関数化させる必要性がないので。

次は、この演習問題に到達するまでに得た知識をもとに、関数化に取り組んでみます。

解2:

def power(x, n):
    sum = 1
    for i in range(0, n):
        sum *= x
    return sum

x = float(input('please input x = '))
n = int(input('please input real num n = '))

print(power(x, n))

解説②

for文を使った解法ですね。

問題をプログラム的に読み替えると、

n回xを掛け算しろ

と、読み替えられます。

なので、n回のループ処理を行い、xを掛け合わせる処理を実現しました。

似たような処理は、while文でも実現できますね。

解3:

おそらく次の問題も加味すると、この解法が出題者の意図と思われます。

def power(x, n):
    if n == 0:
        return 1
    else:
        return power(x, n - 1) * x

x = float(input('please input x = '))
n = int(input('please input real num n = '))

print(power(x, n))

解説③

ポイントは問題を以下のように読み替えることです。

xのn乗は、xのn - 1乗にxを掛け算した答えだ!

数学的には当たり前の話ですね。

先程読み替えた文章を、よりプログラムチックに書くとこうなります。

power(x, n) = power(x, n - 1) * x

お気づきかと思いますが、power関数内で、再度power関数を呼び出していますね。

このように、自分自身の関数を、関数の処理内で呼び出す関数を、再帰関数と言います。

こうすることで、ややこしい(?)ループ処理などを実装することなく、解を得ることができます。

参考:再帰関数を学ぶと、どんな世界が広がるか - Qiita

再帰関数を理解するための最もシンプルな例 - Qiita

https://wa3.i-3-i.info/word14899.html

慣れるとどーってことはないんですが、慣れるまでは理解に苦しみます。

要点としては、

  1. 終了条件を定義する

  2. 終了条件に収束するように自分自身を呼び出す

というイメージです。

自分自身を呼び出すので、何度も何度も呼び出されますよね?

終わりに向かわなければ、無限に処理し続けてしまいます。(いわゆる無限ループ)

なので、自分自身を呼び出さない条件(=終了条件)を定義し、そこに向かって収束するように自分自身を呼び出すように作ります。

実際の実装にコメントを入れて補足します。

def power(x, n):
    if n == 0: #ここが終了条件
        return 1
    else:
        # nが0(終了条件)に収束する様に、
        # 自分自身を再度呼び出す
        return power(x, n - 1) * x

再帰関数自体は、慣れないうちは処理も追いづらいしメリットも少ないと感じるかもしれません。

実際にシステム開発のなかで、多用する機会はあまりない気がします。

ですが、このあとのフィボナッチ数列の問題や、よくあるのはハノイの塔なども再帰関数で、非常にシンプルなコードで処理できます。

シンプルなコードは不具合が少なくなり、また、メンテナンス性や可読性を引き上げます。

こんな使い方もできるんだな、この方が他の人が読んだときにもわかりやすいな、などと考えられるようになるためにも、マスターしておくと良いかなと思います。

以上、くーぱぱでした。

Pythonista3のアレコレ(引数実行)

引数付きの実行手順

Pythonでは、下記のようにコマンドラインから引数を渡してモジュールを実行できます。

python  hoge.py param1

モジュールでパラメータを受け取るときはこんな感じですね。

import sys

print(sys.argv[1])

Pythonista3で上記のように実装し、実行しても、エラーとなります。 そうですね、引数を渡していないから当然です。

では、どうやって実行するのか、ですが、以下の手順で実行できます。

1.右上のレンチマークを選択します

2.Run Options...を選択します

3.パラメータを入力してRunを選択します

わかる人や慣れてる人なら気付けますが、不慣れな人だと気づきづらいですね。

利用用途は少ないかもしれませんが、参考までにどうぞ。

以上、くーぱぱでした。

STEP1-3 実際にPythonコードを組んでみる

そのままPythonista3でコードを書く

フォルダ管理やファイルの命名規則は、整理するにあたり非常に重要です。

ということで、まずはフォルダを作成します。

 

フォルダの作成

f:id:qoooopapa:20191023121516p:image

左下の「+」ボタンを押します。

f:id:qoooopapa:20191023121601p:image

上から2つ目の「new folder」を選択します。

f:id:qoooopapa:20191023121747p:image

フォルダ名を入力できるので入力します。

ここでは「LESSON」と入力しました。

そのまま右上の「Create」を選択します。

「This iPhone」を選択すると、フォルダ作成できていることが確認できます。

f:id:qoooopapa:20191023124819p:image

 

ファイルの作成

f:id:qoooopapa:20191023124839p:image

フォルダ作成同様、左下の「+」ボタンを押します。

f:id:qoooopapa:20191023124946p:image 

次は、1番上の「Empty Script」を選択します。

 

f:id:qoooopapa:20191023125140p:image

ファイル名と保存するフォルダを指定して「Create」を選択します。

ここでは、ファイル名を「lesson1-1」としました。

 

f:id:qoooopapa:20191023133836p:image

ファイルが作成されて、コードが書けるようになります。

 

コーディングする

STEP1-2で紹介した演習サイトを利用して、コーディングしていきます。

STEP1-2 pythonの構文を調べる - くーぱぱのエンジニア作業ログ

https://www.isc.meiji.ac.jp/~mizutani/python/print/drills.pdf

 

実際にコーディングしてみます。

f:id:qoooopapa:20191023150107p:image

 

右上の再生ボタンで実行します。

f:id:qoooopapa:20191023150148p:image

 

こんな感じで黙々と演習やっていきます。

 

以上、くーぱぱでした。

 

 

Pythonista3のアレコレ(タブ表示)

タブ機能

PythonistaをiPhoneで開くとこんな画面出てきます。

f:id:qoooopapa:20191016032032p:image

あるソースAを改修するために、ソースBをみながら修正する、なんてことはよくあります。

 

  • 面倒な表示例

1.ソースAを開く

f:id:qoooopapa:20191016080206p:image

 

2.左から右へスワイプし、参考にしたいソースを探す

f:id:qoooopapa:20191016080522p:image

 

3.ソースBを開く

f:id:qoooopapa:20191016080537p:image

 

4.2.の手順で再度ソースAを開き直す

f:id:qoooopapa:20191016080206p:image

 

うん、手間ですね。

何度も行ったり来たりしようと思ったら、この手順では生産性が低いです。

 

  • タブ機能を使う

かなり簡単です。

1.右上の、箱の中に入ったプラスマークのボタン(赤丸のボタン)を押します。

 すると、下記のように「New File...」「Open Recent...」といったウィンドウが表示されます。

 よくみてみると、黄色でマークした場所が、タブ表示になっていますね。

f:id:qoooopapa:20191016081352j:image

 

2.左から右にスワイプし、参考にしたいソースを開く

 

f:id:qoooopapa:20191016081655j:image

こんな感じで黄色枠・緑枠でタブ表示されます。

 

3つ、4つ、と増やしていって、スワイプすることでスライドして確認することもできます。

 

是非試してみてください。

 

 

以上、くーぱぱでした。